0

0

PHP WebP 图像元数据处理教程:读取与写入 EXIF 和 XMP 数据

聖光之護

聖光之護

发布时间:2025-10-21 12:28:34

|

1050人浏览过

|

来源于php中文网

原创

php webp 图像元数据处理教程:读取与写入 exif 和 xmp 数据

本文档旨在指导开发者如何在 PHP 中读取和写入 WebP 图像的 EXIF 和 XMP 元数据。WebP 格式支持 EXIF 和 XMP 元数据,本文将介绍如何利用 PHP 实现对这些元数据的读取和写入操作,并提供示例代码和注意事项,帮助开发者更好地处理 WebP 图像。

WebP 是一种现代图像格式,由 Google 开发,旨在提供卓越的图像压缩效果,同时保持高质量。WebP 格式支持有损和无损压缩,并且能够存储 EXIF 和 XMP 元数据。在 PHP 中处理 WebP 图像的元数据,可以实现诸如图像信息提取、版权信息管理等功能。

WebP 元数据结构

WebP 格式基于 RIFF (Resource Interchange File Format) 容器格式,允许包含多个数据块(chunks)。其中,与元数据相关的块包括:

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

  • EXIF: 存储 EXIF 元数据。
  • XMP: 存储 XMP 元数据。
  • ICCP: 存储 ICC 色彩配置文件
  • IPTC: 存储 IPTC 元数据(部分软件支持)。

读取 WebP 元数据

PHP 的 exif_read_data() 函数通常用于读取图像的 EXIF 信息,但可能无法直接读取 WebP 图像的 EXIF 信息,导致出现 "File not supported" 的警告。

一种解决方案是手动解析 WebP 文件的 RIFF 结构,找到 EXIF 和 XMP 块,并提取其中的数据。但是,这种方法比较复杂,需要对 RIFF 格式有深入的了解。

另一种更简单的方法是使用第三方库,例如 imagick 或 exiftool。这些库提供了更强大的图像处理功能,包括读取和写入 WebP 图像的元数据。

使用 Imagick 读取 WebP 元数据

首先,确保你的 PHP 环境安装了 Imagick 扩展。

// Linux (Debian/Ubuntu)
sudo apt-get update
sudo apt-get install php-imagick

// Linux (CentOS/RHEL)
sudo yum install php-pecl-imagick

// 启用扩展 (如果需要)
sudo phpenmod -v all -e imagick

然后,可以使用以下代码读取 WebP 图像的 EXIF 和 XMP 数据:

<?php

$imagePath = 'path/to/your/image.webp';

try {
    $imagick = new Imagick($imagePath);

    // 读取 EXIF 数据
    $exifData = $imagick->getImageProperties("exif:*");
    echo "EXIF Data:\n";
    print_r($exifData);

    // 读取 XMP 数据
    $xmpData = $imagick->getImageProperties("xmp:*");
    echo "\nXMP Data:\n";
    print_r($xmpData);

} catch (ImagickException $e) {
    echo "Error: " . $e->getMessage() . "\n";
}

?>

这段代码首先创建了一个 Imagick 对象,然后使用 getImageProperties() 方法读取 EXIF 和 XMP 数据。"exif:*" 和 "xmp:*" 参数分别表示读取所有 EXIF 和 XMP 属性。

写入 WebP 元数据

直接使用 exif_read_data() 和相关的写入函数修改 WebP 文件的 EXIF 信息可能不可靠。更可靠的方法是手动修改 RIFF 结构,或者使用 imagick 或 exiftool。

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载

手动修改 RIFF 结构

以下示例代码展示了如何手动将 EXIF 数据添加到 WebP 文件中。

<?php

$targetFile = 'TARGET.WEBP';
$exifData = '...the binary data...';  // 从其他文件读取的 EXIF 数据
$exifLen = strlen($exifData);

// RIFF 需要 16 位对齐
if ($exifLen % 2 == 1) {
    $exifData .= "\0";
    $exifLen++;
}

$hFile = fopen($targetFile, 'r+');
fseek($hFile, 0, SEEK_END); // 定位到文件末尾

fwrite($hFile, 'EXIF'); // 写入 4 字节 Chunk ID
fwrite($hFile, pack('V', $exifLen)); // 写入 4 字节 Payload 长度
fwrite($hFile, $exifData); // 写入实际数据

$fileSize = ftell($hFile); // 获取新的文件大小
fseek($hFile, 4, SEEK_SET); // 定位到文件的第 5 个字节
fwrite($hFile, pack('V', $fileSize - 8)); // 写入新的文件大小

fclose($hFile);

?>

这段代码首先将 EXIF 数据读取到 $exifData 变量中,然后计算数据长度,并进行 16 位对齐。接着,打开 WebP 文件,定位到文件末尾,写入 EXIF Chunk 的 ID、长度和数据。最后,更新 RIFF 容器的文件大小。

使用 Imagick 写入 WebP 元数据

虽然Imagick主要用于读取,但也可以间接实现写入,例如先读取EXIF/XMP,修改后再整体写入。更推荐的方法是结合exiftool。

使用 Exiftool 写入 WebP 元数据

Exiftool 是一个强大的命令行工具,可以读取、写入和修改各种图像和音频文件的元数据。可以使用 PHP 的 exec() 函数调用 Exiftool 来修改 WebP 图像的元数据。

首先,确保你的系统安装了 Exiftool。

// Linux (Debian/Ubuntu)
sudo apt-get update
sudo apt-get install libimage-exiftool-perl

// Linux (CentOS/RHEL)
sudo yum install perl-Image-ExifTool

然后,可以使用以下代码写入 WebP 图像的 EXIF 和 XMP 数据:

<?php

$imagePath = 'path/to/your/image.webp';
$exiftoolPath = '/usr/bin/exiftool'; // Exiftool 的路径

// 设置 EXIF 数据
$exifTitle = 'My WebP Image';
$exifDescription = 'This is a WebP image with metadata.';

// 构建 Exiftool 命令
$command = sprintf(
    '%s -Title="%s" -Description="%s" -overwrite_original %s',
    $exiftoolPath,
    $exifTitle,
    $exifDescription,
    $imagePath
);

// 执行命令
exec($command, $output, $returnCode);

// 检查执行结果
if ($returnCode === 0) {
    echo "Metadata written successfully.\n";
} else {
    echo "Error writing metadata: " . implode("\n", $output) . "\n";
}

?>

这段代码首先设置要写入的 EXIF 数据,然后构建 Exiftool 命令,并使用 exec() 函数执行该命令。-Title 和 -Description 参数分别表示要写入的标题和描述信息。-overwrite_original 参数表示覆盖原始文件。

注意事项

  • 在手动修改 RIFF 结构时,务必小心,确保数据的正确性,否则可能导致图像文件损坏。
  • 使用第三方库时,需要确保库的版本与 PHP 环境兼容。
  • Exiftool 需要在系统上安装,并且 PHP 脚本需要有执行 Exiftool 的权限。
  • 在生产环境中,应该对用户输入进行验证和过滤,以防止命令注入攻击。

总结

本文介绍了如何在 PHP 中读取和写入 WebP 图像的 EXIF 和 XMP 元数据。虽然 PHP 的 exif_read_data() 函数可能无法直接读取 WebP 图像的 EXIF 信息,但可以使用第三方库(如 Imagick)或手动解析 RIFF 结构来读取元数据。写入元数据可以使用手动修改 RIFF 结构或使用 Exiftool 工具。在实际应用中,应根据具体需求选择合适的方法,并注意安全性。

热门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方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

463

2024.06.27

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

37

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

136

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

47

2026.03.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号