Как использовать pngquant с PHP

Файлы GIF, JPG и PNG — это три основных формата изображений, используемых для Интернета, различие между ними заключается в конечном изображении. Каждый из них имеет свое место для использования на веб-сайтах (как часть пользовательского интерфейса или просто загрузка пользователем). PNG-файлы были разработаны для использования в формате GIF. Дизайнеры нуждаются в способности включать изображения с низким разрешением, которые загружаются быстро, но при этом также выглядят великолепно (не так как SVG, который можно масштабировать, но приемлемо). Вот где приходит PNG. Файлы PNG — это формат без потерь, то есть сжатие не влияет на качество изображения. В отличие от JPG, которые создают артефакты и размывают изображения в определенной точке, файл PNG всегда будет выглядеть по меньшей мере таким же четким, как и исходное изображение.

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

pngquant — это утилита командной строки и библиотека для сжатия изображений PNG с потерями. Преобразование значительно уменьшает размеры файлов (в большинстве случаев до 70% размера файлов и почти с тем же качеством) и сохраняет полную альфа-прозрачность. Созданные изображения совместимы со всеми современными веб-браузерами и имеют лучший резерв в IE6, чем 24-битные PNG. Лучше всего, его можно использовать с PHP.

В этой статье вы узнаете, как использовать pngquant с PHP, используя либо библиотеку, либо с простым PHP.

Требования

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

Windows

Вы можете скачать исполняемый файл pngquant для окон по этой ссылке.

Ubuntu

Чтобы установить pngquant в Ubuntu, вы можете установить его из собственного репозитория, выполнив в терминале следующую команду:

sudo add-apt-repository ppa:danmbox/ppa
sudo apt-get update
sudo apt-get install pngquant

MacOS

Вы можете установить pngquant используя brew:

brew install pngquant

Если метод установки для вашей операционной системы не доступен здесь, пожалуйста, обратитесь к домашней странице pngquant. Как упоминалось ранее, вы можете использовать pngquant с PHP, используя библиотеку-оболочку, которая сделает его использование довольно простым, или вы можете выполнить с простым PHP консольную команду для достижения вашей цели.

А. Использование библиотеки

Вы можете использовать библиотека php-pngquant работать с pngquant. php-pngquant — это простая оболочка для потрясающего pngquant CLI. Если вы используете composer, вы можете установить его, выполнив в консоли следующую команду:

composer require ourcodeworld/php-pngquant

Или, если вы не используете Composer, просто скачать класс репозитория PNGQuant.php и добавьте его в свой код, используя require_once,

Класс PNGQuant поможет вам. Таким же образом, как это делает командная строка, класс PNGQuant добавляет метод для каждого аргумента и опции, доступных в CLI pngquant, что делает использование с php очень интуитивно понятным.

Чтобы сжать изображение PNG, вам нужно использовать как минимум 3 метода в экземпляре PNGQuant:

setImage("/a-folder/image-original.png")
// Path (and filename) of the output compress image
->setOutputImage("/a-folder/image-compressed.png")
// pngquant throws an error if the output file exists
// Use this method to overwrite if it exists
->overwriteExistingFile()
// Set the rangeo of the quality of the image
->setQuality(50,80)
// Execute the build command (compress the image)
->execute();

Вам нужно будет только указать входное изображение, путь к выходному изображению и диапазон качества, который вы хотите для своего файла PNG, и все, теперь вы используете pngquant с PHP. Однако в случае любой ошибки, которая может иметь pngquant, вы не будете знать, что произошло, поэтому вам нужно получить код состояния, сгенерированный pngquant, и сравнить его с таблицей ошибок:

setImage("/a-folder/image-original.png")
// Path (and filename) of the output compress image
->setOutputImage("/a-folder/image-compressed.png")
// pngquant throws an error if the output file exists
// Use this method to overwrite if it exists
->overwriteExistingFile()
// Set the rangeo of the quality of the image
->setQuality(50,80)
// Execute the build command (compress the image)
->execute();
// if exit code is equal to 0 then everything went right !
if(!$exit_code){
echo "Image succesfully compressed";
}else{
$description = $instance->getErrorTable()[(string) $exit_code];
echo "Something went wrong (status code $exit_code)  with description: ". $description;
}

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

Если pngquant недоступен в пути, вы можете изменить его, используя метод setBinaryPath:

setBinaryPath("C:\\Users\\sdkca\\Desktop\\pngquant.exe")
->setImage("/a-folder/image-original.png")
->setOutputImage("/a-folder/image-compressed.png")
->overwriteExistingFile()
->setQuality(50,80)
->execute();

Если вы не хотите записывать файл автоматически с библиотекой, а извлекаете двоичные (необработанные) данные из сжатого изображения PNG, вы можете использовать getRawOutput метод вместо execute:

setImage("/image/to-compress.png")
->setQuality(50,80)
->getRawOutput();
// Result is an array with the following structure
// $result = array(
//    'statusCode' => 0,
//    'tempFile' => "/tmp/example-temporal.png",
//    'imageData' => [String] (use the imagecreatefromstring function to get the binary data)
//)
// Get the binary data of the image
$imageData = imagecreatefromstring($result["imageData"]);
// Save the PNG Image from the raw data into a file or do whatever you want.
imagepng($imageData , '/result_image.png');

Заметка

Существуют другие библиотеки, которые позволяют вам использовать phpquant, однако они не специализируются только на pngquant (они используют другие библиотеки, и их реализация pngquant довольно проста), и они не обеспечивают обработку ошибок. (Эта оболочка была написана Нашим Кодовым Миром)

Б. Простой PHP

Поскольку pngquant — это утилита командной строки, мы будем использовать системный метод php для выполнения команды командной строки. Команда для выполнения зависит от вас, суть в том, что вам нужно использовать системный метод php для получения кода состояния, чтобы узнать, что произошло с командой.

В следующем примере показано, как использовать систему для выполнения команды с функцией compress_png, которая в качестве первого параметра ожидает путь к сжатому изображению, а в качестве второго параметра — путь, в котором должен быть сохранен сжатый файл:

 "SUCCESS",
"1" => "MISSING_ARGUMENT",
"2" => "READ_ERROR",
"4" => "INVALID_ARGUMENT",
"15" => "NOT_OVERWRITING_ERROR",
"16" => "CANT_WRITE_ERROR",
"17" => "OUT_OF_MEMORY_ERROR",
"18" => "WRONG_ARCHITECTURE", // Missing SSE
"24" => "PNG_OUT_OF_MEMORY_ERROR",
"25" => "LIBPNG_FATAL_ERROR",
"26" => "WRONG_INPUT_COLOR_TYPE",
"35" => "LIBPNG_INIT_ERROR",
"98" => "TOO_LARGE_FILE",
"99" => "TOO_LOW_QUALITY"
*/
Ссылка на основную публикацию
Adblock
detector