在jpeg中编写XMP元数据(使用PHP) - 使用单个或多个rdf:描述块

时间:2013-09-06 23:40:04

标签: php metadata jpeg rdf xmp

我正在尝试修改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> 

1 个答案:

答案 0 :(得分:5)

关于RDF

似乎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序列化。

关于RDF中的XMP

注意:这是基于文档的更新。根据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,并认为自己很幸运,如果其他工具将它分成常规形式。