本文概述
- 要求
- A.使用库
- B.纯PHP
对于开发人员来说, 格式并不重要(除非明确需要特殊格式), 这里重要的是图像的处理方式以及是否压缩图像, 尤其是当你要注意网站的加载时间, 它们在服务器硬盘中的占用空间等。要压缩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/ppasudo apt-get updatesudo 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种方法:
<
?phpuse 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生成的状态代码并将该代码与错误表进行比较:
<
?phpuse 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方法更改其路径:
<
?phpuse 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 = http://www.srcmini.com/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"
*/
【如何在PHP中使用pngquant】编码愉快!
推荐阅读
- Soundex算法(函数)在不同编程语言中的实现
- 如何在Symfony 3中使用SnappyBundle(wkhtmltoimage)创建网站的屏幕截图
- 如何在Symfony 3中强制通过HTTPS(基于SSL的HTTP)进行访问
- 如何在Symfony 4中安装和配置FOSUserBundle
- 如何使用LFTP脚本使用LFTP(sftp)下载远程目录
- 如何使用Doctrine和Symfony 3实现Soundex搜索(在MySql中)
- 如何解决Ubuntu 16.04中的Plesk安装/升级错误(系统中没有/etc/localtime文件)
- 如何在AWS Ubuntu 16.04实例上以root身份允许SSH和SFTP访问
- 在Plesk中创建MySQL Server数据库的非增量(逻辑备份)自动备份外壳脚本(sh)