PHP提取PNG图片XMP元数据的标题与关键词方法问询
用PHP提取PNG图片XMP元数据的标题与关键词
提取标题(dc:title / photoshop:headline)
XMP是带命名空间的XML,直接用SimpleXMLElement读取时必须先注册对应命名空间,再通过XPath定位节点:
// 注册必要的命名空间 $xmp->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/'); $xmp->registerXPathNamespace('photoshop', 'http://ns.adobe.com/photoshop/1.0/'); // 优先提取dc:title(XMP标准标题字段) $dcTitleNodes = $xmp->xpath('//dc:title/dc:text'); $title = ''; if (!empty($dcTitleNodes)) { $title = (string)$dcTitleNodes[0]; } // 若标准标题为空,尝试提取Photoshop专属的headline字段 if (empty($title)) { $headlineNodes = $xmp->xpath('//photoshop:headline'); if (!empty($headlineNodes)) { $title = (string)$headlineNodes[0]; } }
提取关键词(rdf:bag下的列表)
关键词一般存放在dc:subject下的rdf:bag容器里,同样需要处理命名空间:
$xmp->registerXPathNamespace('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); // 遍历所有rdf:li节点获取关键词 $keywords = []; $keywordNodes = $xmp->xpath('//dc:subject/rdf:bag/rdf:li'); foreach ($keywordNodes as $node) { $keywords[] = trim((string)$node); } // 转成逗号分隔的字符串 $keywordString = implode(', ', $keywords);
非Adobe软件保存的XMP结构差异
- 标题字段:部分软件会用
xmp:Title这类非标准字段存储标题,而非遵循DC(Dublin Core)标准的dc:title - 关键词存储:有些工具不会用嵌套的
rdf:bag结构,而是直接把关键词用逗号分隔成字符串存在单个字段里 - 字段完整性:非Adobe软件通常只实现XMP核心规范,不会包含Photoshop专属的扩展字段(比如
photoshop:headline)
内容的提问来源于stack exchange,提问作者kontakto
相关产品推荐
相关产品推荐

