2012-11-13 62 views
3

我目前正在研究需要更改BufferedImage中某些顏色的應用程序。 (例如黑色到紅色)BufferedImage顏色操作

我注意到使用BufferedImage類的setRGB方法時出現了一些奇怪的行爲。

除非指定的RGB值已經在圖像中某處顯示,否則setRGB將簡單地將其設置爲完全透明的像素。

顯而易見的解決方法是在圖像中具有所有所需的顏色,但任何人都可以向我解釋爲什麼發生這種情況,或者如何解決它?謝謝。

public Texture replaceColour(final TextureColour TARGET, final TextureColour REPLACEMENT) 
{ 
      /* 
      * You needn't worry about this bit, just some checks my program 
      * uses to determine if a similar image has already been created. 
      */ 
    final String PATH = loadedTexturesFilenames.get(REFERENCE) + "!replacedColour:" + TARGET.RGB + ":" + REPLACEMENT.RGB; 
    final Texture PATH_TEXTURE = getTexture(PATH); 
    if (PATH_TEXTURE == null) 
    { 
        /* 
        * This is where the color changing happens. 
        * See below for information on the 'Texture' and 
        * 'TextureColour' classes. 
        */ 
     final BufferedImage IMAGE = cloneImage(BUFFERED_IMAGE); 
     for (int x = 0; x != IMAGE.getWidth(); x++) 
     { 
      for (int y = 0; y != IMAGE.getHeight(); y++) 
      { 
       if (getColour(x, y) == TARGET) 
       { 
        IMAGE.setRGB(x, y, REPLACEMENT.RGB); 
       } 
      } 
     } 
     return new Texture(IMAGE, PATH); 
    } 
    else 
    { 
     return PATH_TEXTURE; 
    } 
} 

public static BufferedImage cloneImage(final BufferedImage I) 
{ 
    ColorModel colour = I.getColorModel(); 
    boolean alpha = colour.isAlphaPremultiplied(); 
    WritableRaster writableRaster = I.copyData(null); 
    return new BufferedImage(colour, writableRaster, alpha, null); 
} 

上的代碼的一些注意事項:

  • 的「紋理」類由我的程序存儲BufferedImages「有效」。
  • 以下方法在Texture類中。
  • 'TextureColour'類存儲在另一個包含顏色的BufferedImage上使用getRGB(x,y)生成的RGB值。這樣做是爲了避免混淆RGB值,並允許在不更改代碼的情況下更改顏色。
  • getColour(x,y)消息根據BufferedImage.getRGB(x,y)給出的結果返回'TextureColour'。

回答

2

我猜想圖像是使用索引顏色模型,所以只有圖像中已經存在的顏色可以繪製。嘗試使用TYPE_INT_ARGB創建克隆圖像。喜歡的東西:

BufferedImage image = new BufferedImage(I.getWidth(), I.getHeight(), BufferedImage.TYPE_INT_ARGB); 
Graphics g = image.getGraphics(); 
//draw original image I to the new graphics 
g.dispose(); 
return image; 

我希望這能解決你的問題,很難在當地重現它沒有你的圖片資料...

1

注意the documentation for setRGB指出,「對於具有IndexColorModel,指數圖片選擇最接近的顏色。「

在你的包裝類中,有什麼辦法可以讓你的BufferedImages成爲索引類型?如果是這樣,您可能需要在處理該類型之前使用類型TYPE_INT_ARGB而不是索引類型來創建新的BufferedImage。