Форматът PNG без загуби ли е, тъй като има параметър на компресия?

Предполага се, че форматът PNG е без загуби, но когато запишете изображение като PNG файл, ще бъдете помолени да изберете ниво на компресия. Означава ли това, че форматът PNG всъщност не е без загуби? Днешната публикация за въпроси и отговори на SuperUser помага да се изясни объркването за любопитен читател.

Днешната сесия „Въпроси и отговори“ идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общности уеб сайтове с въпроси и отговори.

Въпроса

Четецът на SuperUser pkout иска да знае дали качеството на изображението в PNG се влияе от избраното ниво на компресия:

Както разбирам, PNG файловете използват компресия без загуби. Когато обаче използвам редактор на изображения като Gimp и се опитвам да запазя изображение като PNG файл, той изисква ниво на компресия, вариращо между 0 и 9.

Ако има параметър на компресия, който влияе на визуалната точност на компресираното изображение, как тогава PNG е без загуби? Може ли някой да ми обясни това? Получавам ли поведение без загуби само когато задам ниво на компресия на 9?

Има ли разлика в качеството на изображението в зависимост от избраното ниво на компресия?

Отговорът

Сътрудниците на SuperUser LordNeckbeard и jjlin имат отговора вместо нас. Първо, LordNeckbeard:

PNG е компресиран, но без загуби

Нивото на компресия е компромис между размера на файла и скоростта на кодиране / декодиране. За прекалено обобщаване, дори неформатни формати като FLAC имат подобни концепции.

Различни нива на компресия, еднакъв декодиран изход

Въпреки че размерите на файловете са различни поради различните нива на компресия, действителният декодиран изход ще бъде идентичен. Можете да сравните MD5 хешовете на декодираните изходи с ffmpeg, използвайки MD5 мултиплекса. Това е най-добре показано с някои примери.

Създаване на PNG файлове

  • По подразбиране ffmpeg ще използва -compression_level 100 за PNG изход.
  • Бърз, небрежен тест показа, че 100 (най-високото ниво на компресия) отнема около три пъти повече време за кодиране и пет пъти по-дълго за декодиране от 0 (най-ниското ниво на компресия) в този пример.

Сравнете размера на файла

Декодирайте PNG файловете и покажете MD5 хешове

Тъй като и двата хеша са еднакви, можете да бъдете сигурни, че декодираните изходи (некомпресираните сурови файлове) са абсолютно еднакви.

Последвано от отговора от jjlin:

PNG е без загуби. GIMP най-вероятно не използва най-добрия избор на формулировки в този случай.

Мислете за това като качество на компресия или ниво на компресия . При по-ниска компресия получавате по-голям файл, но отнема по-малко време за създаване, докато при по-висока компресия получавате по-малък файл, който отнема повече време.

Обикновено получавате намаляваща възвръщаемост, т.е. не толкова голям размер в сравнение с увеличаването на времето, необходимо за достигане до най-високите нива на компресия, но зависи от вас.

Имате какво да добавите към обяснението? Звук в коментарите. Искате ли да прочетете повече отговори от други технически интелигентни потребители на Stack Exchange? Вижте пълната дискусионна нишка тук.