Java BufferedImage为PNG格式Base64字符串

我正在尝试将屏幕截图输出作为base64编码的字符串输出,但距离不是很远。到目前为止,我拥有的代码使用Base64库(http://iharder.sourceforge.net/current/java/base64/):

    Robot robot = new Robot();

Rectangle r = new Rectangle( Toolkit.getDefaultToolkit().getScreenSize() );

BufferedImage bi = robot.createScreenCapture(r);

ByteArrayOutputStream os = new ByteArrayOutputStream();

OutputStream b64 = new Base64.OutputStream(os);

ImageIO.write(bi, "png", os);

ByteArrayOutputStream out = new ByteArrayOutputStream();

out.writeTo(b64);

String result = out.toString("UTF-8");

每次运行此命令时,“结果”始终为空字符串,但我不明白为什么。有任何想法吗?

注意:我不想将png写入磁盘上的文件。

回答:

我遵循xehpuk的回答,但是某些图像在某些浏览器中通过数据url(Chrome和Firefox,Safari似乎可以很好地渲染)时缺少最后几行像素时出现问题。我怀疑这是因为浏览器正在做最好的解释数据,但是数据的最后几个字节丢失了,所以它显示了它可以做什么。

输出流的包装似乎是导致此问题的原因。的文档Base64.wrap(OutputStream os)说明:

建议在使用后立即关闭返回的输出流,在此期间它将所有可能的剩余字节刷新到基础输出流。

因此,根据数据的长度,有可能由于close()未对其调用而没有从流中清除最后几个字节。我对此的解决方案是不打扰包装流,而只是直接编码流:

public static String imgToBase64String(final RenderedImage img, final String formatName)

{

final ByteArrayOutputStream os = new ByteArrayOutputStream();

try

{

ImageIO.write(img, formatName, os);

return Base64.getEncoder().encodeToString(os.toByteArray());

}

catch (final IOException ioe)

{

throw new UncheckedIOException(ioe);

}

}

这解决了在浏览器中渲染时缺少像素行的问题。

以上是 Java BufferedImage为PNG格式Base64字符串 的全部内容, 来源链接: utcz.com/qa/411868.html

回到顶部