将 Java 中的 BufferedImage 输出转换为 Android 中的位图

Convert BufferedImage output from Java to a Bitmap in Android

上下文

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

问题

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

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

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

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

String imageDataBytes = responseImageData.substring(responseImageData.indexOf(",")+1);

InputStream stream = new ByteArrayInputStream(Base64.decode(imageDataBytes.getBytes(), Base64.DEFAULT));

Bitmap bitmap = BitmapFactory.decodeStream(stream);

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

@haraldK,感谢您给我正确的指示。我也想知道为什么我没有看到任何填充,但没有足够关注它来理解这个问题。但是,根据您的提示,我终于弄清楚了这个问题。问题是我没有正确关闭 Base64 编码器给出的 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;

我不知道如何给你的答案投票,所以我创建了这个作为一个单独的答案。感谢您的帮助。