3
我想從一個.GIF文件加載的BufferedImage中將一種顏色(黃色,稍微具體)更改爲另一種顏色。我應該可以使用getRGB和setRGB輕鬆完成它,但如果我只是改變IndexColorModel的'黃色'索引所指的顏色,效率會更高。否則,是否可以創建一個新的IndexColorModel,它具有更改的地圖?如何修改Java IndexColorModel的地圖?
我想從一個.GIF文件加載的BufferedImage中將一種顏色(黃色,稍微具體)更改爲另一種顏色。我應該可以使用getRGB和setRGB輕鬆完成它,但如果我只是改變IndexColorModel的'黃色'索引所指的顏色,效率會更高。否則,是否可以創建一個新的IndexColorModel,它具有更改的地圖?如何修改Java IndexColorModel的地圖?
也許是這樣的:
BufferedImage bi = javax.imageio.read("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(綠色)和.getReds(藍色)看起來不正確。 謝謝! – 2015-03-02 23:33:36
@BruceFeist:即使對於大型索引彩色圖像,我也相信這應該仍然是一個更好的方法。儘管你並不需要Color對象。只是比較紅色,綠色和藍色字節應該沒問題。是的,我修正了錯字。 – dragon66 2015-03-03 01:11:45
@BruceFeist請注意,具有「IndexColorModel」的圖像上的「setRGB」只能將像素顏色更改爲顏色圖中已有的另一種顏色。雖然替換「IndexColorModel」中的顏色將用您喜歡的任何顏色替換該顏色的所有像素。我認爲用例有點不同。 – haraldK 2015-03-03 09:31:59