【问题标题】:Is there an easy way to reduce the number of colors in an IndexedColorModel?有没有一种简单的方法可以减少索引颜色模型中的颜色数量?
【发布时间】:2010-12-22 14:43:43
【问题描述】:

我有一个大的 8 位 PNG 图像。我正在使用 Java 将图像切成更小的 32x32 图像。我使用 Java 的 ImageIO 将 PNG 加载到 BufferedImage 中,然后将其称为 getSubimage(x, y, 32, 32)。然后我使用ImageIO 将每个图块写为PNG。

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

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

是否有内置机制来执行此操作,或者有人可以指出一种(简单的)方法来修改/减少 ColorModel

谢谢!

【问题讨论】:

    标签: java image-processing png javax.imageio


    【解决方案1】:

    看看 java.awt.image 中的ColorConvertOp

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

    【讨论】:

    • Devon,谢谢 - 这让我朝着正确的方向前进,除了在创建具有确切颜色数量的 IndexColorModel 之后,保存的 PNG 在其颜色表中似乎仍然有 256 种颜色。要么 Photoshop 显示不正确的颜色表,要么调色板具有正确的 8 种颜色,然后用灰色阴影填充剩余空间(最多 256 个)。有什么想法吗?
    • 嗯,它对我有用,所以可能是 PS 报告不正确。如果您在 Windows 上,请检查文件属性,“摘要”选项卡,“高级”。它应该显示 4 的“位深度”。
    • 我在创建 IndexedColorModel 时可能有位深度错误。它可能处于无效状态,导致颜色表出现异常。我会检查一下并在这里报告。
    • 经过一番试验,看起来 2 色和 8 色工作正常,但 4 色给我 32 位/像素。因此,如果您的图像少于 8 种颜色,请将其填充到 8
    • 看来我一直在追赶 Photoshop 的“错误”。从 Photoshop 中保存相同的图像并使用自定义调色板将其加载回显示相同的自定义颜色和灰度填充颜色表。 Java 的 ImageIO 编码的 PNG 比 Photoshop 小很多(几乎小 40%),但在浏览器和 Flash 中可以正常显示。最后不需要填充 - 少于 8 种颜色或多于 8 种颜色,Photoshop 中的图像仍然具有灰度调色板(无需额外费用),这实际上可能是 PNG 格式的一个功能,而不是 Photoshop 中的错误。感谢您的所有帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2019-03-19
    • 2012-10-08
    • 2013-07-06
    • 1970-01-01
    • 2014-03-18
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多