【发布时间】:2015-03-02 21:37:33
【问题描述】:
我想在从 .GIF 文件加载的 BufferedImage 中将一种颜色(黄色,有点具体)更改为另一种颜色。使用 getRGB 和 setRGB 应该可以很容易地做到这一点,但如果我可以更改 IndexColorModel 的“黄色”索引所指的颜色,效率会更高。如果做不到这一点,是否可以创建一个新的 IndexColorModel 具有更改的地图?
【问题讨论】:
标签: java bufferedimage
我想在从 .GIF 文件加载的 BufferedImage 中将一种颜色(黄色,有点具体)更改为另一种颜色。使用 getRGB 和 setRGB 应该可以很容易地做到这一点,但如果我可以更改 IndexColorModel 的“黄色”索引所指的颜色,效率会更高。如果做不到这一点,是否可以创建一个新的 IndexColorModel 具有更改的地图?
【问题讨论】:
标签: java bufferedimage
可能是这样的:
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 并保存。
【讨论】:
IndexColorModel 的图像上的setRGB 只能将像素颜色更改为颜色图中已经存在的另一种颜色。在替换IndexColorModel 中的颜色时,会将该颜色的所有像素替换为您喜欢的任何颜色。我认为用例略有不同。