分享到: 分享到QQ  分享到Twitter

作者: kideny    访问次数: 676 创建时间: 2023-05-19 20:50:44 更新时间: 2024-04-27 12:48:25

AVIF是基于开源的视频格式AV1的图片格式,由于开源免费得到了几乎所有浏览器大厂的支持,已经成为下一代图片格式的王者。目前LoserHub网站正在重写图片处理的相关程序,把原来JPEG和PNG的图片,全部转换成AVIF格式。把自己的一点经验心得,PHP程序中如何使用AVIF图片格式分享给大家。

 

第一:PHP8.1开始支持AVIF图片格式

 

如果想要在PHP程序中使用AVIF图片格式,需要把你的PHP版本升级到PHP8.1。

PHP的两大图片扩展,GD和ImageMagick都已经支持AVIF。但是,使用起来稍微有点不同。

 

第二:GD扩展支持AVIF图片格式略微麻烦一点

 

大家熟知的GD扩展,依赖于 libavif 包来提供底层的AVIF编解码器。GD扩展需要libavif版本0.8.2以上。

Ubuntu/Debian系统使用以下命令安装libavif包

apt install libavif-dev

RHEL/Fedora/CentOS系统使用以下命令安装libavif包

dnf install libavif-devel

安装好依赖项后,需要开启GD拓展的同时,附带上对于AVIF的支持。

可以使用 ./configure 脚本中新的 --with-avif 标志在 AVIF 支持下编译 PHP。

./buildconf --force

./configure --enable-gd --with-avif

请注意,上面的 ./configure 命令只是一个实例。

对于生产系统,请确保也启用其他扩展,尽量使用Docker来确保开发和生产环境的配置一样。

 

PHP常用的Laradock的GD扩展,默认就是没有打开AVIF的。就算你的PHP版本是8.1以上,如果你安装了GD扩展,你也是没办法使用AVIF图片格式的。

不过,我会尽快提交PR,更新Laradock。让最新版的Laradock默认在PHP8以上,开启AVIF图片格式的支持。

 

第三:ImageMagick扩展直接就支持

 

如果你的PHP程序碰巧也安装了ImageMagick扩展,恭喜你,你直接就可以使用AVIF图片格式了。而不需要去重新编译GD,支持AVIF。

我就是运气好,同时安装了GD扩展和ImageMagick扩展。

 

第四:PHP8.1对AVIF格式的支持有一个重大的BUG

 

这个BUG并不来自于扩展,而是PHP中用于获取AVIF图片尺寸等信息的 getimagesize()函数,在PHP8.1下无法获取AVIF图片格式的尺寸等信息。

图片的宽高,位宽,通道,尺寸等信息,都无法获取。最TM神奇的是,这个BUG在PHP8.2下修复了,但是PHP8.1下没有修复。我搞不懂,这是因为什么。

你在PHP8.1下支持AVIF图片格式,但是搞了这么大一个BUG,以至于在PHP8.1下无法使用。

像Phalcon这些框架至今不支持PHP8.2,所以大量的程序现在是无法使用AVIF图片格式的。等到框架和所有的依赖都支持PHP8.2,都不知道猴年马月了。

所以,在确定使用AVIF之前,一定要调查清楚你的程序能否升级到PHP8.2。所以像我这样无视BUG,在无法获取图片大小的情况下,先升级到AVIF再说。

等以后升级到PHP8.2以后,再写程序批量修改图片信息。

详细信息看一看PHP官网:https://www.php.net/manual/zh/function.getimagesize.php

PHP8.2.0首先修复了这个蛋疼的BUG, 现在将正确返回 AVIF 图像的实际尺寸、bits 和 channels;以前,尺寸报告为 0x0,并且不会报告 bits 和 channels。

 

第五:最后说说AVIF图片格式的优缺点

 

画质最强的图片格式,依然是PNG。支持几乎无限的图片尺寸,对HDR和宽色域的支持。缺点也是十分明显的,体积庞大。Xbox游戏机系统自带的截图功能,默认就是PNG格式。单张4K图片的大小在,15MB左右。微软是不会在这个地方妥协的。

AVIF图片格式大概比JPEG小三分之一,对于互联网来说这个体积的诱惑是无比巨大的。AVIF目前得到了,所有主流浏览器的支持,已经可以完全商业化使用了。

不过,需要注意AVIF最大支持8K分辨率的图片,不知道后续时候会改变这个,这里算AVIF和PNG的一个主要区别。AVIF同样支持444采样,以及HDR和宽色域,在游戏截图等领域,是可以部分替代PNG的。

AVIF是开源的格式,没有专利费的困扰,而且得到了所有主流大厂的支持。

 

第六:Windows下无法显示AVIF图片的问题

 

去微软商城下载AV1的视频播放插件,就可以了,不会影响到你把Windows当作开发环境。

 

第七:微软的Edge浏览器默认暂不支持AVIF图片

 

需要在启动的时候添加以下命令,使Edge开启对AVIF的支持。

--enable-features=msEdgeAVIF

微软将在2023年6月的更新中,正式支持AVIF图片。

 

总结

 

PHP对于AVIF的支持,真的是让人感觉有点蛋疼。不过,这不妨碍我投身AVIF的怀抱。JPEG可以直接抛弃了,AVIF就是下个时代的主流图片格式了。

 

季度最有价值文章

月度最有价值文章

帖子投票

名称 是否有价值
kideny
BigLoser

投票统计

是否原创: 100 %

100 % Complete (success)

是否有价值: 100 %

100% Complete

是否有素质: 100 %

100% Complete (warning)

是否合法: 100 %

100% Complete

   群组工具