我正在尝试修改PHP_JPEG_Metadata_Toolkit中的代码,以便我可以使用PHP正确读取和写入jpeg文件的XMP数据。目前,jpeg文件(由Toolkit保存时)会出现Adobe Photoshop&由于XMP块而桥接。
我有两种方法可以看到Photoshop使用的XMP RDF架构。第一个是Photoshop实际上在jpg中保存的内容以及我要导入的内容。 Photoshop对所有内容使用单个rdf:Description块。它会在块本身内抛出许多模式标识符(url)PLUS会为许多元数据字段添加值。接下来是Dublin Core,Photoshop,Iptc4xmpCore等的标记块,但所有标记块都集中在一个Description标记中。
第二种是在Photoshop"文件信息"中显示的整齐格式化的元数据。在XMP documentation之后的RDF(其中指出"按照惯例,来自给定模式的所有属性,只有该模式,列在单个rdf:Description元素中。")
通过按照Photoshop实际发送的示例(一个rdf下的所有内容:描述),我已经能够解决Photoshop工具箱编辑时出错的问题
两个问题:任何想法为什么Photoshop保存XMP元数据不同于它在程序中显示的内容?并且......为什么我应该花时间将输出格式化为RDF规范,当它在一个rdf中很好地混合在一起时:描述?我不熟悉所有这些,所以任何指导都将不胜感激。
这些示例已经过编辑,因此您可以更轻松地查看格式差异 - 请原谅两者之间因编辑而导致的内容差异。
以下是我从Photoshop(编辑)实际收到的内容:
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/"
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmpMM:DocumentID="xmp.did:8808E8B6139411E3A70AB29CEEC8FF6C"
xmpMM:InstanceID="xmp.iid:0071BBEF4517E311BCBCC2DF868D188C"
xmpMM:OriginalDocumentID=""
xmp:CreatorTool="(PHP JPEG Metadata Toolkit v1.12)"
xmp:MetadataDate="2013-09-06T15:44:49-07:00"
xmp:ModifyDate="2013-09-06T15:44:49-07:00"
xmp:CreateDate="2013-09-06T15:22:46-07:00"
xmpRights:Marked="True"
xmpRights:WebStatement="MY WEB ADDRESS"
Iptc4xmpCore:IntellectualGenre=""
photoshop:Instructions="OOOInstructions"
photoshop:Headline="OOOHeadline"
photoshop:CaptionWriter="MY NAME"
dc:format="image/jpeg">
<xmpMM:DerivedFrom stRef:instanceID="6B5F4850BB0819F254E40401F67ACAC9"
<stRef:documentID="6B5F4850BB0819F254E40401F67ACAC9"/>
<xmpRights:UsageTerms>
<rdf:Alt>
<rdf:li xml:lang="x-default">MY INFO HERE</rdf:li>
</rdf:Alt>
</xmpRights:UsageTerms>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">OOODescription
</rdf:li>
</rdf:Alt>
</dc:description>
</rdf:Description>
</rdf:RDF>
这是Photoshops格式良好的视图(已编辑)
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
<xmpMM:DocumentID>xmp.did: … ETC…</xmpMM:DocumentID>
<xmpMM:InstanceID>xmp.iid: …ETC… </xmpMM:InstanceID>
<xmpMM:OriginalDocumentID/>
<xmpMM:DerivedFrom rdf:parseType="Resource">
<stRef:instanceID>6B5F4850BB0819F254E40401F67ACAC9</stRef:instanceID>
<stRef:documentID>6B5F4850BB0819F254E40401F67ACAC9</stRef:documentID>
</xmpMM:DerivedFrom>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/">
<xmp:CreatorTool>Adobe Photoshop CS6 (Windows)</xmp:CreatorTool>
<xmp:MetadataDate>2013-09-06T15:44:49-07:00</xmp:MetadataDate>
<xmp:ModifyDate>2013-09-06T15:44:49-07:00</xmp:ModifyDate>
<xmp:CreateDate>2013-09-06T15:22:46-07:00</xmp:CreateDate>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/">
<xmpRights:Marked>True</xmpRights:Marked>
<xmpRights:WebStatement>MY WEB ADDRESS</xmpRights:WebStatement>
<xmpRights:UsageTerms>
<rdf:Alt>
<rdf:li xml:lang="x-default">MY INFO HERE</rdf:li>
</rdf:Alt>
</xmpRights:UsageTerms>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
<Iptc4xmpCore:IntellectualGenre/>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
<photoshop:Headline>OOOHeadline</photoshop:Headline>
<photoshop:CaptionWriter>OOO </photoshop:CaptionWriter>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:format>image/jpeg</dc:format>
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">OOODescription</rdf:li>
</rdf:Alt>
</dc:description>
</rdf:Description>
</rdf:RDF>
修改 我很欣赏约书亚的解释。我觉得有趣/奇怪的是,似乎有两种不同的方式来列出一个值。第一个是等号,如tag =&#34; value&#34;并包含在rdf:描述括号内(注意结束rdf:描述括号):
<rdf:Description rdf:about=""
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmpRights:Marked="True"
photoshop:Instructions="Notice closing Bracket here">
</rdf:Description>
第二个是值
<rdf:Description rdf:about=""
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
</rdf:Description>
答案 0 :(得分:5)
似乎Photoshop正在做的是阅读一些有效的,格式良好的RDF / XML序列化某些数据,然后在另一个有效的,格式正确的RDF / XML序列化中将其显示回用户遵循一些额外的约定。
RDF是一种基于图形的数据表示。 RDF的基本知识是三重,也称为声明。每个三元组都有一个主语,一个谓词和一个对象。主题,谓词和对象都可以是IRI引用;主题和对象也可以是空白节点,对象也可以是文字(例如,字符串)。 RDF / XML是RDF的一个特定序列化。 RDF / XML片段:
<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
<photoshop:Headline>OOOHeadline</photoshop:Headline>
<photoshop:CaptionWriter>OOO </photoshop:CaptionWriter>
</rdf:Description>
包含三个三元组:
<this-document> <http://ns.adobe.com/photoshop/1.0/Instructions> "OOOInstructions"
<this-document> <http://ns.adobe.com/photoshop/1.0/Headline> "OOOHeadline"
<this-document> <http://ns.adobe.com/photoshop/1.0/CaptionWriter> "OOO "
其中<this-document>
是解析引用""
的结果(rdf:about
属性的值。(XMP文档的第21页说明{{1}的值} attribute可以是一个空字符串...,这意味着XMP在物理上是所描述资源的本地。应用程序必须依赖于文件格式的知识才能正确地将XMP与资源相关联。#);.
否则
rdf:about
与执行
完全相同<rdf:Description rdf:about=""
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
<Iptc4xmpCore:IntellectualGenre/>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
<photoshop:Headline>OOOHeadline</photoshop:Headline>
<photoshop:CaptionWriter>OOO </photoshop:CaptionWriter>
</rdf:Description>
他们序列化同一组三元组。无论是无效还是不正确。这只是你喜欢的问题。其他变化也是可能的。例如,在某些情况下,您可以使用元素属性来指示属性值。三重奏:
<rdf:Description rdf:about=""
xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<Iptc4xmpCore:IntellectualGenre/>
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
<photoshop:Headline>OOOHeadline</photoshop:Headline>
<photoshop:CaptionWriter>OOO </photoshop:CaptionWriter>
</rdf:Description>
可以使用元素进行分类,如RDF / XML建议的Section 2.2 Node Elements and Property Elements中所述:
<this-document> <http://ns.adobe.com/photoshop/1.0/Instructions> "OOOInstructions"
或使用属性来指示属性值,如同一文档的Section 2.5 Property Attributes中所述:
<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
<photoshop:Instructions>OOOInstructions</photoshop:Instructions>
</rdf:Description>
那么,关于你的第二个问题:
为什么我应该花时间将输出格式化为RDF规范,当它在一个rdf中很好地混合在一起时:描述?
如果输出应该在RDF中,则应使其成为有效的RDF。它是否采用特定的美学赏心悦目的格式是一个完全不同的问题。在这两者之间进行翻译相对容易,我希望Photoshop正在做的是按原样阅读一大堆RDF(即,不依赖于XML序列化的任何特定结构,因为它&#39 ; s并不总是相同(例如,you shouldn't try to manipulate RDF with XPath))然后以一种它认为不错的方式为用户格式化该数据,即您提到的约定。
如果您还没有,我非常强烈建议您在PHP中使用RDF库来构建元数据图,而不是尝试手动构建RDF / XML序列化。
注意:这是基于文档的更新。根据the documentation,第19页,XMP仅支持RDF的子集,因此关于是否仍然是一个有意义的问题上面和问题中的RDF虽然适合作为RDF,但适合作为XMP。但是,也可以从第19页开始:
以下部分描述了XMP数据包中XMP数据的高级结构:
- 最外面的元素可选地是x:xmpmeta元素
- 它包含一个rdf:RDF元素
- 又包含一个或多个rdf:Description元素
- 每个包含一个或多个XMP属性。
第20页包含对<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
photoshop:Instructions="OOOInstructions">
</rdf:Description>
元素的一些阐述(强调添加):
rdf:RDF元素可以包含一个或多个rdf:Description元素。 ......按照惯例,所有 列出了给定模式中的属性,并且仅列出了该模式 在单个rdf:Description元素中。 (这不是必需的, 只是提高可读性的一种方法。)
我们需要更加强调的部分是为了得出结论,我们在上面看到的两种形式都是可以接受的。它可能更容易只创建一个大blob,并认为自己很幸运,如果其他工具将它分成常规形式。