标题说得够多了,我想。我有一个完整质量的 BufferedImage,我想通过一个低位深度的 OutputStream 发送它。我不想要一个算法来逐个像素地改变质量,所以它仍然是一个完整的质量。
因此,目标是通过 OuputStream 写入图像(以全分辨率、全尺寸),这需要很少的字节数来写入。
谢谢,
马丁
标题说得够多了,我想。我有一个完整质量的 BufferedImage,我想通过一个低位深度的 OutputStream 发送它。我不想要一个算法来逐个像素地改变质量,所以它仍然是一个完整的质量。
因此,目标是通过 OuputStream 写入图像(以全分辨率、全尺寸),这需要很少的字节数来写入。
谢谢,
马丁
查看java.util.zip
有关压缩的所有信息包:
http://java.sun.com/developer/technicalArticles/Programming/compression/
尽管 JPEG 和 PNG 已经以某种方式进行了压缩,但使用Inflater
该类,您可以减少字节数,同时保持图像的完全相同的质量。压缩已经压缩的格式通常并不重要。但是,如果将多个图像组合在一起,则对它们进行膨胀非常重要(因为膨胀技术可以识别对象数据中的常见模式,从而减少重复,从而减少字节数)。
您需要将图像数据编码为具有适合图像特征的格式。如果它是 24 位颜色并且有很多颜色并且您希望不损失任何质量,您可能会被 PNG 卡住,但请查看无损 JPEG 2000。
如果你可以失去一些质量,然后尝试
如果图像只有灰色或黑白数据,请确保将其编码(8 位灰色或 1 位黑白)。然后,确保使用针对这种格式调整的编码器(例如带有 Group 4 的 TIFF 或 JBIG2)。
另一个不错的选择是从图像中删除所有不需要的元数据(或确保您的编码器没有放入任何元数据)。
如果您想坚持使用 Java 中的内容,您可能必须使用 TIFF、PNG 或 JPEG——有第三方图像编码器(例如,我的公司 Atalasoft制作了这些高级编码器的 .NET 版本——有Java 供应商也在那里)
仅供参考:降低位深度通常意味着降低质量(除非降低没有意义)。例如,如果我有一个 24 位彩色图像,但所有颜色都是灰色(其中 R==G==B),那么减少到 8 位灰色不会降低质量。如果您的图像具有 256 种不同颜色的任何集合并且您切换到颜色映射(索引或调色板)格式,这也是正确的。您减少了字节数,但不会降低质量。