Як PNG без втрат, враховуючи, що він має параметр стиснення?


156

Кажуть, що файли PNG використовують стиснення без втрат. Однак щоразу, коли я перебуваю в редакторі зображень, наприклад GIMP, і намагаюся зберегти зображення у форматі PNG-файлу, він запитує параметр стиснення, який знаходиться в діапазоні від 0 до 9. Якщо він має параметр стиснення, який впливає на візуальну точність стиснене зображення, як це робить PNG без втрат?

Чи отримую я поведінку без втрат лише тоді, коли встановлюю параметр стиснення на 9?


40
Більшість алгоритмів стиснення без втрат мають налаштування (наприклад, розмір словника), які узагальнені в повзунку "скільки зусиль потрібно докласти для мінімізації розміру виводу". Це дійсно для ZIP, GZip, BZip2, LZMA, ...
Daniel B

20
Питання можна було б задати інакше. Якщо від стиснення не втрачається якість, то чому б не завжди використовувати компресію, створюючи найменший розмір? Відповідь тоді буде, тому що для стиснення та декомпресії потрібно більше оперативної пам’яті та більше процесорного часу. Іноді потрібно швидше стиснення і не так сильно піклується про коефіцієнт стиснення.
kasperd

14
Стиснення PNG майже ідентично ZIPip-файлам. Ви можете стискати їх більш-менш, але ви отримуєте точний файл назад, коли він розпаковується - ось що робить його без втрат.
mikebabcock

13
Більшість програм для стиснення, таких як Zip та Rar, дозволяють вам ввести "рівень стиснення", що дозволяє вибирати між меншими файлами <--> коротший час. Це не означає, що ці програми відкидають дані під час стиснення. Цей параметр (у GIMP, pngcrush тощо) є подібним.
Салман

2
@naxa: Немає жодних застережень щодо того, наскільки насправді є PNG без втрат. Це завжди на 100% без втрат. Стаття лише попереджає про помилки, які мали деякі старі веб-переглядачі під час впровадження PNG для обробки гамма-корекції. І це має сенс лише в тому випадку, якщо вам потрібно зіставити колір із кольорами CSS (які не виправлені гаммою).
Паулі L

Відповіді:


183

PNG без втрат. GIMP, швидше за все, просто не використовує найкраще слово в цьому випадку. Подумайте про це як "якість стиснення", або іншими словами, "рівень стиснення". При меншій компресії ви отримуєте більший файл, але для його отримання потрібно менше часу, тоді як при більш високій компресії ви отримуєте менший файл, який потребує більше часу. Зазвичай ви отримуєте зменшувані прибутки (тобто не стільки зменшення розміру в порівнянні зі збільшенням часу, яке потрібно), коли піднімаєтесь до найвищих рівнів стиснення, але це залежить від вас.


42
Крім того, стиснення PNG насправді має безліч настроюваних параметрів, коли зміни в будь-якому напрямку можуть зменшити розмір вихідного сигналу залежно від вмісту джерела - це набагато складніше, ніж простий слайдер «краще» та «гірше». Для загальних цілей це не надто важливо, але якщо ви хочете абсолютного найменшого, тоді використовуйте такий інструмент, pngcrushякий може порівняти безліч варіацій для найменшого.
Боб

4
Більш високий рівень стиснення збільшує час стиснення, але чи впливає це також на декомпресію ?
Нолонар

10
@Nolonar Взагалі немає; якщо що-небудь більш високий рівень стиснення, як правило, зменшує час декомпресії, тому що для його читання та обробки потрібно менше даних. Більш тривалий час стиснення зумовлений більш ретельною роботою з пошуку шаблонів для стиснення (надпрощення).
пухнастий

1
@fluffy відповідь LordNeckbeard мала найвищу компресію на 5 разів довше, ніж найнижчу.
Андре Шалелла

1
Для PNG, це є досить поширеним явищем , щоб мати більше часу декомпресії для більш стислих файлів. Проблема полягає в тому, що в PNG можливий фокус - застосовувати алгоритм стиснення знову і знову до тих пір, поки файл зменшиться. Як тільки розмір збільшується, ви припиняєте його застосовувати. Тож цілком можливо, що ви застосуєте алгоритм стиснення 5 або 6 разів, а це означає, що вам потрібно декомпресувати файл 5 або 6 разів, щоб відобразити зображення.
йо '

213

PNG стискається, але без втрат

