【问题标题】:Convert BufferedImage to byte[] without losing quality and increasing size在不损失质量和增加大小的情况下将 BufferedImage 转换为 byte[]
【发布时间】:2012-01-20 14:17:40
【问题描述】:

我正在尝试将 BufferedImage 转换为字节数组。我有两个条件。 1.我不应该失去图像的质量。 2. 字节数组的大小要和实际图片一样。我尝试了几个选项。

选项 1:

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        baos.flush();
        byte[] imageBytes = baos.toByteArray();
        baos.close();

选项 2:

        WritableRaster raster = image.getRaster();
        DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();
        byte[] imageBytes = data.getData();

这两个选项都会增加图片的大小(对于大图片来说是两倍以上)。

感谢任何帮助。谢谢!

【问题讨论】:

  • 我添加了java 标签。希望这是正确的(似乎)......
  • 如何定义图片的大小?包含该图像的文件的大小?持有它的Image 实例使用的内存?如果是前者,那取决于你存储它的格式。如果是后者,那取决于实现。另外,您正在创建的byte[]s 的大小与源图像的“大小”是多少?
  • “字节数组的大小应该与实际图像相同” 这似乎是一个相当随意的要求。谁指定的,你的老师?
  • @AndrewThompson - 我正在将上传的图像转换为字节数组以将其存储在亚马逊服务器上。我为用户上传的图像设置了 5MB 的大小限制。因此,如果用户上传大小为 4.99MB 的图像,我希望将其存储在亚马逊服务器上。希望您现在看到此要求的重要性。 :)
  • @sure_render - 如果原始文件大小已经可以接受,为什么还要通过 BufferedImage? (为什么不只是在收到字节时传递它们?)

标签: java bytearray bufferedimage


【解决方案1】:

PNG 格式使用lossless data compression,因此您不必担心使用选项 1 会降低图像质量。

您如何看待图像尺寸的增加?我相信你知道imageBytes.length 是什么。您将此与您认为这是应有的两倍大进行比较是什么? (我认为您的假设可能不正确。)

您的原始源文件可能只是使用了比 Java 重新压缩它时更高的压缩设置。您可能需要将一些额外的参数传递给您的编写器。有关更多详细信息,请参阅how to compress a PNG image using Java - 特别是指向http://www.exampledepot.com/egs/javax.imageio/JpegWrite.html 的链接。

【讨论】:

  • 我将它与磁盘上 2.65MB 的图像文件大小进行比较,而 imageBytes.length 给了我一个像 5000000 这样的数字,大约是 5MB。
  • @sure_render - 我假设磁盘上的这个文件是你最初加载 BufferedImage 的文件?如果是这样,它的格式是什么?可能原来的压缩设置比 Java 重新压缩它时使用的压缩设置更高。
  • 感谢您的建议。我正在使用 PNG 来确保无损压缩,但缺点是存储较大的图像,这被认为是可以接受的。再次感谢!
  • @sure_render - 仅仅因为您使用的是 PNG 并不意味着您一定需要更大的文件大小。原始文件格式是什么?如果是 JPG 之类的东西,那么一切都可能按原样有意义。但是,如果原件已经是 PNG,您可能只需要按照我的答案末尾的编辑来正确设置 PNG 导出的压缩设置(仍然是无损的,但“更努力地”获得更小的文件)。
猜你喜欢
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多