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块中。
读取逻辑
- 读取文件前12字节,校验
RIFF头、文件长度、WEBP标识三个字段,确认是合法WEBP文件 - 从偏移量12字节开始遍历所有RIFF块,每个块前8字节为块标识(4字节)+块长度(4字节小端序)
- 匹配到
EXIF或XMP块时,读取对应长度的块内容,即可得到原始元数据 - 读取到的EXIF块内容可以直接传给
exif_read_data()解析内部字段
写入逻辑
- 读取原WEBP文件的所有RIFF块,过滤掉旧的
EXIF、XMP块 - 构造新的EXIF/XMP块,按照RIFF块格式拼接在原有块队列中
- 重新计算整个RIFF文件的总长度,更新RIFF头的长度字段后,将所有内容写入新文件即可
内容的提问来源于stack exchange,提问作者EL_EL
相关产品推荐
相关产品推荐

