pngquant — сжатие изображений PNG в командной строке Linux

До недавнего времени я не знал, что вы можете сжимать изображения PNG в командной строке Linux. если вы являетесь пользователем Linux, ориентированным на терминалы, то эта статья для вас.

Сжатие изображений имеет решающее значение для быстрой загрузки сайта. pngquant — это утилита командной строки и библиотека для сжатия изображений PNG с потерями.

pngquant может уменьшить размер изображения PNG до 70%, сохраняя полную альфа-прозрачность.

Созданные изображения совместимы со всеми веб-браузерами и операционными системами.

Особенности pngquant

  • Быстрый режим для обработки в реальном времени / большого количества изображений.
  • Высококачественная генерация палитры с использованием комбинации алгоритмов векторного квантования.
  • Легко интегрируется со скриптами оболочки, графическими интерфейсами и серверным программным обеспечением.
  • Уникальный адаптивный алгоритм сглаживания, который добавляет меньше шума к изображениям, чем стандартный Floyd-Steinberg.

Установка pngquant в Linux

pngquant может быть установлен из вашего репозитория операционной системы или скомпилирован из исходного кода.

Преимущество сборки pngquant из исходного кода состоит в том, что вы получаете последний выпуск по сравнению с пакетами, доступными в репозитории системы.

Установите pngquant на CentOS / Fedora

Сначала установите необходимые зависимости.

sudo yum -y install git libpng-devel gcc cmake

Затем клонируйте pngquant  из Git.

git clone --recursive https://github.com/kornelski/pngquant.git

Запустите ./configure и make для генерации pngquant исполняемого файла в текущем каталоге.

cd pngquant
./configure 
make

Если вы хотите установить его для всей системы, выполните команду:

sudo make install

Двоичный файл будет скопирован в /usr/local/bin/pngquant

$ pngquant --version
 2.12.2 (November 2018)

Установите pngquant в Ubuntu / Debian

Установите необходимые зависимости

sudo apt-get update
sudo apt-get install -y git gcc cmake libpng-dev pkg-config

Клонируйте pngquant

git clone --recursive https://github.com/kornelski/pngquant.git

Установите его, выполнив команды ниже

cd pngquant
./configure 
make
sudo make instal

Установите pngquant в Arch Linux / Manjaro

Последняя версия pngquant может быть установлена на Arch Linux с помощью команды pacman.

sudo pacman -S pngquant

Использование pngquant в Linux CLI

Вы можете вывести все параметры pngquant, используя параметр —help.

$ pngquant --help
pngquant, 2.12.2 (November 2018), by Kornel Lesinski, Greg Roelofs.
   Compiled with no support for color profiles. Using libpng 1.6.34.

usage:  pngquant [options] [ncolors] -- pngfile [pngfile ...]
        pngquant [options] [ncolors] - >stdout <stdin

options:
  --force           overwrite existing output files (synonym: -f)
  --skip-if-larger  only save converted files if they're smaller than original
  --output file     destination file path to use instead of --ext (synonym: -o)
  --ext new.png     set custom suffix/extension for output filenames
  --quality min-max don't save below min, use fewer colors below max (0-100)
  --speed N         speed/quality trade-off. 1=slow, 4=default, 11=fast & rough
  --nofs            disable Floyd-Steinberg dithering
  --posterize N     output lower-precision color (e.g. for ARGB4444 output)
  --strip           remove optional metadata (default on Mac)
  --verbose         print status messages (synonym: -v)

Quantizes one or more 32-bit RGBA PNGs to 8-bit (or smaller) RGBA-palette.
The output filename is the same as the input name except that
it ends in "-fs8.png", "-or8.png" or your custom extension (unless the
input is stdin, in which case the quantized image will go to stdout).
If you pass the special output path "-" and a single input file, that file
will be processed and the quantized image will go to stdout.
The default behavior if the output file exists is to skip the conversion;
use --force to overwrite. See man page for full list of options.

Пример 1

В моем ноутбуке у меня есть PNG-изображение размером 3,9 МБ, которое я сожму с помощью pngquant.

$ du -sh wallpaper-01.png
3.9M    wallpaper-01.png

Базовый пример сжатия изображения с помощью pngquant:

$ pngquant --force --quality=40-100 --strip --skip-if-larger \
--verbose wallpaper-01.png 
 wallpaper-01.png:
   read 3893KB file
   used gAMA and cHRM chunks to transform image to sRGB colorspace
   made histogram…231676 colors found
   selecting colors…14%
   selecting colors…28%
   selecting colors…100%
   moving colormap towards local minimum
   eliminated opaque tRNS-chunk entries…0 entries transparent
   mapped image to new colors…MSE=6.201 (Q=79)
   writing 256-color image as wallpaper-01-fs8.png
 Quantized 1 image.

Проверьте размер файла назначения `

$ du -sh wallpaper-01-fs8.png
1.4M    wallpaper-01-fs8.png

Вы можете увидеть размер 1,4 МБ. Это сокращение на 2,5 МБ, довольно внушительное.

Если вы хотите перезаписать исходный файл конвертированным, используйте опцию —output file.

$ pngquant --force --quality=40-100 --strip --skip-if-larger \
--verbose --output wallpaper-01.png  wallpaper-01.png 
 wallpaper-01.png:
   read 3893KB file
   used gAMA and cHRM chunks to transform image to sRGB colorspace
   made histogram…231676 colors found
   selecting colors…6%
   selecting colors…12%
   selecting colors…50%
   selecting colors…87%
   selecting colors…100%
   moving colormap towards local minimum
   eliminated opaque tRNS-chunk entries…0 entries transparent
   mapped image to new colors…MSE=6.111 (Q=79)
   writing 256-color image as wallpaper-01.png
 Quantized 1 image.

Проверка:

$ du -sh wallpaper-01.png
 1.4M    wallpaper-01.png

Пример 2: Сжатие нескольких изображений PNG

Если в вашей текущей папке у вас есть несколько изображений PNG, вы можете использовать цикл для сжатия всех элементов.

for i in *.png; do
  pngquant --force --quality=40-100 --strip --skip-if-larger \
--verbose $i
done

Пример 3: Поиск всех изображений PNG в каталоге и сжатие.

Вы также можете использовать команду поиска Linux, чтобы найти все изображения PNG в указанном каталоге и сжать их, а затем встроить.

find /mysite/wp-content/uploads/ -type f -iname '*.png' -exec \
 pngquant --force --quality=40-100 --skip-if-larger --strip --verbose {} --output {} \;

Замените /mysite/wp-content/uploads/ рекурсивным поиском.

Please follow and like us: