2013-05-04 52 views
4

這裏是我的繪畫方法:ImageIO.write是保存圖像失真與

BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
bi.setRGB(0, 0, width, height, rgbIntArray, 0, width); 
ImageIO.write(bi, "bmp", new File("C:/Users/Felipe/Desktop/img2.bmp")); 

這是我如何填充rgbIntArray:

rgbIntArray = new int[(rgbArray.length/3)]; 
int j = 0; 
for (int i = 0; i < rgbArray.length; i += 3) 
{ 
    rgbIntArray[j] = unsignedToBytes(rgbArray[i]) + 
    unsignedToBytes(rgbArray[i + 1]) * 256 + 
    unsignedToBytes(rgbArray[i + 2]) * 65536; 
    j++; 
} 

我測試了這些價值觀,他們似乎是正確的。

我認爲問題是在setRGB的最後一個參數,它要求「掃描線跨度」,說實話,我不知道它是什麼。 (但我發現它可能是圖像的寬度)。我假設其他參數是正確的。

下面是結果:

原圖:

Original image http://i.minus.com/jy7iVQxtghO0l.bmp


結果:

Result http://i.minus.com/jz86D3YkuPPhG.bmp

我將在後面操作圖像。我只是打開並保存相同的圖像。

+2

你如何填充rgbIntArray? – Sinkingpoint 2013-05-04 01:00:38

+0

你的代碼塊中的「rgbArray」是什麼? – Zyerah 2013-05-04 01:07:17

+0

這是從圖像中讀取的B G R陣列。 – 2013-05-04 01:10:43

回答

0

我不知道如何初始化rgbArray,但每行都以黑色像素(圖像外)結尾。如果您通過直接從映像文件中讀取字節來初始化rgbArray,它可能會代表一個新行。或者您沒有正確初始化rgbArray

黑色像素在剪切圖像上顯示爲對角線。

你可以通過改變這個在每一行的末尾跳過黑色像素:

bi.setRGB(0, 0, width, height, rgbIntArray, 0, width); 

這樣:

bi.setRGB(0, 0, width, height, rgbIntArray, 0, width + 1); 

最後一個參數,width + 1,基本上是說,如果一個給定的行從數組中的某個索引處開始,然後下一行將從索引處開始,該索引在相同數組中較高處爲width + 1