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

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

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

148 голосов | спросил pkout 26 32014vEurope/Moscow11bEurope/MoscowWed, 26 Nov 2014 21:11:37 +0300 2014, 21:11:37

7 ответов


180

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

ответил jjlin 26 32014vEurope/Moscow11bEurope/MoscowWed, 26 Nov 2014 21:31:31 +0300 2014, 21:31:31
209

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

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

ответил LordNeckbeard 27 42014vEurope/Moscow11bEurope/MoscowThu, 27 Nov 2014 11:27:31 +0300 2014, 11:27:31
24

Сжатие 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.

ответил Adria 28 52014vEurope/Moscow11bEurope/MoscowFri, 28 Nov 2014 12:55:08 +0300 2014, 12:55:08
15

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

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

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

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

В качестве простого примера рассмотрим последовательность байтов, увеличивающуюся равномерно от 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 - Сжатие и фильтрация

ответил harrymc 29 62014vEurope/Moscow11bEurope/MoscowSat, 29 Nov 2014 18:12:13 +0300 2014, 18:12:13
5

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

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-файла, созданного другими программами, но на больших изображениях может потребоваться довольно много времени. См. Source Forge - pngcrush .

ответил Pauli L 30 72014vEurope/Moscow11bEurope/MoscowSun, 30 Nov 2014 16:45:15 +0300 2014, 16:45:15
3

Уровень сжатия в материале без потерь - это просто торговля ресурсами кодирования (обычно время, иногда также ОЗУ) и битрейт. Качество всегда 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 ГБ оперативной памяти декодирования.

ответил Peter Cordes 2 TueEurope/Moscow2014-12-02T16:38:13+03:00Europe/Moscow12bEurope/MoscowTue, 02 Dec 2014 16:38:13 +0300 2014, 16:38:13
0

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

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

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

ответил GregD 27 12017vEurope/Moscow11bEurope/MoscowMon, 27 Nov 2017 09:07:04 +0300 2017, 09:07:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132