php 可通过 exif_read_data() 函数读取 jpeg/tiff 的 exif 信息,需确保环境启用 exif 扩展;支持获取相机型号、时间、光圈等字段及 gps 坐标(需手动转换),但不适用于 png/webp/gif,且用户上传图片的 exif 不可信任。

PHP 通过内置的 exif_read_data() 函数可以直接读取 JPEG 和 TIFF 格式图片中的 EXIF 信息,无需额外扩展(前提是 PHP 编译时启用了 EXIF 支持,且 GD 或 exif 扩展已启用)。
确认环境支持 EXIF
运行以下代码检查是否可用:
if (function_exists('exif_read_data')) {
echo "EXIF 支持已启用";
} else {
echo "EXIF 不可用,请检查 php.ini 中是否启用了 exif 扩展";
}
常见问题:
- Linux 下需确保安装了
php-exif包(如 Ubuntu:`sudo apt install php-exif`) - Windows 用户需在
php.ini中取消注释extension=exif - EXIF 仅对 JPEG、TIFF 有效;PNG、WebP、GIF 不含标准 EXIF 数据
基础用法:读取并解析 EXIF
直接调用 exif_read_data() 即可获取结构化数组:
$image = 'photo.jpg';
$exif = exif_read_data($image);
if ($exif) {
echo "相机型号:" . ($exif['Model'] ?? '未知') . "\n";
echo "拍摄时间:" . ($exif['DateTime'] ?? '未记录') . "\n";
echo "光圈值:" . ($exif['FNumber'] ?? '未记录') . "\n";
echo "曝光时间:" . ($exif['ExposureTime'] ?? '未记录') . "\n";
} else {
echo "未读取到 EXIF 信息(可能被清除或格式不支持)";
}
注意:
- 返回数组键名是大驼峰格式(如
Model、DateTime),非小写或下划线 - 部分字段(如
FNumber)可能以分数字符串形式存在(如"5/2"),需用eval()或fraction_to_decimal()转换 - 若图片被编辑软件保存过,EXIF 可能已被自动剥离
获取更详细的图像元数据(包括缩略图、GPS 等)
可通过参数控制读取范围和是否忽略错误:
// 读取所有可用 EXIF 段(包括 IFD0、EXIF、GPS、THUMBNAIL)
$exif = exif_read_data($image, 0, true);
// 查看 GPS 信息(如有)
if (!empty($exif['GPS'])) {
$lat = $exif['GPS']['GPSLatitude'];
$latRef = $exif['GPS']['GPSLatitudeRef'];
// 需手动将度分秒数组转为十进制度数
}
GPS 坐标是三组分数数组(如 [[39,1],[51,1],[2217,100]]),需转换后结合 GPSLatitudeRef(N/S)和 GPSLongitudeRef(E/W)才能定位。
安全与兼容性提醒
使用时需注意:
- 不要直接信任用户上传图片的 EXIF——可能伪造,仅作参考,不可用于权限或关键逻辑判断
- 大图或损坏文件可能导致函数返回
false或超时,建议加@抑制警告,并做空值检查 - 如需处理 WebP/PNG 的其他元数据(如 XMP、ICC),需借助第三方库(如
imagine或命令行exiftool)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











