0

0

WebP 图像元数据处理:PHP 支持与实践

碧海醫心

碧海醫心

发布时间:2025-10-23 12:50:01

|

883人浏览过

|

来源于php中文网

原创

webp 图像元数据处理:php 支持与实践

本文旨在介绍如何在 PHP 中读取和写入 WebP 图像的元数据,包括 EXIF 和 XMP 数据。WebP 格式本身支持这些元数据,但 PHP 的 `exif_read_data` 函数可能无法直接读取。本文将提供一种通过直接操作 WebP 文件结构的方式来添加元数据的方法,并提供示例代码。

WebP 格式与元数据支持

WebP 图像格式基于 RIFF (Resource Interchange File Format) 容器格式,允许嵌入多种类型的元数据,包括 EXIF、XMP 和 ICCP。这意味着 WebP 本身是支持元数据的存储的。

PHP exif_read_data 函数的局限性

PHP 的 exif_read_data 函数在处理 WebP 图像时,可能会因为底层库的支持问题而无法正确读取元数据。这并不意味着 WebP 不支持元数据,而是 PHP 的函数可能存在兼容性问题。

手动添加元数据到 WebP 文件

由于 exif_read_data 函数的局限性,我们可以通过直接操作 WebP 文件的结构来添加元数据。WebP 文件由多个 Chunk 组成,每个 Chunk 包含一个 4 字节的标识符(FourCC),一个 4 字节的 Chunk 大小,以及实际的 Chunk 数据。

立即学习PHP免费学习笔记(深入)”;

WebP 文件的基本结构如下:

ModelGate
ModelGate

一站式AI模型管理与调用工具

下载
  1. RIFF 头部:
    • RIFF (4 字节): 文件标识符
    • 文件大小 (4 字节): 整个文件的大小减去 8 字节
    • WEBP (4 字节): WebP 格式标识符
  2. Chunk 数据:
    • Chunk ID (4 字节): 例如 EXIF、XMP 或 ICCP
    • Chunk 大小 (4 字节): Chunk 数据的长度
    • Chunk 数据 (可变长度): 实际的元数据内容

要添加元数据,我们需要创建一个新的 Chunk,将其附加到 WebP 文件的末尾,并更新文件大小。

PHP 示例代码:添加 EXIF 数据

以下是一个 PHP 示例代码,演示如何将 EXIF 数据添加到 WebP 文件中:

<?php

/**
 * Adds EXIF metadata to a WebP image file.
 *
 * @param string $targetFile The path to the WebP image file.
 * @param string $exifData The binary EXIF data to add.
 * @return bool True on success, false on failure.
 */
function addExifToWebP(string $targetFile, string $exifData): bool
{
    $exifLength = strlen($exifData);

    // RIFF requires 16-bit alignment
    if ($exifLength % 2 == 1) {
        $exifData .= "\0";
        $exifLength++; // Update length after padding
    }

    $fileHandle = fopen($targetFile, 'r+');
    if (!$fileHandle) {
        return false; // Failed to open file for writing
    }

    fseek($fileHandle, 0, SEEK_END); // Go to end of file

    // Write EXIF chunk
    fwrite($fileHandle, 'EXIF'); // 4 bytes chunk ID
    fwrite($fileHandle, pack('V', $exifLength)); // 4 bytes of payload length
    fwrite($fileHandle, $exifData); // Actual data

    $fileSize = ftell($fileHandle); // Get new file size

    fseek($fileHandle, 4, SEEK_SET); // Go to 5th byte of file
    fwrite($fileHandle, pack('V', $fileSize - 8)); // Write 4 bytes, patching old filesize

    fclose($fileHandle); // Store everything

    return true;
}

// Example usage:
$targetWebP = 'target.webp';
$exifData = file_get_contents('source.jpg'); // Get EXIF data from a JPEG file

// Extract EXIF data from JPG using exif_read_data
$exif = exif_read_data('source.jpg');
if ($exif === false) {
    echo "No EXIF data found in source.jpg.\n";
} else {
    // Convert the EXIF data to a binary string (this is a simplified example)
    $exifData = serialize($exif); // Consider using a proper EXIF serialization library

    if (addExifToWebP($targetWebP, $exifData)) {
        echo "EXIF data added to $targetWebP successfully.\n";
    } else {
        echo "Failed to add EXIF data to $targetWebP.\n";
    }
}

?>

代码解释:

  1. addExifToWebP 函数:
    • 接受 WebP 文件路径和 EXIF 数据作为参数。
    • 打开 WebP 文件,并将文件指针移动到文件末尾。
    • 写入 EXIF Chunk 标识符、EXIF 数据长度和实际的 EXIF 数据。
    • 获取新的文件大小,并更新文件头部的文件大小信息。
    • 关闭文件。
  2. 示例用法:
    • 从 JPEG 文件读取 EXIF 数据(需要确保 source.jpg 存在)。
    • 调用 addExifToWebP 函数将 EXIF 数据添加到 WebP 文件。

注意事项:

  • 该示例使用了 serialize 函数来将 EXIF 数组转换为字符串。在实际应用中,建议使用专门的 EXIF 序列化库,以确保数据的正确性和兼容性。
  • RIFF 格式要求 Chunk 数据进行 16 位对齐。如果 Chunk 数据长度为奇数,需要在末尾添加一个空字节 \0。
  • 错误处理:代码包含基本的错误处理,例如检查文件是否成功打开。在生产环境中,应该添加更完善的错误处理机制。

总结

虽然 PHP 的 exif_read_data 函数可能无法直接读取 WebP 图像的元数据,但 WebP 格式本身支持元数据存储。通过手动操作 WebP 文件结构,我们可以将 EXIF 或 XMP 数据添加到 WebP 文件中。请务必注意文件格式的细节,并进行适当的错误处理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.12.20

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

888

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

464

2024.06.27

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

293

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

178

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号