Сжатие изображения PNG с помощью ImageMagick

Чтобы сжать изображение в формате JPEG, я могу сделать:

$thumb = new Imagick(); $thumb->readImage("url"); $thumb->setImageCompression(Imagick::COMPRESSION_JPEG); $thumb->setImageCompressionQuality(80); 

Однако мне нужно также сжимать изображения PNG (сохраняя альфа-прозрачность), чтобы уменьшить размеры. Есть ли способ сделать это с помощью ImageMagick?

pngquant эффективно квантует или уменьшает количество цветов в изображении до момента, когда заметное падение качества. Вы можете попробовать что-то подобное в ImageMagick вот так …

Во-первых, используя встроенный rose: изображение, проверьте количество цветов на изображении – это 3,019:

 convert rose: -format %k info: 3019 

и сделать PNG его и проверить размер – это 6,975 байт

 convert rose: rose.png ls -l rose.png -rw-r--r--@ 1 mark staff 6975 5 Sep 20:57 rose.png 

введите описание изображения здесь

Теперь конвертируйте розу в 255 цветов и проверьте размер – это до 3,691 байт:

 convert rose: -colors 255 rose255.png ls -l rose255.png -rw-r--r-- 1 mark staff 3691 5 Sep 21:02 rose255.png 

введите описание изображения здесь

Теперь конвертируйте розу в 64 цвета и проверьте размер – до 2,361 байт

 convert rose: -colors 64 rose64.png ls -l rose64.png -rw-r--r-- 1 mark staff 2361 5 Sep 21:04 rose64.png 

введите описание изображения здесь

Другим способом оптимизации или уменьшения PNG-файлов является использование -strip для извлечения любых метаданных из изображений – таких как дата и время съемки, модель камеры и объектива, название программы, которая создала изображение и авторское право и цветовые профили.

Кроме того, стоит иметь в виду … обычно цвет прозрачных пикселей не имеет значения, потому что вы не можете их видеть, но однородные вещи обычно сжимаются лучше. Таким образом, может быть хорошей идеей сделать все прозрачные пиксели одного и того же цвета при сохранении файлов PNG с использованием -alpha background .

пример

 convert -size 512x512 xc:gray +noise random a.png # create an image of random noise -rw-r--r--@ 1 mark staff 1576107 6 Sep 11:37 a.png # 157kB convert -size 512x512 xc:gray +noise random -alpha transparent a.png # recreate but make transparent -rw-r--r--@ 1 mark staff 1793567 6 Sep 11:38 a.png # 179kB, extra transparency channel convert -size 512x512 xc:gray +noise random -alpha transparent -alpha background a.png # make all transparent pixels black -rw-r--r--@ 1 mark staff 1812 6 Sep 11:38 a.png # Presto! 

Установка оттенков серого с -set colorspace Gray не уменьшит размер файла PNG, если эти параметры также не используются:

 -define png:compression-level=9 -define png:format=8 -define png:color-type=0 -define png:bit-depth=8 

Это делает 8-битный оттенок серого с самым высоким сжатием PNG. Добавление этих параметров уменьшило мой размер изображения 3 ×, потому что теперь это один канал (оттенки серого), тогда как до него было 3 (RGB).