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

Java BufferedImage为PNG格式Base64字符串

景星华
2023-03-14
问题内容

我正在尝试将屏幕截图输出作为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);
  }
}

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



 类似资料:
  • 我目前正在尝试编写一个程序,将文本编码到一个png文件中,只改变我想在图片中编码的每个字母的最低有效位,例如我有一个'a',它是65,我使用8个不同的字节来编码字母a。所以01010100<-1010110<-11011010<-10101010<-1010101010<-1010101010<-10101010<-10101010<-10101010<-10101010<-10101010<-1

  • 本文向大家介绍JavaScript 下载svg图片为png格式,包括了JavaScript 下载svg图片为png格式的使用技巧和注意事项,需要的朋友参考一下 1.遇到需要将svg下载的需求,网上找了一些代码,地址是这个https://github.com/exupero/saveSvgAsPng,但是不太好用,莫名的把网页所有的svg都下载了,于是在源码的基础上做了一些小的修改;代码如下所示 这

  • 问题内容: 我需要将base64编码字符串转换为ArrayBuffer。base64字符串是用户输入的字符串,它们将通过电子邮件进行复制和粘贴,因此在加载页面时它们不存在。我想在javascript中做到这一点,如果可能的话,不向服务器进行ajax调用。 这看起来不错,但我不知道如何使用代码。 有没有简单的方法(也许是本地方法)进行转换?谢谢 问题答案: 尝试这个:

  • 问题内容: 我将 图片获取 为base64字符串( ) ,下面是将转换为图片的函数, 现在,如果图像为png,则png库将创建图像,而jpg库将引发错误,反之亦然。 问题是当我上传png时效果很好,但是当我 上传jpg文件时 返回此错误 无效的JPEG格式:缺少SOI标记 输入为: 这可能有帮助 问题答案: 您将您的传递给,这开始消耗阅读器,只是发现输入不是有效的PNG,因此返回错误。 然后,将部

  • 有一种方法可以将输入流转换为字符串,并将其编码为base64,对吗? 在我的函数中,我得到了InputStream参数,需要将其插入到Oracle数据库表的BLOB字段中。 有办法做到吗? (我的数据库对象包含用于保存图像的字符串字段,但我找不到任何方法将InputStream转换为base 64格式的字符串。)

  • Im能够将转换为base64。但现在我正在尝试将其转换回并存储在中 编辑%1;首先感谢大家,我已经尝试了以下所有的解决方案,它们都起作用了。但是我有多个图像,如果中没有图像怎么办?