Що таке файл PNG?
Файл PNG (Portable Network Graphics) — це формат растрового зображення, який використовує стиснення без втрат. Цей формат файлу було створено як заміну формату Graphics Interchange Format (GIF) і не має обмежень щодо авторських прав. Однак формат файлу PNG не підтримує анімацію. Формат файлу PNG підтримує стиснення зображень без втрат, що робить його популярним серед користувачів. З плином часу PNG перетворився на один із широко використовуваних форматів файлів зображень.
Коротка історія формату файлів PNG
Основною причиною створення формату файлу PNG був запатентований алгоритм стиснення Лемпеля-Зіва-Велча, який використовувався у форматі файлу GIF. Це разом з іншими обмеженнями GIF створило необхідність заміни формату файлу GIF. Перша пропозиція та назва формату файлу PNG надійшли в січні 1995 року. Нижче наведено ключові події щодо форматів файлів PNG:
- Жовтень 1996: було випущено версію 1.0 специфікацій PNG, яка пізніше з’явилася як RFC 2083. Те саме стало рекомендацією W3C у жовтні 1996 року.
- Грудень 1998: була випущена версія 1.1 з деякими невеликими змінами та додаванням трьох нових блоків.
- Серпень 1999: випущено версію 1.2, додавши один додатковий шматок.
- Листопад 2003: PNG став міжнародним стандартом (ISO/IEC 15948:2003). Ця версія PNG лише трохи відрізняється від версії 1.2 і не додає нових блоків.
- Березень 2004: ISO/IEC 15948:2004
Функціональне порівняння GIF і PNG
Формат файлу PNG був розроблений як простий і портативний, юридично необтяжений, взаємозамінний, гнучкий і надійний. У наведеній нижче таблиці наведено функції GIF, успадковані форматом файлу PNG, окрім нових функцій.
Функція | GIF | PNG |
---|---|---|
Індексно-кольорові зображення до 256 кольорів | Так | Так |
Підтримка потокової передачі | Так | Так |
Прозорість | Так | Так |
Додаткова інформація | Так | Так |
Незалежність від обладнання та платформи | Так | Так |
Діюча | Так | Так |
Зображення Truecolor до 48 біт на піксель | Ні | Так |
Зображення у відтінках сірого до 16 біт на піксель | Ні | Так |
Повний альфа-канал (загальні маски прозорості) | Ні | Так |
Інформація про гамму зображення | Ні | Так |
Надійність | Ні | Так |
Швидша початкова презентація | Ні | Так |
Файлова структура PNG
Майже всі операційні системи підтримують відкриття файлів PNG. Наприклад, засіб перегляду Microsoft Windows має можливість відкривати файли PNG, оскільки ОС за замовчуванням підтримує підтримку, доступну як частину встановлення. Файл PNG складається з підпису
PNG, за яким слідує серія //фрагментів//.
Заголовок файлу PNG
Перші вісім байтів файлу PNG завжди містять такі (десяткові) значення:
{{{137 80 78 71 13 10 26 10 }}}
Цей підпис вказує на те, що залишок файлу містить одне зображення PNG, яке складається з послідовності фрагментів, починаючи з фрагмента IHDR і закінчуючи фрагментом IEND.
шматочки
Кожен чанк складається з чотирьох частин:
Довжина: 4-байтове ціле число без знаку, що вказує кількість байтів у полі даних блоку. Довжина враховує лише поле даних, а не його самого, код типу послідовності або CRC. Нуль є дійсною довжиною. Хоча кодери та декодери повинні розглядати довжину як беззнакову, її значення не повинно перевищувати 231 байт.
Тип блоку: 4-байтовий код типу блоку. Для зручності в описі та дослідженні файлів PNG коди типів обмежено складатися з великих і малих літер ASCII (AZ і az, або 65-90 і 97-122 десяткові). Однак кодери та декодери повинні розглядати коди як фіксовані двійкові значення, а не рядки символів. Наприклад, було б неправильно представляти код типу IDAT еквівалентами цих букв EBCDIC. Додаткові угоди про іменування типів блоків обговорюються в наступному розділі.
Дані блоку: Байти даних, що відповідають типу блоку, якщо такі є. Це поле може мати нульову довжину.
CRC: 4-байтовий CRC (перевірка циклічної надлишковості), обчислений на основі попередніх байтів у послідовності, включаючи код типу послідовності та поля даних послідовності, але не включаючи поле довжини. CRC присутній завжди, навіть для блоків, які не містять даних.
Довжина даних блоку може становити будь-яку кількість байтів до максимальної; отже, розробники не можуть припускати, що фрагменти вирівняні за будь-якими межами, більшими за байти.
Блоки можуть з’являтися в будь-якому порядку, відповідно до обмежень, накладених на кожен тип фрагментів. (Одне важливе обмеження полягає в тому, що IHDR має з’явитися першим, а IEND — останнім; таким чином фрагмент IEND служить маркером кінця файлу.) Можуть з’явитися кілька фрагментів одного типу, але лише якщо це спеціально дозволено для цього типу.
Типи фрагментів
Типи фрагментів класифікуються на Критичні та Допоміжні блоки на основі 4-байтового чутливого до регістру значення ASCII, призначеного типу блоку. Усі реалізації повинні розуміти та успішно відтворювати стандартні критичні блоки. Дійсне зображення PNG має містити фрагмент IHDR, один або кілька блоків IDAT і фрагмент IEND.
Стиснення
Метод стиснення PNG 0 (єдиний метод стиснення, визначений на даний момент для PNG) визначає стиснення за допомогою ковзного вікна розміром не більше 32768 байт. Стиснення Deflate — це похідна версія LZ77, яка використовується в zip, gzip, pkzip і пов’язаних програмах. Були проведені численні дослідження, що підтверджують його безпатентний статус. Стиснуті дані в потокі даних zlib зберігаються у вигляді серії блоків, кожен з яких може представляти необроблені (нестиснені) дані, стиснуті за допомогою LZ77 дані, закодовані фіксованими кодами Хаффмана, або стиснуті за допомогою LZ77 дані, закодовані за допомогою спеціальних кодів Хаффмана. Біт маркера в останньому блоці ідентифікує його як останній блок, що дозволяє декодеру розпізнати кінець стисненого потоку даних.
Фільтрація попереднього стиснення
Фільтри попереднього стиснення застосовуються для підготовки даних зображення до оптимального стиснення. Метод фільтрації PNG визначає п’ять основних типів фільтрів:
Тип фільтра | Ім’я | Передбачуване значення |
---|---|---|
0 | Жодного | Рядок сканування передається без змін |
1 | Sub | Передає різницю між кожним байтом і значенням відповідного байта попереднього пікселя. |
2 | Up | Фільтр Up() схожий на фільтр Sub(), за винятком того, що піксель безпосередньо над поточним пікселем, а не ліворуч від нього, використовується як предиктор. |
3 | Середнє | Фільтр Average() використовує середнє значення двох сусідніх пікселів (ліворуч і вище), щоб передбачити значення пікселя. |
4 | Paeth | Фільтр Paeth() обчислює просту лінійну функцію трьох сусідніх пікселів (ліворуч, угорі, вгорі ліворуч), а потім вибирає як предиктор сусідній піксель, найближчий до обчисленого значення. |
Алгоритми фільтрації застосовуються до байтів
, а не до пікселів, незалежно від бітової глибини або типу кольору зображення. Алгоритми фільтрації працюють над послідовністю байтів, утвореною скан-рядком. Якщо зображення містить альфа-канал, альфа-дані фільтруються так само, як і дані зображення.
Коли зображення є черезрядковим, кожен прохід шаблону черезрядкової розгортки розглядається як окреме зображення з метою фільтрації. Фільтри працюють на послідовностях байтів, утворених пікселями, фактично переданими під час проходу, і «попередній рядок сканування» — це рядок, який раніше був переданий у тому самому проході, а не сусідній у повному зображенні. Зауважте, що допоміжне зображення, яке передається за один прохід, завжди прямокутне, але має меншу ширину та/або висоту, ніж повне зображення. Фільтрування не застосовується, якщо це допоміжне зображення порожнє.