You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP是否原生支持读写WEBP格式图片的EXIF、XMP元数据?

报错原因

你遇到的"File not supported"报错是因为PHP原生exif_read_data()函数的WEBP格式支持从PHP 7.2.0版本才正式加入,若使用低于该版本的PHP,或是编译时exif扩展未关联支持WEBP的底层依赖库,就会触发该报错。

原生实现读写WEBP元数据的方案

方案1:依赖原生exif扩展(仅读取场景优先使用)

  • 首先确认环境满足要求:
    • PHP版本 >= 7.2.0
    • 已开启exif、mbstring扩展
    • 可通过phpinfo()查看exif模块配置,确认WEBP支持已启用
  • 调整后的测试代码如下:
<?php
$photoSourceFull = "assets/images/att_galleryWebP/A0001_LSF-PHOTOS-WM-FULL-WEBP/A0001-EWF-LSF-01.webp";
// 先校验文件合法性
$finfo = new Finfo(FILEINFO_MIME_TYPE);
if ($finfo->file($photoSourceFull) !== 'image/webp') {
    die("传入的文件不是合法WEBP格式");
}

// 读取EXIF
$exif = exif_read_data($photoSourceFull, 0, true);
if ($exif === false) {
    echo "文件内不存在EXIF数据<br />\n";
} else {
    foreach ($exif as $key => $section) {
        foreach ($section as $name => $val) {
            echo "$key.$name: $val<br />\n";
        }
    }
}

方案2:解析RIFF容器实现全版本兼容(支持读写EXIF、XMP)

如果需要兼容更低PHP版本,或是需要写入元数据的能力,可以直接基于WEBP的RIFF容器结构原生解析,不需要依赖exif扩展的WEBP支持:

格式基础

WEBP是基于RIFF容器存储的格式,EXIF元数据存放在标识为EXIF的RIFF块中,XMP元数据存放在标识为XMP (注意末尾有一个空格)的RIFF块中。

读取逻辑

  1. 读取文件前12字节,校验RIFF头、文件长度、WEBP标识三个字段,确认是合法WEBP文件
  2. 从偏移量12字节开始遍历所有RIFF块,每个块前8字节为块标识(4字节)+块长度(4字节小端序)
  3. 匹配到EXIF或XMP 块时,读取对应长度的块内容,即可得到原始元数据
  4. 读取到的EXIF块内容可以直接传给exif_read_data()解析内部字段

写入逻辑

  1. 读取原WEBP文件的所有RIFF块,过滤掉旧的EXIF、XMP 块
  2. 构造新的EXIF/XMP块,按照RIFF块格式拼接在原有块队列中
  3. 重新计算整个RIFF文件的总长度,更新RIFF头的长度字段后,将所有内容写入新文件即可

内容的提问来源于stack exchange,提问作者EL_EL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:36:02