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

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

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

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

2 ответа

Решение

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 цвета и проверьте размер - до 2361 байта.

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).

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