Рівень стиснення - це компроміс між розміром файлу та швидкістю кодування / декодування. Для надмірного узагальнення навіть неформатні формати, такі як FLAC, мають подібні поняття.

Різні рівні стиснення, однаковий декодований вихід

Хоча розміри файлів різні, через різні рівні стиснення фактичний декодований вихід буде однаковим.

Ви можете порівняти хеші MD5 декодованих виходів з ffmpegвикористанням муксера MD5 .

Це найкраще показано на деяких прикладах:

Створення файлів PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • За замовчуванням ffmpegбуде використовуватися -compression_level 100для виведення PNG.

Порівняйте розмір файлу:

$ du -h *.png
  228K    0.png
  4.0K    100.png

Розшифруйте файли PNG та покажіть хеші MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

Оскільки обидва хеші однакові, ви можете бути впевнені, що декодовані результати (нестиснене, сире відео) точно однакові.


26
+1 не знав, що ffmpeg може обробити PNG.
Лекенштейн

21
@Lekensteyn Це чудово для створення скріншотів . Приклад пропустити 30 секунд і зробити знімок екрана: ffmpeg -ss 30 -i input -vframes 1 output.pngтакож добре для створення відео з зображень і навпаки.
логіан

Чи означає це, що PNG потрібно декомпресувати щоразу, коли він повинен бути виведений? Тому що якщо це правда, ми повинні бути
akshay2000

Якщо ви перечитали файл з диска чи кеша, так, його потрібно розпакувати. Всередині тієї ж сторінки кеш, можливо, може повторно використовувати декомпресовану версію.
David Mårtensson

1
@ akshay2000 Залежить від того, як працює програма, яка робить PNG. Зазвичай файл зчитується з диска, декомпресується і буферується в ОЗУ. Поки він завантажений в оперативну пам'ять, не потрібно буде знову розпаковувати зображення.
xZise

24

Стиснення PNG відбувається в два етапи.

  1. Попереднє стиснення переставляє дані зображення таким чином, що воно буде більш стисливим алгоритмом стиснення загального призначення.
  2. Фактичне стиснення виконується DEFLATE, який здійснює пошук, і виключає повторювані байтові послідовності, замінюючи їх короткими лексемами.

Оскільки крок 2 є дуже трудомістким завданням, основна бібліотека zlib (інкапсуляція сировинного DEFLATE) приймає параметр стиснення, що становить від 1 = Найшвидше стиснення, 9 = Найкраще стиснення, 0 = Не стиснення. Ось звідки походить діапазон 0-9, і GIMP просто передає цей параметр вниз до zlib. Зауважте, що на рівні 0 ваш png насправді буде трохи більшим, ніж еквівалентна растрова карта.

Однак рівень 9 - це лише «найкраще», яке намагатиметься виконувати zlib, і все ще є дуже компромісним рішенням .
Щоб справді відчути це, якщо ви готові витратити на 1000 разів більше процесорної потужності на вичерпний пошук, ви можете отримати на 3-8% більшу щільність даних, використовуючи zopfli замість zlib.
Стиснення все ще без втрат, це просто більш оптимальне ВИГОДНЕ представлення даних. Це наближається до меж бібліотек, сумісних із zlib, і тому є справжнім "найкращим" стисненням, якого можна досягти за допомогою PNG.


2
Примітка. Час декомпресії однаковий незалежно від рівня стиснення або кількості ітерацій при використанні zopflipng.
Адрія

16

Основною мотивацією для формату PNG було створення заміни GIF, яка була не тільки безкоштовною, але й покращенням по суті в усіх відношеннях. В результаті стиснення PNG повністю втрачається - тобто оригінальні дані зображення можна реконструювати точно, побіжно - так само, як у GIF та більшості форм TIFF.

PNG використовує двоступеневий процес стиснення:

  1. Попереднє стиснення: фільтрування (прогнозування)
  2. Стиснення: DEFLATE (див. Wikipedia )

Крок попереднього стиснення називається фільтруванням, що є методом оборотного перетворення даних зображення, щоб основний двигун стиснення міг працювати ефективніше.

Як простий приклад, розглянемо послідовність байтів, що рівномірно збільшується від 1 до 255:

1, 2, 3, 4, 5, .... 255

Оскільки в послідовності повторення немає, воно стискається або дуже погано, або зовсім не відбувається. Але тривіальна модифікація послідовності, а саме, залишаючи перший байт у спокої, але замінюючи кожен наступний байт різницею між ним та його попередником, перетворює послідовність у надзвичайно стисливий набір:

