Cтруктура хранения jpg файлов - lanit-tercom-school/grouplock GitHub Wiki

JPG-файлы

JPEG - метод сжатия, позволяющий сжимать данные полноцветных многоградационных изображений с глубиной от 6 до 24 бит/пиксель с достаточно высокой скоростью и эффективностью.

Структура jpg-файла:

jpg-файл представляется потоком бит. jpg-файл состоит из маркеров.

Маркер имеет следующую структуру:

  1. Идентификатор – два байта, которые указывают на тип маркера
  2. Длинна – два байта, которые содержат длину данных маркера в байтах (обратный порядок) и собственную длину. Т.е. если данные маркера имеют длину 10 байт, то значение длинны будет равно 10 (длинна данных маркера) + 2 (два байта со значением длинны) = 12.
  3. Данные маркера – набор байт, требующих обработки в соответствии с типом маркера.

Структура jpg -маркера:

Структура jpg -маркера

Важно, что маркеры, описывающие структуру jpg-файла, не имеют подмаркеров. Также любой jpg-файл ВСЕГДА начинается с FF16 и D816. Маркеры TEM, RST0…RST7, SOI, EOI не имеют длинны и данных маркера и, следовательно, состоят из двух байт. Все двухбайтовые величины в файлах формата JPEG имеют обратный порядок. Ниже представлена таблица с идентификаторами всех возможных маркеров, встречаемых при декодировании jpg-файлов. В ней:

  • зеленый цвет – маркеры, которые практически всегда встречаются в jpg-файле и требуют обязательной обработки
  • желтый цвет – часто встречающиеся маркеры, которые не требуют обязательной обработки для получения изображения
  • остальные – в 90% случаев не встречаются в jpg-файлах и не требуют никакой обработки

Правила размещения маркеров в jpg-файле:

  1. Файл всегда начинается с маркера SOI и заканчивается маркером EOI
  2. Если данные из одного маркера нужны для обработки второго маркера, первый маркер должен располагаться до второго
  3. Сжатые данные компонентов не встречаются внутри маркера. Они всегда следуют сразу после маркера SOS. Т.к. в нем нет информации о длине, необходимо просканировать данные до следующего маркера (отличного от RSTN), чтобы найти конец сжатых данных без их восстановления
  4. Маркеры RSTN встречаются внутри сжатых данных, но не встречаются в маркерах

Алгоритм обработки данных JPEG: JPEG основан на схеме кодирования, базирующейся на дискретных косинус-преобразованиях (DCT). Алгоритмы, базирующиеся на DCT, стали основой различных методов сжатия. Эти алгоритмы сжатия базируются не на поиске одинаковых атрибутов пикселей, а на разнице между ними. В силу своей природы они всегда кодируют с потерями, но способны обеспечить высокую степень сжатия при минимальных потерях данных. Схема JPEG эффективна только при сжатии многоградационных изображений, в которых различия между соседними пикселями, как правило, весьма незначительны. Практически JPEG хорошо работает только с изображениями, имеющими глубину хотя бы 4 или 5 битов/пиксель на цветовой канал. Процесс сжатия по схеме JPEG включает ряд этапов (рисунок ниже):

  • Преобразование изображения в оптимальное цветовое пространство.
  • Субдискретизация компонентов цветности усреднением групп пикселей.
  • Применение дискретных косинус-преобразований для уменьшения избыточности данных изображения.
  • Квантование каждого блока коэффициентов DCT с применением весовых функций, оптимизированных с учетом визуального восприятия человеком.
  • Кодирование результирующих коэффициентов (данных изображения) с применением алгоритма Хаффмена для удаления избыточности информации.

Процесс сжатия по схеме JPEG

Особенности при шифровании: При шифровании jpg-файлов информацию о том, зашифрован файл или нет можно хранить следующим образом:

  • EXIF тэг. У JPEG формата есть поддержка EXIF тэга. Данные в этом тэге хранятся парами ключ=значение. Добавляем туда какой то не стандартный ключ содержащий флаг. Программа работающая с этим тэгом, наткнувшись на этот ключ, скорей всего просто проигнорирует его и не отобразит.

Способы шифрования:

  1. Визуальная криптография. Описание в статье: http://habrahabr.ru/post/115673/. Разве что вместо текста берем биты jpg-файла.
  2. Если достать RGB-матрицу изображения, то все виды шифрования, связанные с ней. См. Cтруктура хранения bmp файлов - способы шифрования.
  3. Шифрование матриц коспонент на этапе декодирования (доступно в файле decoding_jpg.pdf в Attachments/file_structure)

Литература: