2

我有一个 Java 程序,它创建仅包含黑色像素和 100% 透明像素的复合 png 图像。我试图尽可能减小这些复合材料的大小,我注意到 ImageIO.write 总是输出 32 位 PNG。考虑到图像总共只有两种颜色,我想将它们保存为 8 位,但我认为没有办法使用标准 Java 函数来做到这一点。

有谁知道任何可以从 BufferedImage 创建 8 位 png 的预构建函数?也欢迎任何其他减小这些 png 大小的建议!

4

2 回答 2

2

我不确定,但我猜它ImageIO使用任何类型BufferedImage用途。尝试使用可用的不同类型。TYPE_CUSTOM看起来TYPE_BYTE_BINARY很有希望。

于 2012-10-11T18:55:21.017 回答
1

我不得不把它放在后座上一会儿,但我昨天又回来了,想出了怎么做。基本上它归结为使用下的类com.sun.imageio.plugins.png和自定义ImageWriteParam.

我必须自己构建颜色表(不太难,只是字节数组)。然后将颜色表传递给ImageTypeSpecifier.createIndexed. 返回的结果ImageTypeSpecifier允许您创建一个BufferedImage我将像素复制到其中的。

接下来,我使用创建了自定义 PNG 标头PNGMetadata(需要阅读大量有关 PNG 规范的内容,但总体而言非常简单)。IIOImage然后我使用所述元数据和 BufferedImage创建了一个新的。

最后,我创建了一个PNGImageWriter并从中获得了默认值ImageWriteParam。然后我简单地将ImageTypeSpecifierfrom before 传递给它的setDestinationType方法。最后一步是通过将 IIOImage 和 ImageWriteParam 传递给 PNGImageWriter 将 PNG 写入磁盘。

其中许多类的文档非常稀少,但它们的功能很棒。通过这样做,我创建了一个包含位深度为 1 的最小 PNG(因为只有两种颜色),这将我的 PNG 的大小平均减少了 78%!!!非常值得努力。

于 2012-11-09T14:46:03.483 回答