【问题标题】:Convert BufferedImage output from Java to a Bitmap in Android将 Java 中的 BufferedImage 输出转换为 Android 中的位图
【发布时间】:2015-12-28 08:27:57
【问题描述】:

上下文

我相信我已经对这个主题进行了足够多的搜索,但还没有找到答案。如果你们中的任何人有任何答案,请帮忙。

  • 我正在尝试将图像作为输出发送到来自android app 的服务调用。

  • 我使用了BufferedImageImageIOByteArrayOutputStream 将图像转换为Base64 encoded string(来自我可以在stackoverflow 上找到的许多示例)。

  • 这个Base64 encoded string 被安卓应用程序接收。现在,这需要转换回图像并显示在活动上。

  • 仅供参考。我要发送的图像是使用 zxing 库生成的二维码。

问题

这是我苦苦挣扎的地方。我不知道该怎么做。我没有发布任何示例代码,因为服务器端代码很容易解释,而且我还没有服务器端的任何代码。

Android 端的示例代码

    private Bitmap getBitmap() {
        String base64String="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";
        ByteArrayInputStream imageArr=new ByteArrayInputStream(Base64.decode(base64String, Base64.DEFAULT));
        Bitmap bitmap = BitmapFactory.decodeStream(imageArr);
        return bitmap;
    }

【问题讨论】:

  • 那么您对Base64 有什么问题?
  • base64 本身没有问题。问题是将base64编码的BufferedImage转换为android端的图像/位图。
  • 所以BitmapFactory 不起作用?
  • 是的,似乎没有。调用后我得到一个空位图。
  • 那么输入数据是什么?它是一个字节数组吗?是InputStream 吗?您是否尝试保存它并进行十六进制转储?

标签: android image bufferedimage


【解决方案1】:

@haraldK,谢谢你给我正确的指针。我也想知道为什么我没有看到任何填充,但没有足够关注它来理解这个问题。但是,根据您的提示,我终于弄清楚了问题所在。问题是我没有正确关闭 Base64 Encoder 给出的 OutputStream。在我的代码中,我有一个 Base64 编码器流作为 ByteArrayOutputStream 的包装器,如下所示:

 final ByteArrayOutputStream os = new ByteArrayOutputStream();
 String qString = "";
 try {
     MatrixToImageWriter.writeToStream(matrix, formatName, Base64.getEncoder().wrap(os));
     qString = os.toString("UTF-8");
     os.close();

     return qString;
 } catch (final IOException ioe) {
        throw new UncheckedIOException(ioe);
 }

在上面的代码中,我使用 os.close() 关闭了 ByteArrayOutputStream,这不是必需的。但是需要的是关闭 Base64 编码器发出的 OutputStream。我更改了如下代码以使其工作:

    final ByteArrayOutputStream os = new ByteArrayOutputStream();
    OutputStream base64Stream = Base64.getEncoder().wrap(os);
    String qString = "";
    try {
        MatrixToImageWriter.writeToStream(matrix, formatName, base64Stream);
        base64Stream.close();
        qString = os.toString("UTF-8");
        os.close();

        return qString;
    } catch (final IOException ioe) {
        throw new UncheckedIOException(ioe);
    }

经过上述更改后,base64 编码的字符串已正确填充,并在 Android 端正确解码。在 android 端,这是我必须显示图像的代码:

 byte[] imageArr=Base64.decode(base64String.getBytes(), Base64.NO_WRAP);
 Bitmap bitmap=BitmapFactory.decodeByteArray(imageArr, 0, imageArr.length);
 return bitmap;

我不知道如何为您的答案投票,因此我将其创建为单独的答案。感谢您的帮助。

【讨论】:

    【解决方案2】:

    能否请您添加您的图像响应字符串

    当您在 ByteArrayOutputStream 中执行此操作时,您可能会在解码之前错过以下项目

    String imageDataBytes = responseImageData.substring(responseImageData.indexOf(",")+1);
    
    InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));
    
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    

    同样的问题有一个很好的答案here

    【讨论】:

    • 我已经尝试过类似的代码,但似乎没有用。我已经给出了上面带有base64编码图像字符串的示例代码。
    • 使用“InputStream”而不是“ByteArrayInputStream”并将其传递给“BitmapFactory.decodeStream(InputStream is)”,据我所知,它不会接受“ByteArrayInputStream”,我在我的答案中更新了相同的内容还有
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 2012-11-16
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2015-12-19
    • 2012-06-19
    相关资源
    最近更新 更多