Увеличение размера файла для вывода 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 байта меньше оригинала. Мы повернули его вверх дном, но не коснулись цветов или альфа.

Другие вопросы по тегам