Инструменты оптимизации PNG
Некоторое время назад я использовал службу оптимизации PNG, которая называется (я думаю) "замять это". Вы передали ему веб-ссылку, и он вернул почтовый индекс всех изображений PNG с их размерами файлов, ну, в общем, улыбнулся...
Я хочу реализовать аналогичную функцию оптимизации как часть процесса загрузки изображений на моем сайте; Кто-нибудь знает о существующей библиотеке (желательно PHP или Python), к которой я могу подключиться? Краткий Google указал мне на несколько инструментов стиля командной строки, но я бы не хотел идти по этому пути, если это возможно.
4 ответа
Выполните с помощью 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
Пока ваш 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 на 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))
Функция ical_chunks по существу отфильтровывает все, кроме критических фрагментов PNG (четырехбуквенный тип для критического фрагмента начинается с заглавной буквы).