2011-10-08 149 views
1

我正在用Java編寫一個小程序,它將在圖像上繪製路徑。要做到這一點,我有以下代碼BufferedImage:紅色顯示爲灰色

while(!path.isEmpty()) 
{ 
    Position p = path.poll(); 
    image.setRGB(p.getX(),p.getY(),Color.red.getRGB()); 
} 

在哪裏路徑是一個對象的隊列,其舊的X和Y座標和圖像是一個標準的BufferedImage(來自ImageIO.read)。此代碼僅用於在隊列中的圖像的每個像素上繪製一個紅色像素。當我將這個圖像寫入文件時,我得到了一個灰色,而不是紅色。

The diagonal gray line SHOULD be Red...

Color.red.getRGB的返回值是0xFFFF0000地址。當我將它設置爲紅色後,在像素上執行getRGB時,返回0xFF7F7F7F。

我是比較新的Java和不知道爲什麼會這樣。任何幫助將不勝感激。

如果它的確與衆不同,圖像是從一個.bmp文件。

回答

2

這可能是你使用一個BufferedImage,這是一個灰度類型,或那些sRGB值映射到的灰色的類型。

一般情況下,有兩種可能性之一:

  1. 如果你明確初始化的BufferedImage退房要麼IMAGETYPE或ColorModel的參數,depending on the constructor you're using
  2. 如果你通過一些工廠方法或以其他方式間接初始化圖像對象,檢查出的getType()方法的價值。這些值在JavaDoc中列出。如果這是一個「正確的」值(RGB類型之一),請檢查返回的getColorModel()

由於您從.bmp文件加載圖像,第二個可能是您的情況。

有關色彩值轉換問題的信息,請參閱herehere

一般來說,如果您只是想了解Java中的圖像處理,我會建議使用第二個帶* TYPE_INT_ARGB *的BufferedImage構造函數作爲初學者的類型,並從中擴展您的代碼。從我記得我早期的Java時代,學習圖像加載可能有點棘手:)。

此外,您可能想讀official Java2D tutorial。這是一個很好的介紹這個話題。

+0

非常周到的答案!感謝和+1! –

+0

感謝您的好評!這是我的問題。我檢查了類型的值,它給了我10,這恰好是TYPE_BYTE_GRAY。你知道我可以自己設定這個值嗎?我查看了你在底部添加的鏈接,但沒有提及任何關於類型值的內容(除了自己製作BufferedImage,我不知道該怎麼做,我正在使用ImageIO.read) –

+0

很高興這有幫助。關於如何自己構建圖像的方法,請參閱我答案中的第一個鏈接。另外,Java2D教程在「使用圖像」的最後兩個小節中確實包含了有關此主題的更深入報道 - 它向您展示瞭如何創建一個空的圖像,然後在其上繪製一個加載的圖像。 如果你想堅持使用ImageIO。read(),現在最簡單的解決方案是在您最喜歡的圖像編輯器中打開文件並將其保存爲彩色BMP。 否則,我真的建議給教程一個很好的閱讀:)。 –