Вопрос: Как PNG без потерь, учитывая, что он имеет параметр сжатия?


Говорят, что файлы PNG используют сжатие без потерь. Однако всякий раз, когда я нахожусь в редакторе изображений, например GIMP и попытайтесь сохранить изображение в виде PNG-файла, он запрашивает параметр сжатия, который находится в диапазоне от 0 до 9. Если у него есть параметр сжатия, который влияет на визуальную точность сжатого изображения, как он делает PNG без потерь?

Я получаю поведение без потерь только тогда, когда я задал параметр сжатия 9?


148
2017-11-26 18:11


Источник


Большинство алгоритмов сжатия без потерь имеют перестраиваемые параметры (например, размер словаря), которые обобщаются в «как много усилий нужно сделать для минимизации ползунка выходного размера». Это действительно для ZIP, GZip, BZip2, LZMA, ... - Daniel B
Вопрос можно сформулировать по-разному. Если из сжатия не потеряно качество, почему бы не всегда использовать сжатие, создающее наименьший размер? Тогда ответ будет, поскольку для сжатия и распаковки требуется больше оперативной памяти и больше времени процессора. Иногда вам требуется более быстрое сжатие и не важно, насколько сильно сжатие. - kasperd
Сжатие PNG почти идентично файлам ZIPpip. Вы можете сжать их более или менее, но вы получите точный файл, когда он распаковывается - вот что делает его без потерь. - mikebabcock
Большинство программ сжатия, таких как Zip и Rar, позволяют вводить «уровень сжатия», который позволяет вам выбирать между меньшим файлом <-> более короткое время. Это не означает, что эти программы отбрасывают данные во время сжатия. Этот параметр (в GIMP, pngcrush и т. Д.) Аналогичен. - Salman A
@naxa: Нет никаких предостережений о том, как png действительно без потерь. Это всегда 100% без потерь. Статья только предупреждает вас о ошибках, которые некоторые старые браузеры использовали в своей реализации PNG для обработки гамма-коррекции. И это имеет смысл только в том случае, если вам нужно сопоставить цвет с цветами CSS (которые не корректируются гамма). - Pauli L


Ответы:


PNG без потерь. GIMP, скорее всего, просто не использует лучшее слово в этом случае. Подумайте об этом как о «качестве сжатия», или, другими словами, «уровне сжатия». При более низком сжатии вы получаете больший файл, но для получения требуется меньше времени, тогда как при более высоком сжатии вы получаете меньший файл, который занимает больше времени, чтобы произвести. Как правило, вы получаете уменьшающуюся отдачу (то есть, не столько уменьшение размера по сравнению с увеличением времени, сколько требуется) при достижении самых высоких уровней сжатия, но это зависит от вас.


180
2017-11-26 18:31



Кроме того, сжатие PNG на самом деле имеет множество настраиваемых параметров, где корректировки в любом направлении могут уменьшить выходной размер в зависимости от содержимого источника - он намного сложнее, чем простой «лучший» и «худший» слайдер. Для общих целей это не слишком важно, но если вы хотите абсолютного наименьшего, используйте инструмент, например pngcrush который может сравнивать многие варианты для наименьшего возможного. - Bob
Более высокий уровень сжатия увеличивает время сжатия, но также влияет декомпрессия также? - Nolonar
@Nolonar Обычно нет; если что-то более высокий уровень сжатия обычно уменьшает время декомпрессии, потому что для этого требуется меньше данных для чтения и обработки. Более длительное время сжатия связано с более тщательной работой по поиску шаблонов для сжатия (упрощения). - fluffy
Ответ @fluffy LordNeckbeard имел наивысшее сжатие, которое в 5 раз больше, чем минимальное. - André Chalella
Для PNG это является довольно обычное, чтобы иметь более длительное время декомпрессии для файлов с более сжатым сжатием. Проблема в том, что с помощью PNG одним из возможных трюков является применение алгоритма сжатия много раз, пока файл становится меньше. Как только размер увеличивается, вы перестанете его применять. Поэтому вполне возможно, что вы применяете алгоритм сжатия 5 или 6 раз, а это означает, что вам нужно распаковать файл 5 или 6 раз, чтобы отобразить изображение. - yo'


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

Поскольку оба хэша одинаковы, вы можете быть уверены, что декодированные выходы (несжатое, необработанное видео) абсолютно одинаковы.


209
2017-11-27 08:27



