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

如何用PHP读取JPEG图片的Title和Tags EXIF数据

如何用PHP读取JPEG图片的Title和Tags数据?

嘿,我来帮你搞定这个问题!你提到用exif_read_data没拿到想要的Title和Tags,这很正常——因为这俩信息通常不是存在标准EXIF里,而是藏在IPTC或者XMP元数据块里,exif_read_data默认不会解析这些。下面给你两种靠谱的解决方法:

方法1:解析IPTC元数据(最常见的摄影师标签存储方式)

摄影师添加的Tags和Title,大多存在IPTC(国际出版电讯委员会)的字段里。PHP自带iptcparse函数可以解析它,配合getimagesize就能提取:

// 替换成你的图片路径
$imagePath = 'your-photo.jpg';

// 用getimagesize获取图片的额外元数据(包括IPTC)
$imageSize = getimagesize($imagePath, $imageInfo);

// 检查是否存在IPTC数据(APP13是IPTC的标识)
if (isset($imageInfo['APP13'])) {
    // 解析IPTC数据
    $iptcData = iptcparse($imageInfo['APP13']);
    
    // 提取Title:对应IPTC的2#005字段(Object Name)
    $title = isset($iptcData['2#005'][0]) ? trim($iptcData['2#005'][0]) : '无标题';
    
    // 提取Tags:对应IPTC的2#025字段(Keywords),可能是数组,转成字符串
    $tags = isset($iptcData['2#025']) ? implode(', ', array_map('trim', $iptcData['2#025'])) : '无标签';
    
    // 输出结果
    echo "Title: {$title}\n";
    echo "Tags: {$tags}\n";
} else {
    echo "该图片没有IPTC元数据";
}

小提示:IPTC字段对应关系

  • 2#005:Object Name(就是你要的Title)
  • 2#025:Keywords(就是Tags)
  • 如果需要其他IPTC字段,可以查IPTC字段对照表,这里就不展开啦。

方法2:解析XMP元数据(部分摄影师用的格式)

有些图片会把标签存在XMP(可扩展元数据平台)里,这是XML格式的元数据,需要用DOM来解析:

$imagePath = 'your-photo.jpg';

// 读取图片文件内容
$imageContent = file_get_contents($imagePath);

// 定位XMP数据的起始和结束位置
$xmpStart = strpos($imageContent, '<x:xmpmeta');
$xmpEnd = strpos($imageContent, '</x:xmpmeta>') + 12; // 加上闭合标签的长度

if ($xmpStart !== false && $xmpEnd !== false) {
    // 提取XMP字符串
    $xmpString = substr($imageContent, $xmpStart, $xmpEnd - $xmpStart);
    
    // 用DOM解析XML
    $dom = new DOMDocument();
    @$dom->loadXML($xmpString); // 加@忽略可能的XML格式警告
    
    // 注册XMP的命名空间(dc是 Dublin Core 标准,常用作标签存储)
    $xpath = new DOMXPath($dom);
    $xpath->registerNamespace('dc', 'http://purl.org/dc/elements/1.1/');
    
    // 提取Title(dc:title)
    $titleNodes = $xpath->query('//dc:title');
    $title = $titleNodes->length > 0 ? trim($titleNodes->item(0)->nodeValue) : '无标题';
    
    // 提取Tags(dc:subject下的dc:keyword)
    $tagNodes = $xpath->query('//dc:subject/dc:keyword');
    $tags = [];
    foreach ($tagNodes as $node) {
        $tags[] = trim($node->nodeValue);
    }
    $tags = implode(', ', $tags) ?: '无标签';
    
    // 输出结果
    echo "Title: {$title}\n";
    echo "Tags: {$tags}\n";
} else {
    echo "该图片没有XMP元数据";
}

额外注意事项

  1. 确保PHP配置里allow_url_fopen是开启的(如果读取远程图片的话);
  2. 大图片可能需要调整memory_limit,避免内存不足;
  3. 有些图片可能同时包含IPTC和XMP,你可以把两种方法结合起来,优先读取其中一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:58