2011-12-20 85 views
4

我有一個圖像,稱之爲grayscale.jpg。現在我在The Gimp中打開該圖像並將顏色模式更改爲RGB並將其另存爲color.jpg。如果我在任何圖像查看器中查看grayscale.jpg和color.jpg,它們看起來完全一樣。但是,如果我打開圖像與javax.imageio.ImageIOjavax.imageio.ImageIO在灰度圖像上讀取不正確的RGB值

import javax.imageio.ImageIO; 

input = ImageIO.read(new File("grayscale.jpg")); 
System.out.format("Grayscale value: %x\n", input.getRGB(200, 200)); 

input = ImageIO.read(new File("color.jpg")); 
System.out.format("Color value: %x\n", input.getRGB(200, 200)); 

的彩色圖像將返回正確的值,說0xff6c6c6c。灰度圖像將返回像0xffaeaeae不同,更輕,不正確的值。

Grayscale value: 0xffaeaeae // Incorrect (Lighter) 
Color value:  0xff6c6c6c // Correct 

換句話說,javax.imageio.ImageIO中認爲灰度圖像輕得多比實際。我怎樣才能準確讀取灰度圖像?

編輯

這裏有更多的上下文。我的用戶上傳圖片,可能是灰度。我的Java運行在服務器上並執行一些非常複雜的圖像處理。所以一個理想的解決方案是修復我的Java代碼,而不是用命令行工具來組合一些東西。

+0

更多的挖掘之後,這是 重複http://stackoverflow.com/questions/6474753/my-batch-jpg-resizer -works-with-color-images-but-grayscale-ones-become-washed-o – 2011-12-20 18:42:48

回答

-1

因爲您使用JPEG,所以您的測試是無關緊要的,這是有損的。根據壓縮情況,您可能有其他顏色值。所以,嘗試與無損PNG相同。

您可以使用此圖片來測試javax.imageio的正確性。使用Gimp將其轉換爲灰度,並確保將其保存爲PNG。然後以相同的方式加載(這一個和轉換後的)。並在for循環中比較y軸的所有顏色。

enter image description here

示例代碼:

BufferedImage inputGrayscale = ImageIO.read(new File("grayscale.png"));  
BufferedImage inputColor = ImageIO.read(new File("color.png")); 

for (int i = 0; i < 256; ++i) 
{ 
    System.out.printf(i + "Grayscale value: %x\n", inputGrayscale.getRGB(10, i)); 
    System.out.printf(i + "Color value: %x\n", inputColor.getRGB(10, i)); 
    System.out.println(); 
} 
+0

這不僅僅是一個壓縮的東西。如果我讀取每個像素並將其寫入文件,實質上是逐像素地複製圖像,則彩色圖像的副本看起來是正確的,而灰度圖像的副本將比輸入文件輕得多。 – 2011-12-20 17:49:45

+0

另請參閱我的編輯,其中添加更多上下文。這些圖像來自我的用戶,我不希望他們不必擔心.png和.jpg。他們應該能夠直接上傳他們的相機輸出。 – 2011-12-20 17:50:38