Преобразованный массив байтов в изображение и обратно в массив байтов, значения изменились

Я попытался реализовать стеганографию со следующими шагами: 1. Преобразовал изображение в буферизованное изображение 2. Преобразовал буферизованное изображение в массив байтов 3. Внес изменения в массив байтов 4. Преобразовал массив байтов обратно в буферизованное изображение 5. Сохранил его как файл jpg

Проблема возникла, когда я снова прочитал сохраненный файл, преобразовал его в массив байтов и обнаружил, что массив байтов отличается от того, что я получил после шага 3 (хотя особой разницы не было, поскольку 6 преобразовано в 7, 9 в 8 и т. д. )

Я действительно понятия не имею, почему это произошло.


person Abhishek Kumar    schedule 28.02.2016    source источник
comment
Возможный дубликат Я читаю изображение и меняю его. Но изменения не сохраняются   -  person Reti43    schedule 28.02.2016


Ответы (3)


  1. Если вы сохраняете в формате JPEG, данные RGB преобразуются в YCbCr. Эти два цветовых пространства имеют разные гаммы, поэтому значения фиксируются.

  2. Данные JPEG могут подвергаться субдискретизации, что приводит к изменению данных. Вы можете избежать этих изменений, не выполняя субдискретизацию.

  3. JPEG DCT может вносить небольшие ошибки (ограничено +/-1 при правильной реализации)

  4. Квантование внесет довольно большие изменения в данные. Вы можете избежать изменений на этом шаге, имея все 1 в своих таблицах квантования.

Независимо от того, что вы делаете, № 1 и № 3 могут внести изменения в процесс сжатия JPEG.

person user3344003    schedule 29.02.2016

JPG — это формат изображения с потерями, поэтому нельзя ожидать, что он сохранит данные сразу после их сохранения. Он особенно не подходит для стеганографии, так как уничтожает мелкие детали, необходимые для этого использования, даже при использовании настроек самого высокого качества.

Решение состоит в том, чтобы использовать формат без потерь, например PNG.

person SztupY    schedule 28.02.2016

BufferedImage уже может быть массивом байтов. Если при создании BufferedImage вы используете кодировку TYPE_BYTE_GRAY, 3BYTE_BGR или 4BYTE_ABGR, то ваш BufferedImage уже представляет собой массив байтов. Чтобы получить доступ к массиву байтов, вы делаете: byte[] buffer = ((DataBufferByte)my image.getRaster().getDataBuffer()).getData() ;

И когда вы записываете изображение в формате JPEG, вы сжимаете свое изображение с потерями. Таким образом, информация, которую вы сохраняете, изменяется и не может быть восстановлена, как раньше. Вы должны использовать PNG/TIFF/BMP, PNG является наиболее распространенным.

person FiReTiTi    schedule 28.02.2016