Инструменты оптимизации PNG

Некоторое время назад я использовал услугу оптимизации PNG (я думаю) «smush it». Вы накормили его weblink, и он вернул zip всех изображений PNG с их файлами, красиво, хорошо, smushed …

Я хочу реализовать подобную функцию оптимизации как часть процесса загрузки изображений на моем сайте; кто-нибудь знает о существовавшей ранее библиотеке (желательно PHP или Python), к которой я могу воспользоваться? Краткий Google указал мне на несколько инструментов стиля командной строки, но я бы предпочел не пойти по этому маршруту, если это возможно.

Выполнить с помощью PHP эти инструменты командной строки

pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -brute -l 9 -max -reduce -m 0 -q IMAGE optipng -o7 -q pngout.png pngout pngout.png -q -y -k0 -s0 advpng -z -4 pngout.png > /dev/null 
  • Pngcrush
  • OptiPNG
  • PNGOUT
  • advpng

Пока ваш PHP скомпилирован с поддержкой GD2 (довольно распространенный в наши дни):

 <?php $image = imagecreatefromstring(file_get_contents('/path/to/image.original.png')); imagepng($image, '/path/to/image.smushed.png', 9); 

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

Сегодня это может быть менее полезным, чем лет назад; большинство редакторов изображений уже делают это, поскольку gzipping не стоит столько же процессорных, сколько и раньше.

Вы слышали о PNGCrush? Вы можете проверить источник, часть PNG и MNG Tools в SourceForge , а также переписать или обернуть его в Python.

Я бы поставил под сомнение мудрость выбрасывать другие куски (например, gAMA и iCCP), но если это то, что вы хотите сделать, довольно просто использовать PyPNG для удаления кусков:

 #!/usr/bin/env python import png import sys input=sys.stdin out=sys.stdout def critical_chunks(chunks): for type,data in chunks: if type[0].isupper(): yield type,data chunks = png.Reader(file=input).chunks() png.write_chunks(out, critical_chunks(chunks)) 

функция critical_chunks по существу фильтрует все, кроме критических блоков PNG (4-буквенный тип для критического фрагмента начинается с прописной буквы).