4

我正在尝试修改PHP_JPEG_Metadata_Toolkit中的代码,以便我可以使用 PHP 为 jpeg 文件正确读取和写入 XMP 数据。目前,jpeg 文件(由 Toolkit 保存时)由于 XMP 块而在 Adob​​e Photoshop 和 Bridge 中出现错误。

我看到 Photoshop 使用的 XMP RDF 架构有两种方式。第一个是 Photoshop 实际保存在 jpg 中并且我正在导入的内容。Photoshop 对所有内容都使用单个 rdf:Description 块。它在块本身内抛出许多模式标识符(url),并为许多元数据字段添加值。接下来是 Dublin Core、Photoshop、Iptc4xmpCore 等的标签块,但都集中在一个描述标签中。

第二个是在 Photoshop“文件信息”中显示的格式整齐的元数据,该元数据遵循 RDF 的XMP 文档(其中指出“按照约定,来自给定模式的所有属性,并且只有该模式,都列在单个 rdf:Description 元素中.")

通过遵循 Photoshop 实际发送的示例(一个 rdf:Description 下的所有内容),我已经能够解决 Photoshop 在工具包编辑时出现错误的问题

两个问题:知道为什么 Photoshop 保存的 XMP 元数据与它在程序中显示的不同吗?而且……为什么我要花时间将我的输出格式化为 RDF 规范,因为它在一个 rdf:Description 中运行良好,所有这些都混杂在一起?我是处理这一切的新手,所以任何指导都将不胜感激。

这些示例经过编辑,因此您可以更轻松地仅查看格式差异 - 请原谅仅来自编辑的两者之间的内容差异。

这是我实际从 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> 

这是 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#">
     <xmpMM:DocumentID>xmp.did: … ETC…&lt;/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="value" 中的等号并包含在 rdf:Description 括号内(注意关闭 rdf:Description 括号):

<rdf:Description rdf:about="" 
   xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmpRights:Marked="True" 
   photoshop:Instructions="Notice closing Bracket here">
</rdf:Description> 

第二个是Value

<rdf:Description rdf:about=""
   xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
   <photoshop:Instructions>OOOInstructions</photoshop:Instructions>
</rdf:Description> 
4

1 回答 1

6

关于 RDF

看起来 Photoshop 正在做的是读取一些数据的有效、格式良好的 RDF/XML 序列化,然后在 UI 中以另一个恰好遵循某些数据的有效、格式良好的 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 页说该rdf:about属性的值可能是一个空字符串……,这意味着 XMP 在物理上对于所描述的资源来说是本地的。应用程序必须依赖文件格式知识才能正确地将 XMP 与资源关联”。)

正在做

<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>

它们序列化同一组三元组。两者均无效或不正确。这只是你喜欢哪个的问题。其他变化也是可能的。例如,在某些情况下,您可以使用元素属性来指示属性值。三重奏:

<this-document> <http://ns.adobe.com/photoshop/1.0/Instructions> "OOOInstructions"

可以使用元素进行序列化,如RDF/XML 推荐的第 2.2 节节点元素和属性元素中所述:

<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
  <photoshop:Instructions>OOOInstructions</photoshop:Instructions>
</rdf:Description> 

或使用属性来表示属性值,如第 2.5 节同一文档的属性 Attributes 中所述:

<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
    photoshop:Instructions="OOOInstructions">
</rdf:Description>

所以,关于你的第二个问题:

为什么我要花时间将我的输出格式化为 RDF 规范,因为它在一个 rdf:Description 中很好地混杂在一起?

如果输出应该是 RDF,你应该使它成为有效的 RDF。它是否具有特定的美学上令人愉悦的格式是一个完全不同的问题。在这两者之间进行转换相对容易,并且我希望 Photoshop 正在做的是读取 RDF 的 blob (即,不依赖于 XML 序列化的任何特定结构,因为这并不总是相同的(例如,您不应该尝试使用 XPath 操作 RDF )),然后以它认为不错的方式为用户格式化该数据,即您提到的约定。

如果您还没有,我强烈建议您使用 PHP 中的 RDF 库来构建元数据图,而不是尝试手动构建 RDF/XML 序列化。

关于 RDF 中的 XMP

注意:这是基于文档的更新。根据文档,第 19 页,XMP 仅支持 RDF 的一个子集,因此关于上述和问题中的 RDF 虽然适合作为 RDF,但是否适合作为 XMP,仍然是一个有意义的问题。但是,同样从第 19 页开始:

以下部分描述了 XMP 数据包中 XMP 数据的高级结构:

  • 最外面的元素是可选的 x:xmpmeta 元素
  • 它包含一个 rdf:RDF 元素
  • 其中又包含一个或多个 rdf:Description 元素
  • 每个都包含一个或多个 XMP 属性。

第 20 页包含有关rdf:Description元素的一些详细说明(已添加重点):

rdf:RDF 元素可以包含一个或多个 rdf:Description 元素。... 按照惯例,来自给定模式的所有属性,并且只有该模式,都列在单个 rdf:Description 元素中。(这不是要求,只是提高可读性的一种手段。)

为了得出我们上面看到的两种形式都可以接受的结论,我们需要添加强调的部分。只创建一个大 blob可能更容易,如果其他工具为您将其拆分为常规形式,则认为自己很幸运。

于 2013-09-07T15:08:36.123 回答