PicScrub logoPicScrub
Повернутися до форматів

Формат PNG

Portable Network Graphics

Структура на основі чанків

PNG має один із найохайніших форматів файлів узагалі. Усе розкладено по «чанках»: самодостатніх блоках із типом, даними й контрольною сумою. Найелегантніше те, що декодери можуть пропускати незрозумілі їм чанки, завдяки чому PNG підтримує метадані й не ламає старіші програми.

Уся хитрість у назвах чанків: якщо перша літера велика, чанк «критичний» (без нього зображення не покажеться). Мала літера означає «допоміжний»: приємно мати, але не обовʼязково. Усі чанки з метаданими, які нас цікавлять, є допоміжними, тому ми й можемо їх безпечно видаляти.

Структура файлу PNG

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 байт
89 50 4E 47 0D 0A 1A 0A
IHDR
25 байт
Заголовок зображення (обовʼязковий)
Metadata
100 байт
Чанки tEXt, iTXt, eXIf
IDAT
Змінна довжина
Стиснені дані зображення
IEND
12 байт
Маркер кінця зображення

Сигнатура PNG та IHDR

Сигнатура PNG
Довжина IHDR (13)
Тип IHDR
Ширина (256)
Висота (256)
Глибина кольору, тип кольору тощо
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Будова чанка

LengthTypeDataCRC32
4 байти4 байтиЗмінна4 байти

Як іменуються типи чанків

  • • перша літера велика = критичний чанк (програма мусить його розуміти)
  • • перша літера мала = допоміжний чанк (необовʼязковий, можна ігнорувати)
  • • друга літера = загальний (велика) чи приватний (мала)

Критичні чанки

Ці чанки мають бути присутні й зрозумілі програмі, інакше зображення недійсне. PicScrub завжди зберігає критичні чанки.

IHDR:заголовок зображення

Перший чанк після сигнатури. Містить ширину, висоту, глибину кольору, тип кольору, метод стиснення, метод фільтрації та метод черезрядковості. Рівно 13 байтів даних.

IDAT:дані зображення

Містить стиснені (zlib/deflate) дані зображення. Можуть бути розбиті на кілька чанків IDAT. Усі чанки IDAT мають іти один за одним.

IEND:кінець зображення

Позначає кінець потоку даних PNG. Має бути останнім чанком. Не містить жодного байта даних.

PLTE:палітра

Обовʼязковий для зображень з індексованим кольором (тип кольору 3). Містить від 1 до 256 записів палітри RGB.

Чанки з метаданими

Допоміжні чанки, які можуть містити чутливі для приватності метадані. Саме їх PicScrub видаляє.

tEXt:нестиснений текст

Пари «ключ-значення» в кодуванні Latin-1. Типові ключі: Author, Description, Copyright, Creation Time, Software.

Формат: keyword + null + text

zTXt:стиснений текст

Те саме, що tEXt, але зі стисненням zlib. Використовується для довших текстів.

iTXt:міжнародний текст

Текст у UTF-8 із необовʼязковим стисненням. Підтримує мовні теги й перекладені ключові слова. Використовується для метаданих XMP.

Ключове слово XMP: XML:com.adobe.xmp\0

eXIf:дані EXIF

Зареєстрований як розширення PNG у 2017 році. Містить сирі дані EXIF у форматі TIFF, з такою самою структурою, як EXIF у JPEG. Може містити GPS, дату й час, дані про пристрій.

iCCP:колірний профіль ICC

Вбудований колірний профіль ICC. Стиснений за допомогою zlib. PicScrub зберігає його за замовчуванням, щоб кольори лишалися точними.

tIME:час останньої зміни

Сім байтів: рік (2), місяць, день, година, хвилина, секунда. Показує, коли зображення змінювали востаннє.

Чанки, повʼязані з кольором

Ці чанки впливають на відтворення кольору, але зазвичай не містять особистої інформації. PicScrub зберігає їх за замовчуванням.

sRGB

Вказує на колірний простір sRGB. Один байт для способу відтворення.

gAMA

Значення гами як 4-байтове беззнакове ціле (помножене на 100 000).

cHRM

Координати основних кольорів і білої точки.

sBIT

Початкова розрядність вибірки для кожного каналу.

Перевірка CRC32

Кожен чанк PNG містить контрольну суму CRC32, обчислену за типом і даними чанка. Це гарантує цілісність даних.

Обчислення CRC

CRC32 input = chunk_type (4 bytes) + chunk_data (N bytes)
CRC32 output = 4 bytes appended after chunk data

// PNG використовує поліном CRC-32: 0xEDB88320

Навіщо PicScrub перевіряє CRC

Читаючи файли PNG, PicScrub перевіряє CRC кожного чанка, щоб упевнитися в цілісності даних. Пошкоджені чанки обробляються коректно.

Як PicScrub обробляє PNG

1

Перевіряємо сигнатуру

Шукаємо сигнатуру PNG: 89 50 4E 47 0D 0A 1A 0A

2

Розбираємо чанки

Читаємо довжину й тип кожного чанка та перевіряємо CRC

3

Відсіюємо чанки з метаданими

Знаходимо й пропускаємо чанки tEXt, zTXt, iTXt, eXIf, tIME

4

Збираємо файл заново

Записуємо сигнатуру + відібрані чанки + IEND

Чанки, що зберігаються

  • • IHDR, PLTE, IDAT, IEND (критичні)
  • • sRGB, gAMA, cHRM (колір)
  • • iCCP (колірний профіль, за бажанням)
  • • pHYs (розміри пікселів)
  • • tRNS (прозорість)

Чанки, що видаляються

  • • tEXt (текстові метадані)
  • • zTXt (стиснений текст)
  • • iTXt (міжнародний текст, XMP)
  • • eXIf (дані EXIF)
  • • tIME (час зміни)