1, 1, 1, 1, 1, .... 1

Вищевказане перетворення є без втрат, оскільки жодних байт не було опущено, і є повністю оборотним. Стислий розмір цієї серії значно зменшиться, але оригінальну серію все одно можна ідеально відновити.

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

зображення

Алгоритм працює на байтах, але для великих пікселів (наприклад, 24-бітний RGB або 64-бітний RGBA) порівнюються лише відповідні байти, тобто червоні компоненти піксельних кольорів обробляються окремо від зеленого та синього піксельних компонентів.

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

Рівні стиснення зазвичай визначаються як числа між 0 (немає) і 9 (найкраще). Вони стосуються компромісів між швидкістю та розміром і стосуються кількості комбінацій рядкових фільтрів. Немає стандартів щодо цих рівнів стиснення, тому кожен редактор зображень може мати власні алгоритми щодо того, скільки фільтрів слід спробувати під час оптимізації розміру зображення.

Рівень стиснення 0 означає, що фільтри взагалі не використовуються, що швидко, але марно. Більш високі рівні означають, що все більше і більше комбінацій пробуються на рядах зображень, і зберігаються лише найкращі.

Я б здогадався, що найпростіший підхід до найкращого стиснення - поступовий тест-стиснення кожного рядка з кожним фільтром, збереження найменшого результату та повторення для наступного ряду. Це означає фільтрацію та стиснення всього зображення в п'ять разів, що може бути розумним компромісом для зображення, яке буде передано та розшифровано багато разів. Нижчі значення стиснення дозволять зробити менше, на розсуд розробника інструменту.

На додаток до фільтрів, рівень стиснення також може впливати на рівень стиснення zlib, який є числом від 0 (немає дефляції) та 9 (максимальний дефлятор). Як зазначені рівні 0-9 впливають на використання фільтрів, які є основною особливістю оптимізації PNG, все ще залежить від розробника інструменту.

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

Джерела:

Документація по libpng для портативної мережевої графіки Вікіпедії
Розділ 9 - Стиснення та фільтрація


1
Я не думаю, що налаштування рівня стиснення не змінює використання фільтрів. Налаштування рівня 1-9, ймовірно, просто вибирає рівень стиснення zlib 1-9, а рівень 0 означає, що алгоритм дефляції взагалі не використовується. Більшість реалізацій, ймовірно, не змінюють фільтри в рядку, а просто використовують фільтр Path весь час.
Паулі Л

@PauliL: Я не згоден, тому що в усіх порівняннях програмного забезпечення для стиснення PNG дуже великі відмінності між розмірами створених зображень. Якщо всі продукти використовували однакові параметри для однієї бібліотеки, то всі розміри повинні були бути однаковими, як і швидкість.
harrymc

Чи є у вас посилання на подібні порівняння?
Паулі Л

@PauliL: Швидкий пошук знайшов це порівняння .
harrymc

@PauliL: Ви, мабуть, праві, що на рівень стиснення zlib впливають рівні стиснення PNG. Я відповідно змінив свою відповідь, хоча жоден інструмент стиснення не документує, що саме вони роблять. Можливо, поясненням інструментів з найгіршими результатами розміру є те, що вони взагалі не використовують фільтри, а лише стиснення zlib.
harrymc

5

Гаразд, я запізнився на баунті, але ось моя відповідь все одно.

PNG завжди без втрат . Він використовує алгоритм відхилення / надуття, подібний до алгоритму zip.

Зменшити алгоритм пошуку повторних послідовностей байтів і замінити їх тегами. Налаштування рівня стиснення визначає, скільки зусиль використовує програма для пошуку оптимальної комбінації послідовностей байтів і скільки пам'яті зарезервовано для цього. Це компроміс між використанням часу та пам’яті проти розміру стислих файлів. Однак сучасні комп’ютери настільки швидкі і мають достатньо пам'яті, тому рідко потрібно використовувати інші, ніж найвищі настройки стиснення.

У багатьох реалізаціях PNG використовується бібліотека zlib для стиснення. Zlib має дев'ять рівнів стиснення, 1-9. Я не знаю внутрішніх даних Gimp, але оскільки він має налаштування рівня стиснення 0-9 (0 = відсутність стиснення), я вважаю, що цей параметр просто вибирає рівень стиснення zlib.

