将webp转换成jpg的PHP程序,使用libwebp扩展实现
webp格式是一种新的图片格式,它拥有更小的文件体积和更好的图像质量。然而,由于某些原因,在某些情况下我们可能需要将 webp 格式的图片转换成 jpg 格式,这样可以确保图片在各种浏览器和设备上都能正常显示。本文将介绍如何使用 PHP+libwebp 来实现将 webp 格式转换成 jpg 格式。
本文使用的操作系统是CentOS 7.9 64位,PHP版本是5.6。
首先需要安装 libwebp 库,本文会介绍三种不同的安装方式:1、源码包方式;2、yum 方式;3、GitHub 克隆方式。但很遗憾,这三种方式都存在难以填补的坑:如果使用源码包方式或 GitHub 克隆方式,那么后续如果要使用 PHP的 imagick 扩展处理图片,将会遇到一个难以解决的错误,我翻遍国内外互联网,也没有找到一个能解决那个错误的方案;而如果只使用 yum 方式安装,则可能连某些简单的 cwebp 命令都无法执行。
不过本人经过研究测试,发现只要将“yum 方式”和其它两种方式结合起来,就可以解决问题。
在一些 CentOS 系统中已经内置了 libwebp 和 libwebp-devel ,可以使用以下命令查看系统已安装了多少 webp 相关的软件:
yum list installed | grep webp
但是不用管它们。
一、安装 libwebp 并使用PHP将 WEBP 格式转为 JPG 格式
首先请自己下载 libwebp-0.6.0.tar.gz 包,然后执行:
tar -xvzf libwebp-0.6.0.tar.gz
cd libwebp-0.6.0
./configure
make
make install
然后执行查询版本命令:
cwebp -version
会出现如下错误:
cwebp: error while loading shared libraries: libwebp.so.7: cannot open shared object file: No such file or directory
查看文件 /usr/local/lib/libwebp.so.7 是否存在,若存在则直接执行:
ln -s /usr/local/lib/libwebp.so.7 /usr/lib/libwebp.so.7
如果不存在,就想办法补上吧。
然后将 /usr/local/lib 加入到共享库配置文件/etc/ld.so.conf中:
vim /etc/ld.so.conf
如果没有 /usr/local/lib 则写入 /usr/local/lib,然后退出 vim 并执行:
ldconfig
上传一张 webp 图片,命名为 test.webp ,执行命令:
cwebp -q 80 test.webp -o out.jpg
可以看到生成了图片out.jpg
然后就可以用PHP实现 webp 转 jpg,PHP程序如下:
$quality = 80;
$cmd = "cwebp -q $quality test.webp -o out.jpg";
exec($cmd,$arr);
if(count($arr)){
print_r($arr);
}else{
echo 'OK';
}
其中 cwebp 命令还可以设置长、宽等其它参数,可以对图片进行压缩、裁剪等,大家可以自行了解。在此之前PHP需要开启 exec() 函数,不然会报错。
如果你只是想要使用 PHP 调用命令行实现 webp 到 jpg 的转换,那么做到这里已经可以实现目标了,但如果你以后可能会用到 imagick 扩展,或者想要更保险一点,建议你参考下文使用“yum 方式”再安装一次 libwebp 库。
二、使用 yum 方式安装
命令如下:
yum -y install libwebp
yum -y install libwebp-devel
yum -y install libwebp-tools
cwebp -version
查看版本号没有问题。
接着上传一张 webp 图片,命名为 test.webp ,并执行命令:
cwebp -q 80 test.webp -o out.jpg
如果前面已经通过源码包的方式安装了 libwebp 库,那么这一步是不会出错的。但如果单独使用 yum 方式安装,则这一步可能会出现如下错误:
Error! Could not process file test.webp
Error! Cannot read input picture file 'test.webp'
我目前还不知道这个问题如何解决,网上找不到关于这个错误的资料。
三、使用从 GitHub 克隆的方式安装 libwebp
执行以下命令下载安装 libwebp :
git clone https://github.com/webmproject/libwebp.git
cd libwebp
./autogen.sh
./configure
make
make install
如无意外就要出意外了,执行 make 时会出现如下错误:
vp8l_enc.c: In function 'EncoderAnalyze':
vp8l_enc.c:328:13: error: 'for' loop initial declarations are only allowed in C99 mode
这是C语言编译器报错,因为gcc是基于c89的标准,不能直接在for循环里定义循环变量,而c99标准则可以在for循环里定义循环变量。
这是一个坑爹的错误,因为gcc是系统内置的,升级或修改gcc配置可能会导致系统出现其它错误,所以我们还是手动修改这个出错的C语言源文件吧。
根据错误提示,错误处在文件 libwebp/src/enc/vp8l_enc.c 第328行,执行 vim src/enc/vp8l_enc.c 打开这个文件后,执行命令 :set nu! 显示行号,在第328行找到出错代码,如图所示:
修改为:
int ing_method = 0;
for (ing_method = 0; sorting_method < kPaletteSortingNum;
然后保存退出 vim 再执行 make && make install ,这次没有出错,幸好只有这么一处出现定义错误。
那么这时 libwebp 已经安装完成了吗?还没有,如果执行查询版本命令:
cwebp -version
会出现如下错误:
cwebp: error while loading shared libraries: libwebpdemux.so.2: cannot open shared object file: No such file or directory
和“源码包方式”相似,执行:
ln -s /usr/local/lib/libwebpdemux.so.2 /usr/lib/libwebpdemux.so.2
vim /etc/ld.so.conf
如果没有 /usr/local/lib 则写入 /usr/local/lib,然后退出 vim 并执行:
ldconfig
然后再执行命令 cwebp -version 即可看到版本号。
和“源码包方式”一样,你需要再执行一次 yum 安装才能让你的 libwebp 变得完美,不然后续如果使用 ImageMagick 、imagick处理图片,将会遇到无法找到原因和解决方案的错误,我没时间深究原因,估计是因为这两种方式只是构建 webp 编码器 cwebp 和解码器 dwebp ,而缺少其它必要的 libwebp 工具。