个性化阅读
专注于IT技术分析

如何在PHP中使用pngquant

本文概述

GIF, JPG和PNG文件是用于网络的三种主要图像格式, 它们之间的区别是生成的图像。每个网站都有自己的使用位置(作为用户界面的一部分或只是用户上传的内容)。开发PNG文件是基于gif的目的。设计人员需要能够合并快速加载但看起来也不错的低分辨率图像的能力(不及可以缩放但可以接受的SVG)。这就是PNG的来源。PNG文件是一种无损格式, 这意味着压缩不会影响图像的质量。与JPG会在特定点产生伪影并模糊图像的JPG不同, PNG文件始终看起来至少与原始图像一样清晰。

对于开发人员来说, 格式并不重要(除非明确需要特殊格式), 这里重要的是图像的处理方式以及是否压缩图像, 尤其是当你要注意网站的加载时间, 它们在服务器硬盘中的占用空间等。要压缩PNG文件, 可以使用已知的png压缩库pngquant。

pngquant是一个命令行实用工具, 是用于PNG图像有损压缩的库。转换会显着减小文件大小(在大多数情况下, 多达70%的文件大小并且几乎具有相同的质量), 并保留完整的alpha透明度。生成的图像与所有现代Web浏览器兼容, 并且在IE6中的回退效果比24位PNG更好。最好的是, 它可以与PHP一起使用。

在本文中, 你将学习如何通过库或纯PHP将pngquant与PHP一起使用。

要求

你将需要在计算机上安装pngquant的命令行版本, 并且该路径需要(不是必须的, 但值得推荐的)可访问路径。 pngquant适用于几乎所有操作系统, 可以从此处的官方网站直接下载。

视窗

你可以从此链接下载适用于Windows的pngquant可执行文件。

的Ubuntu

要在ubuntu中安装pngquant, 可以从定制存储库中安装它, 并在终端中执行以下命令:

sudo add-apt-repository ppa:danmbox/ppa

sudo apt-get update

sudo apt-get install pngquant

苹果系统

你可以使用brew安装pngquant:

brew install pngquant

如果此处没有适用于你的操作系统的安装方法, 请参阅pngquant主页。如前所述, 你可以通过包装器库将pngquant与PHP结合使用, 这将使用法变得非常容易, 或者你可以使用纯PHP执行控制台命令以实现你的目标。

A.使用库

你可以使用php-pngquant库处理pngquant。 php-pngquant是很棒的pngquant CLI的简单包装。如果使用composer, 则可以在控制台中执行以下命令来安装它:

composer require ourcodeworld/php-pngquant

或者, 如果你不使用Composer, 只需下载存储库的PNGQuant.php类, 然后使用require_once将其添加到你的代码中。

PNGQuant类将为你解决问题。以与命令行相同的方式, PNGQuant类为pngquant的CLI中可用的每个参数和选项添加了一个方法, 这使得使用php非常直观。

要压缩PNG图像, 你将需要在PNGQuant实例中至少使用3种方法:

<?php

use ourcodeworld\PNGQuant\PNGQuant;

$instance = new PNGQuant();

// The instance of PNGQuant is chainable

$instance
    // Set image to compress
    ->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生成的状态代码并将该代码与错误表进行比较:

<?php

use ourcodeworld\PNGQuant\PNGQuant;

$instance = new PNGQuant();

// Retrieve the status code generated by pngquant (with the execute method)
$status_code = $instance
    // Set image to compress
    ->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的错误表。我们建议你阅读php-pngquant的官方文档, 以查看所有可用的方法和其他示例。

如果pngquant在路径中不可用, 则可以使用setBinaryPath方法更改其路径:

<?php

use ourcodeworld\PNGQuant\PNGQuant;

$instance = new PNGQuant();

// Retrieve the status code generated by pngquant
$status_code = $instance
    // Set path to pngquant in windows
    ->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:

<?php 
use ourcodeworld\PNGQuant\PNGQuant;

$instance = new PNGQuant();

$result = $instance
    ->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的实现是非常基本的), 并且它们不提供错误处理。 (此包装由Our Code World编写)

B.纯PHP

由于pngquant是一个命令行实用程序, 因此我们将使用php的系统方法来执行命令行指令。要执行的命令由你决定, 主要要点是你需要使用php的系统方法来检索状态代码以了解命令发生了什么。

以下示例显示如何使用系统执行名为compress_png的函数的命令, 该函数期望将要压缩的图像的路径作为第一个参数, 并将应保存压缩文件的路径作为第二个参数:

<?php 

function compress_png($image_input, $image_output)
{
    // Executable pngquant (or path)
    $path_pngquant = "pngquant";

    $image_output_escaped = escapeshellarg($image_output);

    // Generates a commands like:
    // pngquant image-original.png --output "/a-folder/image-compressed.png" --force --quality 50-80
    $cmd = "$path_pngquant $image_input --output $image_output_escaped --force --quality 50-80";

    $status_code = null;

    // Execute the command
    system($cmd, $status_code);

    return $status_code;
}

$exit_code = compress_png("image.png", "image-compressed.png");
 
/* Compare the exit code as you want
"0" => "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"
*/

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在PHP中使用pngquant

评论 抢沙发

评论前必须登录!