Хранить информацию в файле PNG без искажения изображения? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу записать информацию (прежнюю: int / String) в PNG-файл, не делая изменения видимыми для человеческого глаза.

Для этого я извлекаю файл в виде байтового массива:

byte[] imageAsBytes = fileInputStream.readAllBytes();

На следующем шаге я прыгаю заголовок (8 байт, уже опробовано до 300 байт),Я уже обработал свою информацию и могу извлечь ее побитовым способом.

Я заменяю последний бит из байтов изображения на извлеченную побитовую информацию.

Это хорошо работает с форматом файла .bmp, но применение этого метода к PNG-файлам искажает изображение.

Я предполагаю, что PNG-файл содержит дополнительную информацию после заголовка.

Итак, хранится ли какая-либо информация после заголовка и, если да, что помечает эту "информационную часть" как единое целое?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Чтобы прочитать и декодировать файл .png, мы можем использовать BufferedImage следующим образом:

File imageFile = new File("myimage.png");
BufferedImage image = ImageIO.read(imageFile);

Нет, мы можем манипулировать его пикселями, используя методы getRGB и setRGB:

int pixel = image.getRGB(x, y);
// do some byte manipulation on the pixel
// ....
image.setRGB(x, y, pixel);

После этого BufferedImage должен быть передан в выходной поток, чтобы иметь возможность сохранить новое изображение.

0 голосов
/ 15 февраля 2019

Я думаю, что лучшим способом будет не смотреть на байты файла, а открыть его с помощью некоторого png-декодера, затем изменить пиксели на его изображении, а затем снова сохранить его с помощью png.Когда вы наверняка поиграете с самими байтами файла, вы нарушите формат png, вы не сделали это в bmp, потому что bmp его jsut попиксельно сохранял в файл без какой-либо упаковки или кодировки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...