php环境,如何在服务器端使用pngquant压缩图片?
发布于 作者:苏南大叔 来源:程序如此灵动~
费力气在服务器端配置好了pngquant之后,如果想在php中进行调用处理图片的话,还需要进行一些配置。

本文测试环境:centos@7.7.1908,php@7.3,libpng@1.6.37,pngquant@2.7.10。
安装pngquant
安装pngquant,请参考下面的文章:
安装libpng,libpng-devel,参考下面的文章:
重新安装pngquant的依赖,参考下面的文章:

启用exec函数
因为是在服务器端执行命令行,所以启用了一个危险函数shell_exec()。

不开启shell_exec()的话,还可以换成其它函数,但是都是算在危险函数里面的。所以,想清楚后再开启,责任自负。启用php扩展
gd2.so和fileinfo.so这两个扩展算是相关扩展,gd2.so一般都是默认开启的,而fileinfo.so一般都是要手工开启。如下截图,是在宝塔面板里面一键开启fileinfo的截图。

php相关代码
先检测是不是png图片(由fileinfo扩展提供的功能),然后利用pngquant对图片进行压缩。
$source_info = getimagesize($source_path);
$source_width = $source_info[0];
$source_height = $source_info[1];
$source_mime = $source_info['mime'];
// ...
if ($source_mime == "image/png") {
try {
$compressed = shell_exec("pngquant --force --quality=50-80 - <" . escapeshellarg($saved_path));
if ($compressed) {
file_put_contents($saved_path, $compressed);
$im2 = imagecreatefrompng($saved_path);
@imageinterlace($im2, TRUE);
//@imagealphablending($im2, TRUE);
//@imagesavealpha($im2, true);
imagepng($im2, $saved_path);
} else {
//throw new Exception("Conversion to compressed PNG failed.");
}
} catch (Exception $e) {
//print $e->getMessage();
}
}这段代码中的思路,可以参考下面的文章:
相关链接
总结
在php中使用pngquant,可以对png类型的图片进行服务器端压缩。fileinfo扩展是用来检测图片类型的。更多文章,请参考苏南大叔的pngquant系列文章: