有一种简单的方法可以减少IndexedColorModel中的颜色数量吗?

我有一个大的8位PNG图像。 我使用Java将图像切割成较小的32×32图像。 我使用Java的ImageIO将PNG加载到BufferedImage ,然后调用它的getSubimage(x, y, 32, 32) 。 然后我使用ImageIO将每个区块写为PNG。

问题是生成的图像与原始图像具有相同的IndexColorModel 。 例如,一个32×32磁贴只有8种颜色,但它包含一个颜色模型,其中包含原始图像中的所有100多种颜色。

在写出PNG之前,我想从32×32磁贴的IndexColorModel删除未使用的颜色。 没有任何意义,包括图像中未使用的颜色的颜色数据,我希望图像尽可能小。

是否有内置机制来执行此操作,或者有人指向我(简单)方式来修改/减少ColorModel

谢谢!

看看java.awt.image中的ColorConvertOp

基本上,您创建一个具有所需深度的新IndexColorModel 。 如果你真的想要最小的,你可以走过Raster并计算颜色。 否则,只需选择每像素4或5位。 然后使用TYPE_BYTE_BINARYIndexColorMap创建一个BufferedImage 。 最后,使用ColorConvertOpfilter()方法将原始数据复制到新的BufferedImage