有没有一种简单的方法可以减少 IndexedColorModel 中的颜色数量?
我有一个大的 8 位 PNG 图像。我正在使用 Java 将图像分割成更小的 32x32 图像。我使用 Java 的 ImageIO 将 PNG 加载到 BufferedImage 中,然后调用它的 getSubimage(x, y, 32, 32) 。然后,我使用 ImageIO 将每个图块写为 PNG 格式。
问题是生成的图像与原始图像具有相同的 IndexColorModel
。例如,一个 32x32 的图块总共只有 8 种颜色,但它包含一个包含原始图像中所有 100 多种颜色的颜色模型。
在写出 PNG 之前,我想从 32x32 图块的 IndexColorModel
中删除未使用的颜色。包含图像中未使用的颜色的颜色数据是没有意义的,我希望图像尽可能小。
是否有内置机制可以执行此操作,或者有人可以向我指出一种修改/减少 ColorModel 的(简单)方法吗?
谢谢!
I have a large 8-bit PNG image. I am using Java to slice the image into smaller 32x32 images. I use Java's ImageIO
to load the PNG into a BufferedImage
and then call it's getSubimage(x, y, 32, 32)
. I then use ImageIO
to write each tile out as a PNG.
The problem is that the resulting image has the same IndexColorModel
as the original image. For example, one 32x32 tile has only 8 total colors but it includes a color model with all 100-odd colors from the original image.
I would like to remove unused colors from the 32x32 tile's IndexColorModel
before I write out the PNG. There is no sense including color data for colors not used in the image and I'd like the images to be as small as possible.
Is there a built-in mechanism to do this or can someone point me to an (easy) way to modify/reduce the ColorModel
?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
看一下java.awt.image 中的
ColorConvertOp
。基本上,您创建一个具有所需深度的新
IndexColorModel
。如果您确实想要最小的,您可以遍历Raster
并计算颜色。否则,只需选择每像素 4 或 5 位。然后使用TYPE_BYTE_BINARY
和IndexColorMap
创建一个BufferedImage
。最后,使用ColorConvertOp
的filter()
方法将原始数据复制到新的BufferedImage
。Take a look at
ColorConvertOp
in java.awt.image.Basically, you create a new
IndexColorModel
of the desired depth. If you really want the smallest, you can walk through theRaster
and count the colors. Otherwise, just choose 4 or 5 bits per pixel. Then create aBufferedImage
withTYPE_BYTE_BINARY
and theIndexColorMap
. Finally, use theColorConvertOp
'sfilter()
method to copy the original data to the newBufferedImage
.