+1 не знал, что ffmpeg может обрабатывать png. - Lekensteyn
@Lekensteyn Это здорово для создание скриншотов, Пример пропустить 30 секунд и сделать снимок экрана: ffmpeg -ss 30 -i input -vframes 1 output.png Также полезно для снимать видео с изображений и наоборот. - LordNeckbeard
Означает ли это, что PNG нужно декомпрессировать каждый раз, когда он должен отображаться? Потому что, если это правда, мы должны быть - akshay2000
Если вы перечитаете файл с диска или кеша, да, его нужно распаковать. Внутри той же страницы кеш может, вероятно, повторно использовать распакованную версию. - David Mårtensson
@ akshay2000 Зависит от того, как работает программа, которая отображает PNG. Обычно файл считывается с диска, распаковывается и буферизуется в ОЗУ. До тех пор, пока он буферизуется в ОЗУ, ему не нужно снова распаковывать изображение. - xZise


Сжатие PNG происходит в два этапа.

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

Поскольку этап 2 представляет собой очень сложную задачу времени / ресурса, базовая библиотека zlib (инкапсуляция необработанного DEFLATE) принимает параметр сжатия от 1 = самое быстрое сжатие, 9 = лучшее сжатие, 0 = отсутствие сжатия. Это то, откуда приходит диапазон 0-9, и GIMP просто передает этот параметр до zlib. Обратите внимание, что на уровне 0 ваш png будет на самом деле немного больше эквивалентного растрового изображения.

Тем не менее, уровень 9 - это только «лучший», который zlib будет пытаться, и все еще очень компромиссное решение,
Чтобы действительно почувствовать это, если вы готовы потратить 1000-кратную вычислительную мощность на исчерпывающий поиск, вы можете получить плотность данных на 3-8%, используя zopfli вместо zlib.
Сжатие по-прежнему без потерь, это просто более оптимальное представление данных DEFLATE. Это приближается к границам библиотек, совместимых с zlib, и поэтому является истинным «лучшим» сжатием, которое можно достичь с помощью PNG.


24
2017-11-28 09:55



Примечание. Время декомпрессии одинаково независимо от уровня сжатия или количества итераций при использовании zopflipng. - Adria


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

PNG использует двухступенчатый процесс сжатия:

  1. Предварительное сжатие: фильтрация (прогнозирование)
  2. Сжатие: DEFLATE (см. википедия)

Стадия предварительного сжатия называется фильтрацией, которая является способом обратимого преобразования данных изображения, так что основной механизм сжатия может работать более эффективно.

В качестве простого примера рассмотрим последовательность байтов, увеличивающуюся равномерно от 1 до 255:

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

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

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

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

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

image

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

Чтобы выбрать лучший фильтр для каждой строки, кодеру необходимо будет проверить все возможные комбинации. Это явно невозможно, так как даже 20-рядное изображение потребует тестирования более 95 триллионов комбинаций, где «тестирование» будет включать фильтрацию и сжатие всего изображения.

Уровни сжатия обычно определяются как числа между 0 (нет) и 9 (лучше всего). Они относятся к компромиссам между скоростью и размером и соотносятся с тем, сколько комбинаций фильтров строк. Нет стандартов относительно этих уровней сжатия, поэтому каждый редактор изображений может иметь свои собственные алгоритмы относительно того, сколько фильтров нужно попробовать, когда оптимизируя размер изображения.

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

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

В дополнение к фильтрам уровень сжатия может также влиять на уровень сжатия zlib который представляет собой число от 0 (без дефлята) и 9 (максимальная дефляция). Как указано 0-9 уровни влияют на использование фильтров, которые являются основной функцией оптимизации PNG, по-прежнему зависит от разработчика инструмента.

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

Источники:

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


15
2017-11-29 15:12



Я не думаю, что настройка уровня сжатия изменяет использование фильтров. Настройка уровня 1-9, вероятно, просто выбирает уровень сжатия zlib 1-9, а уровень 0 означает, что алгоритм дефляции не используется вообще. Большинство реализаций, вероятно, не меняют фильтры на строку, но просто используют фильтр Path все время. - Pauli L
@PauliL: Я не согласен, потому что во всех сравнениях программного обеспечения для сжатия PNG существуют очень большие различия между размерами сгенерированных изображений. Если все продукты используют одни и те же параметры для одной и той же библиотеки, то все размеры должны быть одинаковыми, а также скорость. - harrymc
Есть ли у вас какие-либо ссылки на такие сравнения? - Pauli L
@PauliL: Быстрый поиск придумал это сравнение, - harrymc
@PauliL: Вероятно, вы правы, что уровни сжатия zlib зависят от уровней сжатия PNG. Я соответствующим образом изменил свой ответ, хотя инструмент сжатия не документирует то, что они делают точно. Возможно, объяснение инструментов с худшими результатами - это то, что они не используют никаких фильтров, а только сжатие zlib. - harrymc


Хорошо, я слишком поздно для щедрости, но вот мой ответ в любом случае.

