我有一个 Java 程序,它创建仅包含黑色像素和 100% 透明像素的复合 png 图像。我试图尽可能减小这些复合材料的大小,我注意到 ImageIO.write 总是输出 32 位 PNG。考虑到图像总共只有两种颜色,我想将它们保存为 8 位,但我认为没有办法使用标准 Java 函数来做到这一点。
有谁知道任何可以从 BufferedImage 创建 8 位 png 的预构建函数?也欢迎任何其他减小这些 png 大小的建议!
我有一个 Java 程序,它创建仅包含黑色像素和 100% 透明像素的复合 png 图像。我试图尽可能减小这些复合材料的大小,我注意到 ImageIO.write 总是输出 32 位 PNG。考虑到图像总共只有两种颜色,我想将它们保存为 8 位,但我认为没有办法使用标准 Java 函数来做到这一点。
有谁知道任何可以从 BufferedImage 创建 8 位 png 的预构建函数?也欢迎任何其他减小这些 png 大小的建议!
我不确定,但我猜它ImageIO
使用任何类型的BufferedImage
用途。尝试使用可用的不同类型。TYPE_CUSTOM
看起来TYPE_BYTE_BINARY
很有希望。
我不得不把它放在后座上一会儿,但我昨天又回来了,想出了怎么做。基本上它归结为使用下的类com.sun.imageio.plugins.png
和自定义ImageWriteParam
.
我必须自己构建颜色表(不太难,只是字节数组)。然后将颜色表传递给ImageTypeSpecifier.createIndexed
. 返回的结果ImageTypeSpecifier
允许您创建一个BufferedImage
我将像素复制到其中的。
接下来,我使用创建了自定义 PNG 标头PNGMetadata
(需要阅读大量有关 PNG 规范的内容,但总体而言非常简单)。IIOImage
然后我使用所述元数据和 BufferedImage创建了一个新的。
最后,我创建了一个PNGImageWriter
并从中获得了默认值ImageWriteParam
。然后我简单地将ImageTypeSpecifier
from before 传递给它的setDestinationType
方法。最后一步是通过将 IIOImage 和 ImageWriteParam 传递给 PNGImageWriter 将 PNG 写入磁盘。
其中许多类的文档非常稀少,但它们的功能很棒。通过这样做,我创建了一个包含位深度为 1 的最小 PNG(因为只有两种颜色),这将我的 PNG 的大小平均减少了 78%!!!非常值得努力。