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"));
但是,這也影響到相鄰像素。它應該將第一個像素設置爲白色,就是這樣。我有兩張照片供比較。
*不介意在底角點的矩形。我不知道從屏幕截圖時的情況。
這不應該給出給定的圖像,這裏發生了其他事情。 –
@Jean:那是OP發佈的解決方案,我只是把它移到了wiki的答案。也許可以在他們的問題下ping他們? – halfer
是的,答案是正確的,我沒有想太多......當然這是由於壓縮損失。對不起大家。 –