Skip to content

Cтруктура хранения png файлов

Nastya Birillo edited this page Oct 29, 2015 · 5 revisions

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: Содержит данные, закодированные, в соответствии с полем метода сжатия в заголовке.

Литература:

Разработка

  1. Стили кодирования
  • [Java](Код стайл для языка Java)
  • [C/C++](Стиль написания кода на С )
  • [C#](Стиль написания кода на С# )
  • [Swift](Руководство по оформлению кода на языке Swift )
  • Написание комментариев к коммитам
  1. Android
  • Android DevGuide
  • [QR codes](Работа c QR на Android)
  • [Полезные вещи](Полезные вещи для Android разработки)
  • [Архитектура приложения](Архитектура приложения)
  • [Используемые компоненты](Используемые компоненты)
  • [Инструкция по сборке проекта](Инструкция по сборке проекта)
  1. iOS
  1. C и C++
  • [Использование CMake для проектов на C++ и C ](Использование CMake для проектов на C и CPP)

Описание

  1. Форматы файлов
  • [.bmp](Cтруктура хранения bmp файлов)
  • [.jpg](Cтруктура хранения jpg файлов)
  • [.png](Cтруктура хранения png файлов)
  1. Алгоритмы шифрования
  1. Примеры использования
  • [Библиотека матричной алгебры](Пример использования библиотеки матричной алгебры)
  1. Описание процесса кодирования файла
  2. Способ обезопасить использование приложения
  3. Java фасад библиотеки алгоритмов
  4. Алгоритм шифрования bmp на java заглушке

Тест-кейсы

  1. Матричная арифметика
  • [A+B](Сложение матриц)
  • [A*p](Умножение матрицы на скаляр)
  • [A*B](Умножение матриц)
  • [Обратные матрицы](Нахождение обратной матрицы)
  1. Взятие по модулю
  • [A mod p](Взятие матрицы по модулю простого числа)
  • [A mod P](Взятие матрицы по модулю - матрицы из простых чисел)
  1. Суперпозиция (модуль - простое число)
  • [A+B mod p](Сложение матриц по модулю простого числа)
  • [A*c mod p](Умножение матрицы на скаляр по модулю простого числа)
  • [A*B mod p](Умножение матриц по модулю простого числа)
  1. Суперпозиция (модуль - матрицы из простых чисел)
  • [A+B mod P](Сложение матриц по модулю - матрице простых чисел)
  • [A*c mod P](Умножение матрицы на скаляр по модулю - матрице простых чисел)
  • [A*B mod P](Умножение матриц по модулю - матрице простых чисел)

##Прочее

  1. [Утечки памяти](Memory Leaks)
  2. [Базовые цвета](Базовые цвета)
  3. [Clean Architecture](Clean Architecture)
Clone this wiki locally