#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
, что это такое