AVIF 图像使用的内容类型(又名 Mime 类型)是 image/webp,标准文件扩展名是 .avif。
AV1 或者 AVIF 是一种新的图像压缩格式,通常会生成比 WebP、JPEG 和 PNG 更小的文件大小;低多少取决于用于将图像保存或者转换为 AVIF 的设置。
通过使用 AVIF,我们可能会遇到比 WebP 低约 20% 和比 JPEG 低约 50% 的文件大小。
AVIF 文件的典型标头响应可能如下所示:
HTTP/1.1 200 OK content-type: image/avif content-length: 14200
从 PHP 提供图像/avif 内容类型:
header('content-type: image/avif'); echo $image_data; exit();
将图像转换为avif
图像目前还不能直接从 PHP 转换为 AVIF,但我们仍然可以通过调用外部命令(例如 ImageMagick 套件中的 convert 命令)来转换图像;为此,我们可以使用 shell_exec 函数:
shell_exec('convert my-image-file.jpg -quality 50% my-image-file.avif');
请记住转义命令的相关部分:
$path = '/var/www/mysite/images/my-image-file.jpg'; $avif_server_loc = '/var/www/mysite/images/my-image-file.avif'; shell_exec('convert ' . escapeshellcmd($path . ' -quality 50% ' . $avif_server_loc));
在尝试转换文件之前检查文件是否存在时,可能不需要转义,但是,这仍然是一个很好的做法。
检测结果
为了测试转换为 AVIF 时会压缩多少图像,我在 Linux 中使用了 ImageMagick convert 命令;这可以像这样执行:
convert my-image.jpg -quality 50% my-image.avif
我发现通常 AVIF 可能比 WebP 小约 20%,比 JPEG 小近 50%。
PNG文件
但是,当我尝试直接转换 PNG 文件时,其中一些文件在转换为 AVIF 时实际上会变大;原因不明。
也许是由于我用于转换的工具。
原因可能是结果将取决于图像内容的大小和复杂性。
但是,如果我先将文件转换为 WebP,然后再转换为 PNG,那么在某些情况下我能够将文件大小减少近 20%。
由于与 PNG 图像的结果不一致,我决定在我的文件处理程序类中简单地禁用 PNG 的自动转换。
此外,如果我们已经使用 optipng、pngcrush 或者 advpng 等工具对其进行了压缩,那么其中一些文件已经进行了高度优化。
不应转换的文件
PNG、GIF 和 SVG 等文件可能不应该转换,因为它们有些特殊,具体取决于具体情况。
从技术上讲 .svg 是基于矢量的,因此我们可能很少希望将它们转换为光栅格式,例如 .avif。
问题是 .gif 文件是动画的,我不确定浏览器对 .webp 或者 .avif 动画的支持程度;我只是还没有测试过。
前面提到过,将.png 文件直接转换为.avif 时似乎也存在问题,导致转换后的文件的文件大小变得比原始文件大。
.webp 和 .avif 都支持 alpha 透明度,所以至少这似乎不是问题。