2014-03-01 50 views
2

我在Java中處理RGB值的時間非常糟糕,這讓我開始嘗試使用這種小型實驗。在BufferedImage上獲取和設置RGB值

我想到了這一點:加載一張圖片,獲取它的rgb值並創建一個具有相同值的新圖片。不幸的是,這不起作用(圖像顯示不同,見圖片),按照以下代碼...有人可以看到有什麼問題嗎?

BufferedImage oriImage=ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png")); 

int[] oriImageAsIntArray = new int[oriImage.getWidth()*oriImage.getHeight()]; 
oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0, 1); 

BufferedImage bfImage= new BufferedImage(oriImage.getWidth(),oriImage.getHeight(), 
      BufferedImage.TYPE_INT_ARGB); 

bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, 1); 

output

回答

4

顯然,getRGBsetRGB沒有被正確使用。

我改變了代碼:

oriImage.getRGB(0, 0, oriImage.getWidth(),oriImage.getHeight(), oriImageAsIntArray, 0, oriImage.getWidth()); 
(...) 
bfImage.setRGB(0,0,bfImage.getWidth(),bfImage.getHeight(),oriImageAsIntArray, 0, bfImage.getWidth()); 

...和畫面正常顯示。我仍然不明白這最後一個論點是什麼。在JavaDoc中,它被描述爲:

scansize - scanline stride for the rgbArray 
+0

它看起來像最後一個參數是圖像的寬度,以便該方法知道何時開始每個新行。 – Tharwen

+0

嗯,不知道:寬度已經發送作爲第三個參數...和圖像寬度已經在構造函數中設置... – Vespas

+9

這是掃描線的長度。 :-)在大多數情況下,這等於寬度,但也可以更大。對於某些顯示/圖像格式,將填充放置在每個掃描行的末尾是有意義的(例如,以確保每條新行以偶數開始,即下一個字/長字邊界)。這些填充像素不會使圖像更寬,但仍然是後備數據緩衝區/數組的一部分,這就是爲什麼您需要這個參數。只要你使用值> =圖像寬度,並在兩個地方使用相同的值,你應該是好的。說得通? :-) – haraldK