Я пытался кодировать некоторые данные (представленные в виде массива байтов 0-255) в формате изображения PNG с Java. Данные считываются с использованием метода HTML canvas getImageData() в JavaScript (аналогично этому: http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html).Java ImageIO PNG Кодирование Неправильно?
Однако выходные данные не всегда идентичны входным данным. Некоторые из значений, по-видимому, отличаются от ввода. Кажется, что кодирование работает как изображение с высоким разрешением 1 пиксель и является неправильным только для изображения с несколькими строками. У меня была идея, что это может быть вызвано поэтапной фильтрацией изображений PNG каким-то образом, но на самом деле не знаю.
кажется, что каждое неверное значение только когда-либо неправильно, 1 или 2.
Вот код Java, но я задаюсь вопросом, если она также может быть проблема с апи ImageIO, в частности, его 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;
}
Edit: Проблема возникает только для PNG файлов в течение определенного размера (около 50 килобайтов, или, возможно, 256x256px).
um, Я думаю, что вы действительно не хотите тегировать JavaScript. Удаленные. –
'y = 0;' похоже на ошибку. Может быть, вы имели в виду 'x = 0;'? – Obicere
Вы правы, хотя исходный код был прав (я изменил некоторые имена переменных при публикации, чтобы сделать более читаемыми). – user2272952