2010-03-03 38 views
5

我想知道是否有更有效的方法來替換BufferedImage中的顏色。目前我使用以下方法:如何在JAVA中替換BufferedImage中的顏色

我填充一個數組,其中包含要替換的顏色和替換它們的顏色,包括透明度。然後我遍歷圖像中的每個像素。如果它與數組中的其中一種顏色相匹配,則用數組中的新顏色替換它。這裏是代碼:

Graphics2D g2; 
    g2 = img.createGraphics(); 
    int x, y, i,clr,red,green,blue; 

    for (x = 0; x < img.getWidth(); x++) { 
    for (y = 0; y < img.getHeight(); y++) { 

     // For each pixel in the image 
     // get the red, green and blue value 
     clr = img.getRGB(x, y); 
     red = (clr & 0x00ff0000) >> 16; 
     green = (clr & 0x0000ff00) >> 8; 
     blue = clr & 0x000000ff; 

     for (i = 1; i <= Arraycounter; i++) { 
     // for each entry in the array 
     // if the red, green and blue values of the pixels match the values in the array 
     // replace the pixels color with the new color from the array 
     if (red == Red[i] && green == Green[i] && blue == Blue[i]) 
     { 
      g2.setComposite(Transparency[i]); 
      g2.setColor(NewColor[i]); 
      g2.fillRect(x, y, 1, 1); 
     } 
     } 
    } 

我正在使用的圖像很小,20x20像素左右。儘管如此,似乎必須有一個更有效的方式來做到這一點。

+0

也許如果你解釋我們可以幫助更多的原始問題 – medopal 2010-03-03 10:07:31

+0

該代碼創建圖像以用作地圖中的圖例。我們有一套四種顏色的模板圖像。黑色,紅色,綠色和藍色。根據地圖中的專題表示,模板圖像必須獲得正確的顏色。黑色將被轉換爲背景色,紅色爲正確的邊框顏色,綠色爲散列圖案,藍色區域將變爲透明。 – Rene 2010-03-03 10:35:33

回答

10

您可以修改底層ColorModel,而不是更改圖像像素的值。這種方式快得多,不需要遍歷整個圖像,因此可以很好地擴展。

+1

'ColorMap'不是Java API中的類。他應該怎麼做? – uckelman 2010-03-03 10:19:13

+2

這是一個錯字(已經被修復),向下投票似乎有點苛刻 – objects 2010-03-03 10:20:49

+0

而且這項技術運行良好,已經用於需要實時調整圖像對比度的醫學圖像查看器。更改個別像素值太慢了。 – objects 2010-03-03 10:22:27

3

使用HashMap<Color,Color>。關鍵應該是原來的顏色,並且值得更換。如果get返回null,則不執行任何操作。

3

它看起來像這樣做的慣用方法是執行LookupOp,然後應用此操作來創建一個新的目標BufferedImage。有一個很好的答案here

+0

我需要做的是將紅色,綠色,藍色和黑色像素全部轉換爲他們自己的新顏色。這可以使用LookupOp完成嗎?它看起來每個顏色組件單獨工作。 – Rene 2010-03-03 10:27:55

+0

我沒有使用它,但我很確定它可以。看看答案我引用它看起來像LookupTable(用2D數組構建)用於將源映射到目標顏色。查看LookupTable的lookupPixel方法...我相當確定這將被調用,通常使用包含RGBA值的4元素src數組(您應該檢查它)。 – Adamski 2010-03-03 11:11:18