【问题标题】:How can I modify the map of a Java IndexColorModel?如何修改 Java IndexColorModel 的映射?
【发布时间】:2015-03-02 21:37:33
【问题描述】:

我想在从 .GIF 文件加载的 BufferedImage 中将一种颜色(黄色,有点具体)更改为另一种颜色。使用 getRGB 和 setRGB 应该可以很容易地做到这一点,但如果我可以更改 IndexColorModel 的“黄色”索引所指的颜色,效率会更高。如果做不到这一点,是否可以创建一个新的 IndexColorModel 具有更改的地图?

【问题讨论】:

    标签: java bufferedimage


    【解决方案1】:

    可能是这样的:

         BufferedImage bi = javax.imageio.ImageIO.read(new File("pathToGif"));
         
         if(bi.getColorModel() instanceof IndexColorModel) {
             IndexColorModel colorModel = (IndexColorModel)bi.getColorModel();
             int colorCount = colorModel.getMapSize();
             byte[] reds = new byte[colorCount];
             byte[] greens = new byte[colorCount];
             byte[] blues = new byte[colorCount];
             colorModel.getReds(reds);
             colorModel.getGreens(greens);
             colorModel.getBlues(blues);
             Color yellow = Color.YELLOW;
             Color blue = Color.BLUE;
             for(int i = 0; i < reds.length; i++) {
                Color newColor = new Color(reds[i]&0xff, greens[i]&0xff, blues[i]&0xff);
                if(newColor.equals(yellow)) {
                    reds[i] = (byte)blue.getRed();
                    greens[i] = (byte)blue.getGreen();
                    blues[i] = (byte)blue.getBlue();
                    break;
                }
             }
             
         }
    

    这将黄色更改为蓝色,然后您可以使用更改后的颜色模型创建一个新的 BufferedImage 并保存。

    【讨论】:

    • 我明白了;这应该对大图像有效。对于小的,可能 getRGB/setRGB 是有效的,因为这种方式必须分配固定数量的数组和颜色。顺便说一句 - 我认为您的代码中有一些拼写错误; .getReds(greens) 和 .getReds(blues) 看起来不正确。谢谢!
    • @BruceFeist:我相信即使对于大型索引彩色图像,这仍然应该是一个更好的方法。不过,您实际上并不需要 Color 对象。只需比较红色、绿色和蓝色字节就可以了。是的,我修正了错字。
    • @BruceFeist 请注意,带有IndexColorModel 的图像上的setRGB 只能将像素颜色更改为颜色图中已经存在的另一种颜色。在替换IndexColorModel 中的颜色时,会将该颜色的所有像素替换为您喜欢的任何颜色。我认为用例略有不同。
    • @haraldK 我明白这一点。这算不上问题;确切的颜色对我在这里所做的事情并不重要。我的理解是 Java 使用了一个适当但不完美的算法来找到所请求颜色的近似值。
    • @dragon66 我对你开始的评论感到困惑“我相信即使是大索引......”。我认为我们同意您的建议最适合这些人;由于分配和释放数组存储的开销,我认为 getRGB/setRGB 可能更有效。 (因为您指出实际上并不需要 Color 对象,所以情况就不那么好了。)
    猜你喜欢
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2013-11-29
    相关资源
    最近更新 更多