Формат PNG

Формат PNG (англ. portable network graphics) - растровый формат хранения графической информации, использующий сжатие без потерь по алгоритму Deflate.
PNG был создан как свободный формат (замена GIF), поэтому иногда в Интернете встречается расшифровка в качестве рекурсивного акронима "PNG is Not GIF" (PNG не GIF).
04 января 1995 г., Т. Боутелл предложил в ряде конференций Usenet создать свободный формат, который был бы не хуже GIF (дело в том, что до 11 августа 2006 г. GIF был защищен патентами). Через три недели после публикации идеи были разработаны четыре версии нового формата. Вначале он имел название PBF (Portable Bitmap Format), а нынешнее имя получил 23 января 1995 г. Уже в декабре того же года спецификация PNG версии 0.92 была рассмотрена консорциумом W3C, а с выходом 1 октября 1996 г. версии 1.0 - был рекомендован в качестве полноправного сетевого формата.
Расширение | .png |
MIME-тип | image/png |
Разработчик | PNG Development Group |
Опубликован | 1 октября 1996 г. |
Тип формата | Растровая графика |
Развит в | APNG, JNG, MNG |
Стандарты | ISO 15948, RFC 2083 |
Структура формата
Общее строение
Файл состоит из подписи (Signature) и некоторого количества блоков (Chunk), которые содержат информацию о изображении.
8 байт | n байт |
PNG Signature | Chunks |
Подпись файла (Signature)
Подпись файла всегда одинакова у всех файлов этого типа, состоит из 8 Б. Она нужна, чтобы программы могли определить устройство файла по его содержимому (в частности по подписи).
Signature | HEX |
89 50 4E 47 0D 0A 1A 0A |
- 89 - Символ не существующий (таблица ASCII). Препятствует распознаванию структуры, как текстового файла.
- 50 4E 47 - "PNG" (ASCII запись).
- 0D 0A - CRLF (Carriage-return, Line-feed), перевод строки (DOS).
- 1A - Останавливает вывод файла в DOS (end-of-file), чтобы не выводился текст.
- 0A - LF, перевод строки (Unix).
Блоки данных (Chunks)
Chunks (чанки) - это блоки данных, описывающих записанное изображение, из которых состоит файл. Каждый чанк состоит из 4 секций.
4 байта | 4 байта | Length байт | 4 байта |
Length (Длина) | Тип (имя) чанка | Содержание блока | CRC |
- Длина - Число, описывающее объем содержания блока.
- Тип представляет собой 4 чувствительных к регистру ASCII-символа. Регистры символов (пятый бит, числовая запись символа) в имени различаются неспроста - это флаги, сообщающие декодеру некоторую дополнительную информацию.
- Регистр первого символа определяет является ли данный чанк критическим (верхний регистр) или вспомогательным. Критические чанки должны распознаваться каждым декодером. Если декодер не может распознать критический чанк, он обязан завершить выполнение с ошибкой.
- Регистр второго символа задает "публичность" (верхний регистр) или "приватность" чанка. "Публичные" - официальные, задокументированные, распознаваемые большинством декодеров. Но если понадобится кодировать специфическую информацию, то просто в имени нужно сделать второй символ маленьким.
- Регистр третьего символа оставлен на "будущее". Предполагается, что он будет использоваться для дифференциации различных версий стандарта. Третий символ должен быть большим (версия 1.0 и 1.1). Если он оказался маленьким, все нынешние декодеры должны поступать с чанком, так же как и с любым другим не распознанным (то есть выходить с ошибкой если чанк критический, или пропускать в противном случае).
- Регистр же четвертого символа означает возможность копирования данного чанка редакторами, которые не могут его распознать. Если регистр нижний, чанк может быть скопирован, вне зависимости от степени модификации файла, иначе (верхний регистр) он копируется только, когда при модификации не были затронуты никакие критические чанки.
Например:
Не критический чанк, если не распознается, можно пропустить | Публичный, задокументированный, будет распознаваться почти всеми декодерами | Версия стандарта 1.0 или 1.1 | Безопасен для копирования. Будет скопирован, даже если изменения коснулись критических чанков. |
i | T | X | t |
Критические:
- IHDR - заголовок файла, содержит основную информацию. Обязан быть первым.
- PLTE - палитра, список цветов.
- IDAT - содержит, собственно, картинку. Рисунок можно разбить на несколько IDAT чанков, для потоковой передачи. Каждый файлй должен содержать хотя бы один IDAT.
- IEND - завершающий чанк, обязан быть последним.
Вспомогательные:
- bKGD - задает основной фоновый цвет.
- cHRM - задаёт CIE 1931 цветовое пространство.
- gAMA - определяет гамму.
- hIST - чанк может хранить гистограмму или общее содержание каждого цвета.
- iCCP - цветовой профиль ICC
- iTXt - содержит текст (UTF-8), возможно сжатый, с необязательной языковой меткой. iTXt чанк с ключевым словом 'XML:com.adobe.xmp' может содержать Extensible Metadata Platform (XMP).
- pHYs - содержит предполагаемый размер пикселя и/или отношение сторон.
- sBIT (significant bits) - определяет "цветовую точность" (color-accuracy) изображения (черно-белое, полный цвет, черно-белое с прозрачностью и т.д.), для более простого декодирования.
- sPLT - предлагает использовать палитру, если полный спектр цветов недоступен.
- sRGB - свидетельствует о использовании стандартной sRGB схемы.
- sTER - индикатор стереоскопических представлений.
- tEXt - может содержать текст (ISO/IEC 8859-1), с одной name=value парой.
- tIME - хранит дату последнего изменения.
- tRNS - содержит информацию о прозрачности.
- zTXt - сжатый текст, с теми же ограничениям, что и tEXt.
CRC
Контрольная сумма CRC-32. (Циклический избыточный код (англ. Cyclic redundancy check) - алгоритм нахождения контрольной суммы, предназначенный проверять целостность данных. CRC является практическим приложением помехоустойчивого кодирования, основанном на определенных математических свойствах циклического кода.)
Минимальный PNG
Как видно из представленного выше большинство чанков не является обязательными. Для формирования "полноценного" файла необходимо иметь минимальный набор блоков:
PNG Signature | IHDR | IDAT | IEND |
IHDR
Блок данных IHDR содержит следующие поля:
- Ширина, 4 Б.
- Высота, 4 Б.
- Битовая глубина (bit depth), определяет количество бит на каждый сэмпл (не пиксель), 1 Б.
- Тип цвета, состоит из 3 флагов 1 (используется палитра), 2 (используется цвет, не монохромное изображение), and 4 (присутствует альфа-канал), 1 Б.
- Метод сжатия. На данный момент доступно только значение 0 - сжатие по алгоритму deflate. Если значение отлично от 0, чанк считается нераспознанным, и декодер рапортует об ошибке. 1 Б.
- Метод фильтрации. Так же, как и в случае сжатия, на данный момент может быть только нулем. 1 Б.
- Interlace(переплетение) метод. Определяет порядок передачи данных. На данный момент доступно 2 значения: 0 (no interlace) и 1 (Adam7 interlace). 1 Б.
IDAT
Содержит данные, закодированные, в соответствии с полем метода сжатия.
IEND
Сигнализирует о конце файла, блок данных не содержит ничего.
Пример
Разберем изображение в HEX-редакторе. (276 Б)

- Signature 8 Б. Как и говорилось ранее она всегда одинаковые.
- IHDR 25 Б. Критический, пропускать нельзя, публичный, задокументированный, будет распознаваться почти всеми декодерами, версия стандарта 1.0 или 1.1.
00 00 00 0D - длина блока 9 Б
49 48 44 52 - "IHDR" (ASCII запись)
00 00 00 28 - ширина 40px
00 00 00 28 - высота 40px
08 - битовая глубина 8
06 - используется палитра
00 - сжатие по алгоритму deflate
00 - метод фильтрации, на данный момент всегда 0
00 - interlace метод. No interlace - IDAT 231 Б
- IEND 12 Б
Список источников