Cтруктура хранения jpg файлов - lanit-tercom-school/grouplock GitHub Wiki
JPG-файлы
JPEG - метод сжатия, позволяющий сжимать данные полноцветных многоградационных изображений с глубиной от 6 до 24 бит/пиксель с достаточно высокой скоростью и эффективностью.
Структура jpg-файла:
jpg-файл представляется потоком бит. jpg-файл состоит из маркеров.
Маркер имеет следующую структуру:
- Идентификатор – два байта, которые указывают на тип маркера
- Длинна – два байта, которые содержат длину данных маркера в байтах (обратный порядок) и собственную длину. Т.е. если данные маркера имеют длину 10 байт, то значение длинны будет равно 10 (длинна данных маркера) + 2 (два байта со значением длинны) = 12.
- Данные маркера – набор байт, требующих обработки в соответствии с типом маркера.
Структура jpg -маркера:
Важно, что маркеры, описывающие структуру jpg-файла, не имеют подмаркеров. Также любой jpg-файл ВСЕГДА начинается с FF16 и D816. Маркеры TEM, RST0…RST7, SOI, EOI не имеют длинны и данных маркера и, следовательно, состоят из двух байт. Все двухбайтовые величины в файлах формата JPEG имеют обратный порядок. Ниже представлена таблица с идентификаторами всех возможных маркеров, встречаемых при декодировании jpg-файлов. В ней:
- зеленый цвет – маркеры, которые практически всегда встречаются в jpg-файле и требуют обязательной обработки
- желтый цвет – часто встречающиеся маркеры, которые не требуют обязательной обработки для получения изображения
- остальные – в 90% случаев не встречаются в jpg-файлах и не требуют никакой обработки
Правила размещения маркеров в jpg-файле:
- Файл всегда начинается с маркера SOI и заканчивается маркером EOI
- Если данные из одного маркера нужны для обработки второго маркера, первый маркер должен располагаться до второго
- Сжатые данные компонентов не встречаются внутри маркера. Они всегда следуют сразу после маркера SOS. Т.к. в нем нет информации о длине, необходимо просканировать данные до следующего маркера (отличного от RSTN), чтобы найти конец сжатых данных без их восстановления
- Маркеры RSTN встречаются внутри сжатых данных, но не встречаются в маркерах
Алгоритм обработки данных JPEG: JPEG основан на схеме кодирования, базирующейся на дискретных косинус-преобразованиях (DCT). Алгоритмы, базирующиеся на DCT, стали основой различных методов сжатия. Эти алгоритмы сжатия базируются не на поиске одинаковых атрибутов пикселей, а на разнице между ними. В силу своей природы они всегда кодируют с потерями, но способны обеспечить высокую степень сжатия при минимальных потерях данных. Схема JPEG эффективна только при сжатии многоградационных изображений, в которых различия между соседними пикселями, как правило, весьма незначительны. Практически JPEG хорошо работает только с изображениями, имеющими глубину хотя бы 4 или 5 битов/пиксель на цветовой канал. Процесс сжатия по схеме JPEG включает ряд этапов (рисунок ниже):
- Преобразование изображения в оптимальное цветовое пространство.
- Субдискретизация компонентов цветности усреднением групп пикселей.
- Применение дискретных косинус-преобразований для уменьшения избыточности данных изображения.
- Квантование каждого блока коэффициентов DCT с применением весовых функций, оптимизированных с учетом визуального восприятия человеком.
- Кодирование результирующих коэффициентов (данных изображения) с применением алгоритма Хаффмена для удаления избыточности информации.
Особенности при шифровании: При шифровании jpg-файлов информацию о том, зашифрован файл или нет можно хранить следующим образом:
- EXIF тэг. У JPEG формата есть поддержка EXIF тэга. Данные в этом тэге хранятся парами ключ=значение. Добавляем туда какой то не стандартный ключ содержащий флаг. Программа работающая с этим тэгом, наткнувшись на этот ключ, скорей всего просто проигнорирует его и не отобразит.
Способы шифрования:
- Визуальная криптография. Описание в статье: http://habrahabr.ru/post/115673/. Разве что вместо текста берем биты jpg-файла.
- Если достать RGB-матрицу изображения, то все виды шифрования, связанные с ней. См. Cтруктура хранения bmp файлов - способы шифрования.
- Шифрование матриц коспонент на этапе декодирования (доступно в файле decoding_jpg.pdf в Attachments/file_structure)
Литература:
-
Работаем с метаданными в файлах цифровых фотографий http://www.videozona.ru/photo_tests/reviews/WorkWithExif/WorkWithExif_page01.asp - раздел "Коротко о главном"
-
ИСТОРИЯ СОЗДАНИЯ, УСТРОЙСТВО, СТРОЕНИЕ И ПРИМЕНЕНИЕ ГРАФИЧЕСКОГО ФОРМАТА JPEG http://kolpinkurs.ru/stati/jpeg.htm
-
Пример декодирования JPEG http://habrahabr.ru/post/102521/
-
Изобретаем JPEG http://habrahabr.ru/post/206264/