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

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

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

Ответ 1

Выполнить с помощью 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

Ответ 2

Пока ваш 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 не стоит столько же процессорных, сколько и раньше.

Ответ 3

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

Ответ 4

Я бы поставил под сомнение мудрость выбрасывать другие куски (например, 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-буквенный тип для критического фрагмента начинается с прописной буквы).