2017-04-15 61 views
1

我想在java中實現一些低級別的過濾器。爲此,我必須能夠操縱圖像的每個單獨像素。我想最好的辦法是將圖像轉換爲字節數組並從那裏開始。BufferedImage字節數組操作影響相鄰像素

我創建了一個由4個完全紅色像素組成的2x2圖像。然後我讀入數組,並使用了下面的代碼相當準確的描述:

BufferedImage bufferedImage = null; 
try { 
    bufferedImage = ImageIO.read(new File("image.jpeg")); 
} catch (IOException e) { } 

byte[] b = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData(); 

這是工作,因爲它應該。我從陣列中得到這個讀數。

0 0 -2 0 0 -2 0 0 -2 0 0 -2 

這些是每個像素的RGB通道。由於某些原因,它們被反向打印。 B,G,R。你可以看到像素是紅色的,因爲紅色通道的字節是-2。 (它們的無符號值是254)。

問題出現,因爲我更改了這些像素在數組中的值,然後嘗試將該數組轉換回圖像。例如,我在第一像素更改爲白色:

-1 -1 -1 0 0 -2 0 0 -2 0 0 -2 

因爲我使用此代碼轉換:

ImageIO.write(bufferedImage, "jpg", new File("new_image.jpg")); 

但是,這也影響到相鄰像素。它應該將第一個像素設置爲白色,就是這樣。我有兩張照片供比較。

Original image

Processed image

*不介意在底角點的矩形。我不知道從屏幕截圖時的情況。

回答

2

(發表於OP)

JPEG是一種有損格式,它始終(即使在100%的質量)壓縮圖像,因此它失去了一些細節。使用.bpm或.png不具有這種效果,並且正常工作。

+0

這不應該給出給定的圖像,這裏發生了其他事情。 –

+0

@Jean:那是OP發佈的解決方案,我只是把它移到了wiki的答案。也許可以在他們的問題下ping他們? – halfer

+1

是的,答案是正確的,我沒有想太多......當然這是由於壓縮損失。對不起大家。 –