2015-03-02 58 views
3

我想從一個.GIF文件加載的BufferedImage中將一種顏色(黃色,稍微具體)更改爲另一種顏色。我應該可以使用getRGB和setRGB輕鬆完成它,但如果我只是改變IndexColorModel的'黃色'索引所指的顏色,效率會更高。否則,是否可以創建一個新的IndexColorModel,它具有更改的地圖?如何修改Java IndexColorModel的地圖?

回答

1

也許是這樣的:

 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和保存。

+0

我明白了;這對大型圖像應該是有效的。對於小的,可能getRGB/setRGB是有效的,因爲這種方式必須分配固定數量的數組和顏色。 順便說一句 - 我認爲你在代碼中有一些錯別字; .getReds(綠色)和.getReds(藍色)看起來不正確。 謝謝! – 2015-03-02 23:33:36

+0

@BruceFeist:即使對於大型索引彩色圖像,我也相信這應該仍然是一個更好的方法。儘管你並不需要Color對象。只是比較紅色,綠色和藍色字節應該沒問題。是的,我修正了錯字。 – dragon66 2015-03-03 01:11:45

+0

@BruceFeist請注意,具有「IndexColorModel」的圖像上的「setRGB」只能將像素顏色更改爲顏色圖中已有的另一種顏色。雖然替換「IndexColorModel」中的顏色將用您喜歡的任何顏色替換該顏色的所有像素。我認爲用例有點不同。 – haraldK 2015-03-03 09:31:59