Рейтинг:2

Получить пиксельные данные из JPG/JPEG, но сохранить целостность?

флаг in

Насколько я знаю, JPG — это формат сжатия изображений с потерями.

Между тем, BMP — это обычно несжатый формат изображения, файловая структура которого состоит из bitmapFileHeader (14 байтов) и bitmapInfoHeader (40 байтов), остальная часть которых представляет собой данные пикселей.

Поэтому мне просто нужно передать первые 54 байта и сохранить их как переменную HEADER, а остальные сохранить в переменной PIXELDATA.

В этом состоянии я могу свободно шифровать и расшифровывать PIXELDATA, а также рекомбинировать их с HEADER. Так что целостность файла сохраняется.

Но в случае с JPG все иначе. Я хотел бы попробовать прочитать пиксели вручную, но я не знаю, в какой позиции находятся байты индекса (в отличие от BMP, который пропускает 54 байта).

Я использую Python с различными библиотеками, такими как PIL или Numpy. Оба смогли прочитать пиксели, но при сохранении в виде нового файла JPG он отличался от оригинала тем, что:

  1. Сравнение контрольных сумм SHA-256.
  2. Различные размеры файлов.
  3. Некоторые цвета пикселей меняются по сравнению с оригиналом, если вы посмотрите на него более подробно.

Мой вопрос: есть ли другой способ прочитать пиксельные данные файла JPG, но при этом обеспечить целостность исходного файла JPG при сохранении в новом файле JPG (такая же контрольная сумма, размеры файла и цвет пикселя)?

knaccc avatar
флаг es
Я думаю, что ваш вопрос можно упростить так: есть ли способ создать файл JPG, который можно многократно сжимать и распаковывать без изменения пикселей? Или, может быть, вы просто хотите узнать, как поместить другой заголовок в существующий файл JPG без необходимости распаковывать и повторно сжимать пиксели.
DannyNiu avatar
флаг vu
J2K можно использовать без потерь. Если вы можете найти библиотеку, которая выполняет детерминированное кодирование JPEG2000 и этот формат совместим с вашими приложениями, то я думаю, что проблема решена.
флаг ph
Вы упоминаете шифрование в своем вопросе, но похоже, что это действительно вопрос о форматах изображений.
флаг ph
И есть очевидный комментарий, что самый простой способ не сохранять другую версию — не сохранять ее вообще. Можете ли вы отслеживать, есть ли у вас какие-либо изменения, которые вы хотите сохранить? В противном случае сжатие с потерями будет сжимать с потерями.
Gilles 'SO- stop being evil' avatar
флаг cn
Я голосую за закрытие этого вопроса, потому что он касается форматов изображений и сжатия. Безопасность не задействована.
Рейтинг:1
флаг jp

В JPG пиксели не сохраняются. Они выводятся во время выполнения, когда пользователь читает файл. Сохраняются некоторые коэффициенты изменения цвета в данном блоке, например, 8 на 8 пикселей.

Сохраняемые данные, эти факторы, содержат значительно меньше информации, чем пиксели.

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

Это для большинства случаев использования JPG. Вы можете попробовать несколько чрезмерных форматов, которые хранят больше данных на пиксель, сравнимых с BMP. Тогда ищите JPG без потерь.Имейте в виду, что многие онлайн-сервисы повторно сжимают изображение. Разрушение ваших данных в процессе.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.