PNG всегда без потерь, Он использует алгоритм Deflate / Inflate, аналогичный используемому в zip-программах.

Алгоритм Deflate выполняет поиск повторяющихся последовательностей байтов и заменяет их тегами. Параметр уровня сжатия определяет, сколько усилий программа использует для поиска оптимальной комбинации последовательностей байтов и сколько памяти зарезервировано для этого. Это компромисс между временем и потреблением памяти по сравнению с сжатым размером файла. Тем не менее, современные компьютеры настолько быстр и имеют достаточно памяти, поэтому редко приходится использовать отличную настройку сжатия.

Многие реализации PNG используют библиотеку zlib для сжатия. Zlib имеет девять уровней сжатия, 1-9. Я не знаю внутренних компонентов Gimp, но поскольку он имеет настройки уровня сжатия 0-9 (0 = без сжатия), я бы предположил, что этот параметр просто выбирает уровень сжатия zlib.

Дефлятный алгоритм алгоритм сжатия общего назначения, он не предназначен для сжатия изображений. В отличие от большинства других форматов файлов изображений без потерь формат PNG не ограничивается этим. Сжатие PNG использует знания о том, что мы сжимаем 2D-изображение, Это достигается благодаря так называемому фильтры,

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

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

Подробнее о формате PNG-файла см. Спецификация PNG,

Поскольку существует практически бесконечное количество комбинаций, их невозможно попробовать. Поэтому были разработаны различные стратегии для нахождения эффективной комбинации. Большинство редакторов изображений, вероятно, даже не пытаются оптимизировать фильтры по строкам, а вместо этого используют фиксированный фильтр (скорее всего, Paeth).

Программа командной строки Pngcrush пытается найти несколько стратегий, чтобы найти лучший результат. Он может значительно уменьшить размер PNG-файла, созданного другими программами, но на больших изображениях может потребоваться довольно много времени. Видеть Источник Forge - pngcrush,


5
2017-11-30 13:45





Уровень сжатия в без потерь - это просто торговля ресурсами кодирования (обычно время, а иногда и ОЗУ) и битрейт. Качество всегда 100%.

Конечно, компрессоры без потерь могут Никогда не гарантируйте любое фактическое сжатие. Случайные данные несжимаемы, нет никакой картины для поиска и отсутствия подобия. Теория информации Шеннона и все такое. Весь смысл сжатия данных без потерь заключается в том, что люди обычно работают с очень неслучайными данными, но для передачи и хранения мы можем сжать его на несколько бит, насколько это возможно. Надеемся, что до Колмогоровская сложность оригинала.

Является ли это zip или 7z generic data, png images, flac audio или h.264 (в режиме без потерь), это то же самое. С некоторыми алгоритмами компрессии, такими как lzma (7zip) и bzip2, сжимать настройку сжатия увеличит время процессора DECODER (bzip2) или чаще всего необходимое количество RAM (lzma и bzip2 и h.264 с большим количеством опорных кадров) , Часто декодер должен сохранять более декодированный вывод в ОЗУ, поскольку декодирование следующего байта может относиться к байту, декодированному многими мегабайтами назад (например, видеокадр, который больше всего похож на один из полутора секунд назад, будет закодирован со ссылками на 12 кадров назад ). То же самое с bzip2 и выбором большого размера блока, но это также декомпрессирует медленнее. LZMA имеет словарь с переменным размером, и вы можете создавать файлы, которые потребуют 1,5 ГБ ОЗУ для декодирования.


3
2017-12-02 13:38



Хм, я видел реализацию, чтобы контролировать управление шаговым двигателем привода и направлять его прямо, чтобы обеспечить гарантированное сжатие без потерь. Манчестерское кодирование легко избивается, если у вас есть источник с высоким разрешением. - Joshua
@Joshua: Использование формата физической памяти с более высокой плотностью не совпадает с сжатием данных ... - SamB


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

Без потерь сжимает данные (т. е. размер файла), используя различные трюки, сохраняя все и без каких-либо приближений. В результате, возможно, что сжатие без потерь фактически не сможет сжимать вещи вообще. (Технически данные с высокой энтропией могут быть очень сложными или даже невозможными для сжатия для методов без потерь).     Потеря компрессии аппроксимирует реальные данные, но приближение несовершенно, но это «отбрасывание» точности позволяет, как правило, улучшить сжатие.

Вот тривиальный пример сжатия без потерь: если у вас есть изображение, состоящее из 1000 черных пикселей, вместо того, чтобы хранить значение для черного 1000 раз, вы можете сохранить счет (1000) и значение (черный), тем самым сжимая 1000 пикселей " изображение "на два числа. (Это грубая форма метода сжатия без потерь, называемого кодированием длины строки).


0
2017-11-27 06:07