Как Надуть png, сжатый zopfli - PullRequest
1 голос
/ 08 ноября 2019

Я сжал файл PNG, используя ImageOptim. Я использовал Zopfli в качестве метода сжатия. ImageOptim гарантирует, что это сжатие без потерь. Действительно, мой размер PNG уменьшился, но как я могу распаковать его обратно в исходный размер?

Я читал о сжатии Zopfli, он сказал, что он сжимает файлы PNG с использованием алгоритма deflate. Как можно накачать / распаковать сжатый png обратно в исходный файл в java?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Zopli не оптимизирует уже сжатый поток данных PNG. Работает на распакованном изображении с нуля. Таким образом, вы не можете отменить процесс. Если вы настаиваете на том, чтобы получить точно такой же результат до оптимизации, вы можете снова распаковать его в растровое изображение и кодировать в PNG, используя оригинальный алгоритм.

Еще немного объяснений: Давайте просто скажем, что вам нужносжать строку "1111111111". Первая функция сжатия без потерь, которая имеет максимальный размер буфера 5 байт, вывела бы ее как «5x1,5x1» (5 раз 1, затем 5 раз 1), затем вторая реализация того же алгоритма, который имеет максимальный буфер вывода 10 байтов«10x1», который выглядит лучше. Оба результата, конечно, без потерь, но чаще всего вы не можете перейти к «5x1,5x1» из «10x1».

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

Нет необходимости программировать;

Используйте ImageMagick для сравнения файлов

Сжатие без потерь:

Команда:

magick compare -metric mae anydesk00000.png anydesk00000.png diff.png`

Выход:

0 (0)

Значение 0 показывает нулевую разницу, следовательно, без потерь.

Сжатие с потерями:

Команда:

magick compare -metric mae anydesk00000.png anydesk00000.jpg diff.png

Выход:

151.861 (0.00231724)
0 голосов
/ 08 ноября 2019

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

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

Редактировать: есть два общих определения сжатия без потерь:

  1. Возможность воссоздать точную битовую копию входного файла.
  2. Возможность восстановить содержимое входного файла без изменений. Точное битовое воспроизведение входного файла не является целью.

Общее сжатие файлов использует первое определение. Если вы заархивируете файл .jpg, вы сможете получить точно такой же файл .jpg.

Сжатие без потерь для конкретного домена обычно использует второе определение, если вы создаете файл PNG из JPEG, вы не сможете восстановить исходный файл JPEG (даже если вы знаете, что оригинал был изображением JPEG), но исходный JPEG и PNG будут иметь абсолютно одинаковые данные изображения, но все называют PNG без потерь.

Если вы рассматриваете программу, которая использует Zopfli для уменьшения размера файлов PNG, как «компрессор файлов PNG», тоне будет без потерь, используя общее определение, но оно будет использовать специфичное для домена. Если программа утверждает, что сжимает изображение без потерь, а не файл, то нет никакой двусмысленности, это второе определение. Если программа заявляет, что она является оптимизатором без потерь, это также второе определение, двусмысленности нет.

...