【问题标题】:Convert image to byte array and viceversa将图像转换为字节数组,反之亦然
【发布时间】:2013-03-26 04:04:12
【问题描述】:

我正在尝试通过 android 将图像作为字节数组发送,然后在服务器端将其转换回 png 文件,我在服务器端收到 IllegalArgumentException

这是我的 android 代码,它将图像转换为字节数组并将其作为请求发送到服务器:

 GestureOverlayView gestureView = (GestureOverlayView) findViewById(R.id.signaturePad);

            Bitmap bm = Bitmap.createBitmap(gestureView.getGesture().toBitmap(100, 100, 8, Color.WHITE));

            FileOutputStream fos = openFileOutput("signature.png", Context.MODE_PRIVATE);
            bm.compress(Bitmap.CompressFormat.PNG, 100, fos);

            byte[] image_byte = fos.toString().getBytes();//Base64.encode(fos.toString().getBytes(), 0);

            String strImage = image_byte.toString();

这是我的服务器端程序:

String imageString = request.getParameter("SignatureImage");
    byte[] imageByte = imageString.getBytes();
    try {
        InputStream in = new ByteArrayInputStream(imageByte);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        //Getting exception at this line
        ImageIO.write(bImageFromConvert, "png", new File(
                "E:/signature/signature.png"));
        /*BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(imageByte));
        ImageIO.write(bufferedImage, "jpg", new File("E:/signature/signature.jpg"));*/
    } catch (IOException e) {
        e.printStackTrace();
    }

服务器上的异常是:

12:39:40,990 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/APDTest].[ImageRetrieve]] Servlet.service() for servlet ImageRetrieve threw exception: java.lang.IllegalArgumentException: im == null!
    at javax.imageio.ImageIO.write(ImageIO.java:1457) [:1.6.0_32]
    at javax.imageio.ImageIO.write(ImageIO.java:1521) [:1.6.0_32]
    at com.apd.test.ImageRetrieve.doPost(ImageRetrieve.java:52) [:]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:6.1.0.Final]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:6.1.0.Final]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:6.1.0.Final]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [:6.1.0.Final]
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0.Final]
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.event(CatalinaContext.java:285) [:1.1.0.Final]
    at org.jboss.modcluster.catalina.CatalinaContext$RequestListenerValve.invoke(CatalinaContext.java:261) [:1.1.0.Final]
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0.Final]
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0.Final]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:159) [:6.1.0.Final]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:6.1.0.Final]
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0.Final]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:6.1.0.Final]
    at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0.Final]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:6.1.0.Final]
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:6.1.0.Final]
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:6.1.0.Final]
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:6.1.0.Final]

【问题讨论】:

    标签: java android


    【解决方案1】:

    试试这个代码。

    将图像转换为字节:对于reference

                      yourSelectedImage = BitmapFactory.decodeFile(galleryFilePath);     
                  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
                  yourSelectedImage.compress(Bitmap.CompressFormat.PNG, 100, baos); 
                  byte[] b = baos.toByteArray(); 
    

    将字节转换为图像:对于reference

                             final String encodedImage = response.toString();
               byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT);
             decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
    

    希望这能给你一些解决方案。

    【讨论】:

    • 我不是在尝试保存图像并将其加载回来,而是在尝试使用手势覆盖视图来捕获签名并在单击按钮时将其发送到服务器..
    【解决方案2】:

    您将图像写入客户端的文件输出流,它将内容存储到物理文件中。然后,您尝试将FileOutputStreamtoString 表示形式转换为图像内容。这不起作用,该类的 toString 方法不会为您提供写入流的内容,它只会打印一条几乎没有帮助的消息,如下所示:

    java.io.FileOutputStream@761eec35

    我相信您打算使用ByteArrayOutputStream - 这个类确实允许您检索通过其toString 方法写入的实际内容。

    在 Android 端 (sn-p):

    Bitmap bm = Bitmap.createBitmap(gestureView.getGesture().toBitmap(100,
            100, 8, Color.WHITE));
    
    ByteArrayOutputStream baos = new ByteArrayOutputStream(2056);
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    
    byte[] imageBytes = baos.toByteArray();
    String encodedString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
    

    在服务器端(sn-p):

    String imageString = request.getParameter("SignatureImage");
    byte[] decodedBytes = Base64.decode(imageString, Base64.DEFAULT);
    
    try {
        InputStream in = new ByteArrayInputStream(decodedBytes);
        BufferedImage bImageFromConvert = ImageIO.read(in);
    
        ImageIO.write(bImageFromConvert, "png", new File(
                "E:/signature/signature.png"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多