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

PNG-файлы:

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

  1. Подпись
  2. Несколько блоков (чанков\chunks)

Структура png-файла

Подпись файла: Подпись png-файла всегда одинакова и состоит из 8 бит и представляет собой: 89 50 4E 47 0D 0A 1A 0A где:

  • 89 - non-ASCII символ. Препятствует распознаванию PNG, как текстового файла, и наоборот
  • 50 4E 47 - PNG в ASCII записи
  • 0D 0A - CRLF (Carriage-return, Line-feed) – возврат каретки и перевод строки (DOS-style)
  • 1A - останавливает вывод файла в DOS режиме (end-of-file) (чтобы избежать вывода изображения в текстовом виде)
  • 0A - LF, перевод строки (Unix-style)

Чанки (chunks): Чанки – блоки данных, из которых состоит файл. Каждый чанк состоит из 4 секций:

  1. Длина (4 байта) – числовое значение длины блока данных
  2. Тип (имя) чанка (4 байта)
  3. Содержание чанка
  4. Контрольная сумма CRC (4 байта)

Структура чанка

Тип: Тип – четыре чувствительные к регистру ASCII-символа. Регистры символов (пятый бит в числовой записи символа) в имени чанка — это флаги, которые сообщают декодеру некоторую дополнительную информацию.

  • Регистр первого символа определяет, является ли данный чанк критическим(верхний регистр) или вспомогательным(нижний регистр).
  • Критические чанки должны распознаваться каждым декодером. Если декодер встречает критический чанк, тип которого не может распознать, он обязан завершить выполнение с ошибкой.
  • Регистр второго символа задает «публичность»(верхний регистр) или «приватность»(нижний регистр) чанка.
  • «Публичные» чанки — официальные, задокументированные, распознаваемые большинством декодеров. Но если вдруг вам для каких-то своих нужд понадобится кодировать специфическую информацию, то просто в имени чанка сделайте второй символ маленьким.
  • Регистр третьего символа оставлен для будущего распознования. Предполагается, что он будет использоваться для дифференциации различных версий стандарта.
  • Для версий 1.0 и 1.1 третий символ должен быть большим. Если он оказался маленьким, все нынешние декодеры должны поступать с чанком, так же как и с любым другим не распознанным (то есть выходить с ошибкой, если чанк критический, или пропускать в противном случае).
  • Регистр четвертого символа означает возможность копирования данного чанка редакторами, которые не могут его распознать.
  • Если регистр нижний, чанк может быть скопирован, вне зависимости от степени модификации файла, иначе (верхний регистр) он копируется только в случае, когда при модификации не были затронуты никакие критические чанки.

Пример:

Пример типа (имени) чанка

Минимальный png-файл: Минимальный png-файл имеет:

  • подпись
  • 3 обязательных чанка: IHDR, IDAT, IEND

IHDR: Блок данных в IHDR содержит следующие поля:

  • Ширина, 4 байта
  • Высота, 4 байта
  • Битовая глубина (bit depth), определяет количество бит на каждый сэмпл (не пиксель), 1 байт
  • Тип цвета, состоит из 3 флагов: 1 (используется палитра), 2 (используется цвет, не монохромное изображение), 3 (присутствует альфа-канал), 1 байт
  • Метод сжатия. На данный момент доступно только значение 0 — сжатие по алгоритму deflate/inflate. Если значение отлично от 0, чанк считается нераспознанным, и декодер рапортует об ошибке. 1 байт
  • Метод фильтрации. Так же, как и в случае сжатия, на данный момент может быть только нулем. 1 байт
  • Interlace(переплетение) метод. Определяет порядок передачи данных. На данный момент доступно 2 значения: 0 (no interlace) и 1 (Adam7 interlace). 1 байт

IEND: Сигнализирует о конце файла, блок данных этого чанка не содержит ничего.

IDAT: Содержит данные, закодированные, в соответствии с полем метода сжатия в заголовке.

Литература: