web技术

将webp转换成jpg的PHP程序,使用libwebp扩展实现

2023-07-19 12:01 作者:不是企鹅原创

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 工具。

推荐文章
在PHP中,我们通常使用第三方库或扩展来实现图片格式转换,但有时出于某些原...
网上有不少使用PHP将WebP格式转换为JPG格式的方法,什么libwebp库、ImageMagic...
如何用PHP将webp格式的图片文件转换为jpg格式?除了使用libwebp库,用PHP执行命...
我们通常使用使用GD库或libwebp库将webp格式转换为jpg格式,但也可以使用一种...
在编写PHP程序来执行webp格式转换成jpg格式的任务时,一种方法是使用PHP的图像...
推荐专题
如何自己建网站?建网站难不难?其实建网站说难不难,说容易也并不容易,难...
本专题精心收集整理了多种HTML+CSS+JS轮播图实现方案,带详细代码和讲解,正...