Формат PNG
Portable Network Graphics
Структура на основі чанків
PNG має один із найохайніших форматів файлів узагалі. Усе розкладено по «чанках»: самодостатніх блоках із типом, даними й контрольною сумою. Найелегантніше те, що декодери можуть пропускати незрозумілі їм чанки, завдяки чому PNG підтримує метадані й не ламає старіші програми.
Уся хитрість у назвах чанків: якщо перша літера велика, чанк «критичний» (без нього зображення не покажеться). Мала літера означає «допоміжний»: приємно мати, але не обовʼязково. Усі чанки з метаданими, які нас цікавлять, є допоміжними, тому ми й можемо їх безпечно видаляти.
Структура файлу PNG
Сигнатура PNG та IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Будова чанка
Як іменуються типи чанків
- • перша літера велика = критичний чанк (програма мусить його розуміти)
- • перша літера мала = допоміжний чанк (необовʼязковий, можна ігнорувати)
- • друга літера = загальний (велика) чи приватний (мала)
Критичні чанки
Ці чанки мають бути присутні й зрозумілі програмі, інакше зображення недійсне. 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.
zTXt:стиснений текст
Те саме, що tEXt, але зі стисненням zlib. Використовується для довших текстів.
iTXt:міжнародний текст
Текст у UTF-8 із необовʼязковим стисненням. Підтримує мовні теги й перекладені ключові слова. Використовується для метаданих XMP.
XML:com.adobe.xmp\0eXIf:дані 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
Перевіряємо сигнатуру
Шукаємо сигнатуру PNG: 89 50 4E 47 0D 0A 1A 0A
Розбираємо чанки
Читаємо довжину й тип кожного чанка та перевіряємо CRC
Відсіюємо чанки з метаданими
Знаходимо й пропускаємо чанки tEXt, zTXt, iTXt, eXIf, tIME
Збираємо файл заново
Записуємо сигнатуру + відібрані чанки + IEND
Чанки, що зберігаються
- • IHDR, PLTE, IDAT, IEND (критичні)
- • sRGB, gAMA, cHRM (колір)
- • iCCP (колірний профіль, за бажанням)
- • pHYs (розміри пікселів)
- • tRNS (прозорість)
Чанки, що видаляються
- • tEXt (текстові метадані)
- • zTXt (стиснений текст)
- • iTXt (міжнародний текст, XMP)
- • eXIf (дані EXIF)
- • tIME (час зміни)