Уменьшение размера файла PNG с помощью pyvips: согласование оптимизаций ImgBot и ImageMagick

#python #png #vips

#python #png #vip-персоны

Вопрос:

Я пытаюсь минимизировать размер файла изображений PNG, написанных с pyvips.Image.pngsave() помощью. Исходные файлы, написанные с помощью just .pngsave(output) , находятся на https://github.com/CDDA-Tilesets/UltimateCataclysm и мы посмотрим giant.png , что такое 119536 байты.

ImgBot смог уменьшить размер файла до 50672 .

pngsave(вывод, сжатие = 9, палитра = True, полоса = True) для 58722

Но convert команда из ImageMagick по-прежнему может дополнительно уменьшить размер файла после последнего, до 42833 параметров по умолчанию:

 $ convert giant_pyvips_c9.png giant_pyvips_magick.png
 

Вопрос в том, возможно ли уместить одно и то же изображение в 42833 байты, используя только pyvips , чтобы избежать добавления еще одного шага в наш рабочий процесс?

Обновление: предупреждение

palette размер ограничен 256 цветами и pyvips не предупреждает вас, если преобразование становится с потерями.

Ответ №1:

Попробуйте отключить фильтрацию:

 $ vips copy giant.png x.png[palette,compression=9,strip,filter=0]
$ ls -l x.png
-rw-r--r-- 1 john john 41147 Feb 14 10:58 x.png
 

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

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

http://www.w3.org/TR/PNG-Filters.html

Вы можете увидеть допустимые значения для filter= параметра здесь:

https://github.com/libvips/libvips/blob/master/libvips/include/vips/foreign.h#L579-L598

Комментарии:

1. Еще раз спасибо 🙂 Я попробую это позже сегодня

2. Я настроил git master libvips на фильтр по умолчанию, отключенный для сохранения png изображений палитры. Спасибо за идею!

3. У меня были лучшие результаты с normal.png тем filter=8 , что это такое