Увеличение размера файла для вывода pngquant при использовании PIL
Если я сжимаю изображение с помощью pngquant, а затем читаю и записываю с помощью PIL, я вижу, что размер файла значительно увеличивается (иногда до 2 раз). У кого-нибудь есть какие-нибудь советы здесь? Я подозреваю, что это может быть связано с некоторыми флагами PIL, но недостаточно знакомы с ним.
2 ответа
а затем читать и записывать с PIL, я вижу, что размер файла значительно увеличивается (иногда до 2 раз)
Поскольку PNG без потерь и, следовательно, не содержит артефактов, которые могут быть проблематичными с другими кодировщиками, я вижу только три реальных варианта:
- Вы сохраняете с другой битовой глубиной (например, ввод 8 бит, вывод 24 бит)
- вы экономите с добавленной альфа-информацией
- палитра сильно переупорядочена (это не должно ни сохранять, ни терять больше нескольких процентов, но без просмотра реального изображения, если 2х - исключительный случай, а правило ближе к 1,2х, оно находится в пределах возможного)
Для очень маленьких файлов чейки без изображения могут быть частью проблемы, если PIL повторно добавляет некоторые данные, которые pngquant
удален. Возьмите какой-нибудь диагностический инструмент PNG, способный выводить список и размер всех кусков (PLTE, TEXT и т. Д.) И посмотреть, где происходит фактическое увеличение ( Быстрая ссылка Google).
zLib также может быть виноват (например, если память служит, advpng
использует обманчивый zlib для увеличения производительности), но не с этими числами, если только мы не говорим о достаточно маленьких файлах, которые могут быть значительными даже в несколько байтов.
Если вы не изменяете что-либо RGBA или не сохраняете с другими настройками, чтение и запись PNG практически не влияют на размер файла независимо от используемой вами библиотеки или приложения.
Подтверждение концепции с использованием pngquant сгенерированного изображения и PIL:
$ wget https://pngquant.org/Ducati_side_shadow-fs8.png
$ python
>>> from PIL import Image
>>> im = Image.open("Ducati_side_shadow-fs8.png")
>>> im.rotate(180).save("output.png")
$ stat -c "%s %n" *.png
23405 Ducati_side_shadow-fs8.png
23362 output.png
В приведенном выше примере output.png
даже на 43 байта меньше оригинала. Мы повернули его вверх дном, но не коснулись цветов или альфа.