我一直在嘗試用Java編碼PNG圖像格式的一些數據(表示爲字節值數組0〜255)。使用JavaScript中的HTML canvas元素getImageData()方法讀取數據(類似於:http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html)。Java ImageIO PNG編碼不正確?
但是,輸出數據並不總是與輸入相同。一些值似乎與輸入不同。它似乎將編碼工作爲1像素高的圖像,並且僅對具有多行的圖像不正確。我認爲這可能是由於PNG圖像的逐行過濾造成的,但不知道。
看來,每個不正確的值是隻能被1或2
這裏的Java代碼,但我想知道如果它也可能是與ImageIO的API的問題,特別是它的PNG編碼器曾經錯了嗎?
public static File encodeInPng(byte[] data, String filename) throws java.io.IOException{
int width = (int)Math.ceil(Math.sqrt(data.length));
int height = (int)Math.ceil((double)data.length/width);
BufferedImage bufImg = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
int x = 0, y = 0;
for (byte b : data) {
bufImg.getRaster().setPixel(x, y, new int[]{b&0xFF});
x++;
if (x == width) {
x = 0;
y ++;
}
}
File f = new File(filename);
ImageIO.write(bufImg, "png", f);
return f;
}
編輯:問題只出現PNG文件超過一定規模(約50 KB,或可能256x256px)。
恩,我在想你真的不想標記JavaScript。刪除。 –
'y = 0;'似乎是一個錯誤。也許你的意思是'x = 0;'? – Obicere
你是對的,雖然原始代碼是正確的(我發佈時更改了一些var名稱以提高可讀性)。 – user2272952