Алгоритм спуску - алгоритм стиснення загального призначення , він не був розроблений для стиснення зображень. На відміну від більшості інших форматів зображень без втрат, формат PNG не обмежується цим. Стиснення PNG використовує знання того, що ми стискаємо 2D зображення . Це досягається завдяки так званим фільтрам .

(Фільтр насправді дещо оманливий термін. Він фактично не змінює вміст зображення, він просто кодує його по-іншому. Більш точною назвою буде дельта-кодер.)

Специфікація PNG визначає 5 різних фільтрів (включаючи 0 = жоден). Фільтр замінює абсолютні значення пікселів з різницею від попереднього пікселя вліво, вгору, по діагоналі або комбінації цих. Це може значно покращити коефіцієнт стиснення. Кожна лінія сканування зображення може використовувати різний фільтр. Кодер може оптимізувати стиснення, вибравши найкращий фільтр для кожного рядка.

Детальніше про формат файлу PNG див . У специфікації PNG .

Оскільки існує практично нескінченна кількість комбінацій, спробувати їх усі неможливо. Тому розроблені різні види стратегій пошуку ефективної комбінації. Більшість редакторів зображень, ймовірно, навіть не намагаються оптимізувати фільтри по черзі, а натомість просто використовують фіксований фільтр (швидше за все, Paeth).

Програма pngcrush командного рядка намагається виконати кілька стратегій, щоб знайти найкращий результат. Це може значно зменшити розмір файлу PNG, створеного іншими програмами, але на великих зображеннях може знадобитися зовсім небагато часу. Див. Джерело Forge - pngcrush .


3

Рівень стиснення матеріалів без втрат завжди просто торгує кодованими ресурсами (як правило, часом, іноді також оперативною пам’яттю) проти бітрейта. Якість завжди 100%.

Звичайно, компресори без втрат НІКОЛИ не можуть гарантувати фактичного стиснення. Випадкові дані нестискаються, немає шаблону для пошуку та подібності. Теорія інформації Шеннона та все таке. Вся суть стиснення даних без втрат полягає в тому, що люди зазвичай працюють із надзвичайно випадковими даними, але для передачі та зберігання ми можемо стиснути їх на якомога менше біт. Сподіваємось, якомога ближче до складності оригіналу Колмогорова .

Будь то zip або 7z загальні дані, png зображення, flac аудіо або h.264 (у режимі без втрат), це те саме. За допомогою деяких алгоритмів стиснення, таких як lzma (7zip) і bzip2, викручування налаштування стиснення збільшить час процесора DECODER (bzip2) або частіше просто необхідну кількість оперативної пам’яті (lzma та bzip2 та h.264 з більшою кількістю посилальних кадрів) . Часто декодеру доводиться зберігати більше декодованого виводу в оперативній пам’яті, оскільки декодування наступного байту могло б посилатися на байт, декодований багато мегабайт тому (наприклад, відеокадр, найбільш схожий на один з половини секунди тому, кодується з посиланнями на 12 кадрів назад ). Те ж саме і з bzip2 та вибором великого розміру блоку, але це також декомпресується повільніше. lzma має словник змінного розміру, і ви можете створити файли, які потребують 1.


Гммм, я побачив реалізацію для управління керуючим кроковим двигуном та головою безпосередньо, щоб забезпечити гарантоване стиснення без втрат. Кодування в Манчестері легко перемогти, якщо у вас є джерело високої роздільної здатності.
Джошуа

@Joshua: Використання формату фізичного зберігання з більшою щільністю не є таким же, як стиснення даних ...
SamB

0

По-перше, PNG завжди без втрат. Очевидний парадокс пояснюється тим, що можливі два різні види стиснення (для будь-якого типу даних): втрати та без втрат.

Стиснення без втрат видаляє дані (тобто розмір файлу) за допомогою різних хитрощів, зберігаючи все і не роблячи апроксимації. Як результат, можливо, що стиснення без втрат насправді взагалі не зможе стиснути речі. (Технічно дані з високою ентропією можуть бути дуже важкими або навіть неможливими для стиснення для методів без втрат.) Стиснення втрат наближає до реальних даних, але наближення недосконале, але це «викидання» точності дозволяє, як правило, краще стискати.

Ось тривіальний приклад стиснення без втрат: якщо у вас є зображення, виготовлене в 1000 чорних пікселів, замість того, щоб зберігати значення для чорного 1000 разів, ви можете зберігати кількість (1000) і значення (чорне), таким чином стискаючи 1000 пікселів " зображення "на дві цифри. (Це сира форма методу стиснення без втрат, який називається кодуванням довжини).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.