Как получить доступ к байту данных изображения JPEG для его шифрования? - PullRequest
0 голосов
/ 04 мая 2019

Для проекта мне нужно зашифровать байты данных изображения JPEG, чтобы показать как зашифрованное, так и дешифрованное изображение.Раньше я делал это легко в формате BMP, пропуская 1078 байт, а затем зашифрованный остаток.Но для JPEG это намного сложнее.Я обнаружил, что JPEG имеет 20 байтовых маркеров , но когда я пропускаю 20 байтов вместо 1078, я не вижу зашифрованное изображение, как я это делал с BMP.

Так что вы можете сказать мне, как можноЯ получаю доступ к байту данных в формате JPEG, чтобы зашифровать его?

Примечание. Код намного больше, поэтому я не могу опубликовать весь код.Информация о том, как получить доступ к байту данных в формате JPEG, будет достаточной.

1 Ответ

1 голос
/ 05 мая 2019

Формат JPEG намного сложнее, чем простой растр. В дополнение к данным изображения, JPEG может содержать комментарии, метаданные и, возможно, некоторую другую информацию, о которой я не знаю. (Изображения с камеры почти наверняка содержат метаданные, например, где и когда было сделано изображение.) За байтами заголовка есть структура. Если вы хотите изменить данные в формате JPEG и получить в результате действительный JPEG, вам нужно будет иметь возможность читать и записывать структуру JPEG.

Как я понимаю - ndash; и мое понимание далеко не полное & ndash; файл JPEG состоит из последовательности сегментов. Каждый сегмент начинается с байта маркера FF, за которым следует байт, который указывает, что это за сегмент. Для некоторых видов сегментов за этим следуют два байта, указывающие длину данных сегмента (длина включает байты длины, но не включает байты маркера и вида). Например, файл начинается с сегмента FF D8, 2-байтового сегмента (без байтов длины), который указывает начало изображения. Далее следует еще один сегмент. На странице, на которую вы ссылаетесь, приведены примеры данных, где следующий сегмент является сегментом приложения: FF E0, за которым следуют 16 байтов данных. Откуда вы знаете, что есть 16 байтов данных? Первые два из этих байтов 00 10, что составляет 16 в десятичном виде. После этого появляется еще один маркер FF, сигнализирующий о другом сегменте.

FF D8
FF E0 00 10 4A 46 49 46 00 01 01 01 00 48 00 48 00 00
FF DB 00 43 [65 bytes of data]
...

Чтобы сохранить формат JPEG, вам следует обработать файл в разрезе сегментов. Отбросьте идею наличия (20-байтового) заголовка файла; есть просто последовательность сегментов. Некоторые из сегментов играют роль данных заголовка и не должны изменяться без более глубокого понимания формата. Другие сегменты содержат данные, которые вы хотите изменить. Я думаю, что сегменты, которые вас интересуют, - это кадры, которые являются видами от C0 до CF минус C4 и CC. Эти сегменты имеют данные переменной длины, поэтому их данные начинаются с двухбайтовой длины. Если вам повезет, изменение только данных в этих сегментах даст вам нужные результаты. Если вам не повезло, в этих данных есть критическая дополнительная структура, о которой я не знаю, и ваши изменения повредят эту структуру.

Что вы можете сделать, это отсканировать файл в поисках байта маркера, FF. Посмотрите на байт после этого. Это вид, который вы хотите изменить? Если нет, просто копируйте байты, пока не дойдете до следующего маркера. Если это вид изменения, прочитайте следующие два байта, чтобы получить длину данных. Затем прочитайте (длина-2) байта, помня, что вы уже прочитали 2 байта. Это данные для обработки. После обработки пересчитайте длину, затем запишите сегмент (FF, затем тип, затем новая длина, а затем измененные данные). Продолжайте, пока не закончится файл для обработки.

Имеется в виду сложность, на которую намекнул "пересчитать длину". Если байт FF появляется где-то в измененных данных, вам нужно пометить его как не маркер, вставив нулевой байт 00 после него. Это один из способов изменить длину.

Если вы все еще подписаны, возможно, вам удастся это осуществить. Я могу указать вам копию стандарта JPEG , который является грубым чтением. Тем не менее, он имеет список видов сегментов в своей таблице B.1 (36-я страница, но пронумерован 32). Помните, что ваше шифрование - это файл, а не изображение. Для расшифровки данных вам понадобится зашифрованный файл, а не просто изображение, которое он создает.

...