2016-03-08 19 views
0

我編寫了一個java代碼,將黑白圖像的所有紅色值更改爲255,因此輸出將爲紅色圖像。 但它不是紅色,而是輸出更明亮的圖像。 我做錯了什麼?Java,圖像更改爲錯誤的rgb值

File bwgFile = new File("X:/Java/Documents/NetBeansProjects/colour/input/bwg.png"); 
BufferedImage bwgImage = ImageIO.read(bwgFile); 
int width=bwgImage.getWidth(); 
int height=bwgImage.getHeight(); 
for(int w=0; w<width; w++){ 
    for(int h=0; h<height; h++){ 
     int pixel = bwgImage.getRGB(w,h); 
     Color bwg = new Color(pixel); 
     int c=bwg.getRed(); 
     Color red = new Color(255,c,c); 
     int cpixel = red.getRGB(); 
     bwgImage.setRGB(w,h,cpixel); 
    } 
} 
    ImageIO.write(bwgImage, "png", new File("X:/Java/Documents/NetBeansProjects/colour/output/c.png")); 

input output

編輯: 我發現了什麼問題,顯然當輸入爲灰度圖像,它會嘗試使輸出灰度圖像,以及從而使其更暗當添加紅色時,藍色和綠色的顏色被去除並變亮。不使用灰度圖像作爲輸入固定它。

+0

原因顏色通道指示顏色的亮度?你仍然有你的綠色和藍色頻道。如果你把它們全部設置爲255,你會變白。 – Neijwiert

+0

我不把他們全部設置爲255,只有紅色。 – ergoforce

+0

如果你看看輸出圖像,你可以看到圖像不是白色的。 (如果您沒有注意,我已經包含了圖像的鏈接。) – ergoforce

回答

0

如果我明白你要做什麼,你試圖創建一個灰度圖像,除了它是「紅色」,只使用紅色陰影。因此,您需要計算每個像素的灰度常數。

來自維基百科(Greyscale),像素的亮度Y = 0.2126R + 0.7152G + 0.0722B。所以,試試這個

int pixel = bwgImage.getRGB(w,h); 
Color bwg = new Color(pixel); 
float c = (0.2126f * bwg.getRed() + 0.7152f * bwg.getGreen() + 0.0722f * bwg.getBlue()); 
int cc = (int)Math.round(c); 
Color red = new Color(cc, 0, 0); 
int cpixel = red.getRGB(); 
bwgImage.setRGB(w,h,cpixel); 

或者,你可以簡單地保留了紅色組件,並設置綠色和藍色爲0,這會使你的每一個像素的只是「發紅」。

int pixel = bwgImage.getRGB(w,h); 
Color bwg = new Color(pixel); 
int c=bwg.getRed(); 
Color red = new Color(c,0,0); 
int cpixel = red.getRGB(); 
bwgImage.setRGB(w,h,cpixel); 

注:以上僅此解決方案適用於未使用IndexColorModel圖像。您可以使用BufferedImage的getColorModel()檢查顏色模型。根據HaraldK的評論,對於IndexColorModelsetRGB()不直接工作,而是在索引中選取最接近設置顏色的顏色。爲了達到使用IndexColorModel圖像所期望的結果,你可以創建一個新的BufferedImage與TYPE_INT_ARGB:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 

然後,寫一個計算的像素顏色,這種新的圖像並保存新的圖像,而不是。

+0

線程「main」中的異常java.lang.IllegalArgumentException:預期範圍之外的顏色參數:紅色 \t at java.awt.Color.testColorValueRange( Color.java:310) \t at java.awt.Color。 (Color.java:395) \t at java.awt.Color。 (Color.java:50) C:\ Users \ Emma \ AppData \ Local \ NetBeans \ Cache \ 8.1 \ executor-snippets \ run.xml:53 :Java返回:1 BUILD FAILED(總時間:0秒) – ergoforce

+0

@ergoforce,對不起,刪除了第3行的* 255。原始值已經在0和255之間。 – nitegazer2003

+0

我也嘗試了第二個建議,但我仍然以灰度圖像結尾,即使對於每個像素的藍色和綠色值都應爲0,它仍比輸入更深。 – ergoforce