我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

webp是近几年最新流行的图片格式,目前百度图片已经全面使用webp格式。所以,这里苏南大叔也进行了一些尝试,看看webp是否适合替换目前的博客png图片呢?php如何生成webp格式图片呢?如何把现有的png图片转换成webp格式呢?

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - php-webp-hero
php如何生成webp图片?如何进行webp图片格式转化?(图6-1)

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文记录使用php生成webp格式图片的经验。本文测试环境:centos@7.7.1908php@7.4.28gd@2.1.0

判断系统环境

本文的测试环境是:宝塔面板自带的php@7.4.28phpinfo()显示如下:

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - phpinfo
php如何生成webp图片?如何进行webp图片格式转化?(图6-2)

如果您的没有显示webp enabled之类的字样的话,请重新编译php或者gd.so文件。

  • php73及以前版本的编译参考选项是--with-webp-dir
  • php74的编译参考选项是--with-webp

最简单代码

直接显示webp图片:

$img_path = dirname(__FILE__).DIRECTORY_SEPARATOR."png.png";
$im = @imagecreatefrompng($img_path);
header('Content-type:image/webp');
imagewebp($im, null, 100);
imagedestroy($im);

进行格式转化,并保存文件:

$img_path = dirname(__FILE__).DIRECTORY_SEPARATOR."png.png";
$img_path2 = dirname(__FILE__).DIRECTORY_SEPARATOR."test.webp";
$im = imagecreatefrompng($img_path);
imagewebp($im,$img_path2, 100);
imagedestroy($im);

这两个代码中,可见区别仅仅在于imagewebp的第二个参数,

  • 当为null的时候,搭配header就可以显示一个webp图片。
  • 当为具体路径的时候,就可以保存一个图片。

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - 普通代码
php如何生成webp图片?如何进行webp图片格式转化?(图6-3)

其中的图片质量,苏南大叔设置的是100。但是,最终无论是图片质量还是显示效果,都不能表示满意。所以,博客还是保持目前的png格式。对比本代码中生成的webp文件,本博客中使用pngquant处理过的png文件,完胜。

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - 体积对比
php如何生成webp图片?如何进行webp图片格式转化?(图6-4)

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - 效果对比明显
php如何生成webp图片?如何进行webp图片格式转化?(图6-5)

另外,如果您的原图是jpg等其它格式的话,请使用对应的imagecreatefrom函数。参考文章:

报错一,扩展支持

您可能会遇到下面的报错信息:

Fatal error: Uncaught Error: Call to undefined function imagewebp()

这个错误是phpgd库的问题,没有开启webp支持。您可以选择重新编译php或者gd.so,下面是参考文章:

报错二,格式问题

苏南大叔的博客图片里面是png格式。流程上一般都是使用photoshop生成png图片,然后在代码中再调用pngquant生成图片。参考文章:

苏南大叔:php如何生成webp图片?如何进行webp图片格式转化? - 兼容代码
php如何生成webp图片?如何进行webp图片格式转化?(图6-6)

那么,使用原始的photoshop导出的png图片时,上述最简代码是可以正常运转的。但是,使用被代码处理过png图片作为输入图片的时候,会引发两个奇怪的错误。

Warning: imagecreatefrompng(): gd-png: libpng warning: Interlace handling should be turned on when using png_read_image
Fatal error: Paletter image not supported by webp

这个错误,据说是因为开启了交错选项,所以,使用了@符号,抑制错误输出。然后增加了Paletter相关代码:

$im = @imagecreatefrompng($img_path);
imagepalettetotruecolor($im);
imagealphablending($im, true);
imagesavealpha($im, true);

相关文章

综述

php一般都是利用gd.so扩展对图片进行处理的,如果不能处理相关错误,请先检查相关扩展设置。

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

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    gd