当前位置: 首页 > 面试题库 >

将图像转换为字节数组,反之亦然

微生智刚
2023-03-14
问题内容

我正在尝试通过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]

问题答案:

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

java.io.FileOutputStream@761eec35

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

在Android方面(摘要):

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);

在服务器端(摘要):

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();
}


 类似资料:
  • 问题内容: 我发现了将文件转换为字节数组并将字节数组写入存储中文件的多种方法。 我想要的是转换为字节数组,然后将字节数组转换回。 我不想像以下那样将其写出到存储中: 我想以某种方式执行以下操作: 问题答案: 我认为您误解了班级的真正含义。它只是系统上文件的表示,即文件名,路径等。 您甚至看过该课程的Javadoc 吗?在这里看看, 如果检查它具有的字段或方法或构造函数参数,您会立即得到暗示,它只是

  • 问题内容: 我必须在Android中将字节数组转换为字符串,但是我的字节数组包含负值。 如果我再次将该字符串转换为字节数组,则得到的值与原始字节数组值不同。 我该怎么做才能正确转换?我用于执行转换的代码如下: 我陷入了这个问题。 问题答案: 你的字节数组必须具有某种编码。如果你使用负值,则编码不能为ASCII。一旦弄清楚了,就可以使用以下方法将一组字节转换为字符串: 你可以使用许多编码,请查看Su

  • 问题内容: 我想将一些数据存储到Java中的字节数组中。基本上只是数字,每个数字最多占用2个字节。 我想知道如何将整数转换为2字节长的字节数组,反之亦然。我发现有很多解决方案在使用Google搜索,但是大多数解决方案没有解释代码中会发生什么。我真的不了解很多变化的东西,所以我希望能得到一个基本的解释。 问题答案: 将带符号的字节打包为一个int时,每个字节都需要屏蔽掉,因为由于算术提升规则(在JL

  • 问题内容: 我正在尝试将a 转换为原始类型,反之亦然: 奇怪的是,当我尝试将新分配的分配回a时,结果不过是垃圾。 但是,当我使用原始数据类型作为参数时,似乎相同的算法工作得很好。 问题答案: 改用这些。

  • 问题内容: 我正在寻找一种将NumPy数组传递给Matlab的方法。 我已经设法通过使用将数组存储到图像中,然后使用加载它来做到这一点,但这当然会使矩阵包含0到256之间的值,而不是“真实”值。 将这个矩阵的乘积除以256,再加上原始NumPy数组中的最大值,可以得出正确的矩阵,但是我觉得这有点乏味。 有没有更简单的方法? 问题答案: 当然,只要使用 举个例子: 同样,有。 然后,您使用将其加载到

  • 问题内容: 我正在尝试将short转换为2个字节…然后从这2个字节尝试获取相同的short值。为此,我编写了以下代码: 对于700(oldshort)的值,newhosrt为444。经过一些测试,它看起来像\ t。此代码仅适用于某些值。就像…如果oldshort = 50,那么它将正常工作..但是,如果它是-200或大于127(我认为)的值,它将不起作用。我想带符号的字节,二进制补码值等等都有问题