费力气在服务器端配置好了pngquant之后,如果想在php中进行调用处理图片的话,还需要进行一些配置。

苏南大叔:php环境,如何在服务器端使用pngquant压缩图片? - php-pngquant
php环境,如何在服务器端使用pngquant压缩图片?(图4-1)

本文测试环境:centos@7.7.1908php@7.3libpng@1.6.37pngquant@2.7.10

安装pngquant

安装pngquant,请参考下面的文章:

安装libpnglibpng-devel,参考下面的文章:

重新安装pngquant的依赖,参考下面的文章:

苏南大叔:php环境,如何在服务器端使用pngquant压缩图片? - pngquant-version
php环境,如何在服务器端使用pngquant压缩图片?(图4-2)

启用exec函数

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

苏南大叔:php环境,如何在服务器端使用pngquant压缩图片? - php-function-shell_exec
php环境,如何在服务器端使用pngquant压缩图片?(图4-3)

不开启shell_exec()的话,还可以换成其它函数,但是都是算在危险函数里面的。所以,想清楚后再开启,责任自负。

启用php扩展

gd2.sofileinfo.so这两个扩展算是相关扩展,gd2.so一般都是默认开启的,而fileinfo.so一般都是要手工开启。如下截图,是在宝塔面板里面一键开启fileinfo的截图。

苏南大叔:php环境,如何在服务器端使用pngquant压缩图片? - php-extension-fileinfo
php环境,如何在服务器端使用pngquant压缩图片?(图4-4)

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系列文章:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。