如何用PHP将webp转换成jpg格式,使用ImageMagick实现
如何用PHP将 webp 格式的图片文件转换为 jpg 格式?除了使用 libwebp 库,用PHP执行命令行实现简单的转换之外,还可以使用更强大的 ImageMagick 软件,通过PHP的 imagick 扩展对图片进行处理。基于 imagick 扩展编写的PHP图片处理程序比调用命令行的写法更加合理和健壮。本文将介绍 ImageMagick 、imagick 的安装、PHP代码的编写以及常见的问题。
本文使用的操作系统是CentOS 7.9 64位,PHP版本是5.6。
第一步:安装 libwebp 库
因为 ImageMagick 也是要用到 libwebp 库的。安装命令如下:
yum -y install libwebp
yum -y install libwebp-devel
yum -y install libwebp-tools
安装好之后执行 cwebp -version 命令查看版本号,查看成功即表示安装成功。
请注意,尽量使用 yum 方式安装 libwebp ,否则后面 imagick 将会遇到无法填补的坑,到时还得重装 libwebp 。
如果你实在不想使用 yum 方式,或者你的系统无法使用 yum 方式,那么可以参考我另一篇文件使用另外两种方式对 libwebp 进行安装:
《将webp转换成jpg的PHP程序,使用libwebp扩展实现》 http://www.sinsiu.com/a/59.html
第二步:安装 jpeg 库
wget https://download.imagemagick.org/archive/delegates/jpegsrc.v9b.tar.gz
tar -xvzf jpegsrc.v9b.tar.gz
cd jpeg-9b
./configure
make libdir=/usr/lib64
make libdir=/usr/lib64 install
请注意,若最后两步直接执行 make && make install 命令,则后面安装 ImageMagick 时会出现如下错误:
magick/.libs/libMagickCore-6.Q16.so: undefined reference to 'jpeg_default_qtables'
collect2: error: ld returned 1 exit status
第三步:安装 ImageMagick 软件
wget https://download.imagemagick.org/archive/ImageMagick-6.9.12-93.tar.gz
tar -xvzf ImageMagick-6.9.12-93.tar.gz
cd ImageMagick-6.9.12-93
./configure
make
make install
安装没有报错。但是执行查询版本命令:
convert -version
出现如下错误:
convert: error while loading shared libraries: libMagickCore-6.Q16.so.7: cannot open shared object file: No such file or directory
这个不难解决,只需要将对应的 so 文件从 /usr/local/lib/ 目录链接到 /usr/lib/ 目录即可,命令如下:
ln -s /usr/local/lib/libMagickCore-6.Q16.so.7 /usr/lib/libMagickCore-6.Q16.so.7
然后用 vim 打开 /etc/ld.so.conf 文件:
vim /etc/ld.so.conf
如果没有 /usr/local/lib 则追加写入 /usr/local/lib,然后退出 vim 并执行:
ldconfig
再次执行 convert -version 查看版本,这次应该没有问题了。
可以上传一张 webp 图片进行转换测试:
convert test.webp out2.jpg
如果前面没有安装 libwebp 库则会出错:
convert: delegate failed ''dwebp' -pam '%i' -o '%o'' @ error/delegate.c/InvokeDelegate/1994.
找不到 webp 格式的解码器 dwebp ,所以 ImageMagick 也是要用到 libwebp 的。
第四步:安装PHP的 imagick 扩展
命令如下:
wget http://pecl.php.net/get/imagick-3.4.3.tgz
tar -xvzf imagick-3.4.3.tgz
cd imagick-3.4.3
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-imagick=/usr/local
make
make test
make install
请注意,在执行了 make 之后会得到提示:
Don't forget to run 'make test'.
按提示执行 make test 之后得到报错:
The test-suite requires that proc_open() is available.
Please check if you disabled it in php.ini.
这时需要修改 php.ini 文件开启 proc_open() ,建议顺便把 proc_get_status()、exec()、shell_exec() 也开启了,因为不开启的话虽然 make test 不报错,但会产生大量警告。修改后执行 make install 。
然后还要再次修改 php.ini ,增加:
extension=imagick.so
然后重启Web服务器。
测试:
php -r 'phpinfo();' | grep imagick
#或者:
php --ri imagick
至此,完成了 imagick 安装,可以使用 PHP 程序进行 webp 到 jpg 的格式转换了。
PHP 程序:
header('Content-type: image/jpeg');
$input = 'test.webp';
$output = 'test.jpg';
$image = new Imagick();
$image->readImage($input);
$image->setImageFormat('jpg');
$image->writeImage($output);
$image->destroy();
echo file_get_contents($output);
实现效果如下:
如果 libwebp 库不是通过 yum 方式安装,则 PHP 程序可能出现如下错误:
unable to open file '/tmp/magick-DoNM6g4BFSJ76nTZweymAMe_6Z39xYac': No such file or directory @ error/constitute.c/ReadImage/621
对于这个错误,最好是使用 yum 的方式重新安装 libwebp 、libwebp-devel 和 libwebp-tools,目前找不到更好的解决方案。