Сжать изображение 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).