我试图修改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“文件信息”中显示的整齐格式化的元数据,它遵循RD001的XMP documentation(其中指出“按照惯例,来自给定模式的所有属性,只有该模式,列在单个rdf:Description元素中. “)

通过按照Photoshop实际发送的示例(一个rdf下的所有内容:描述),我已经能够通过Toolkit编辑错误来解决问题.

两个问题:任何想法为什么Photoshop保存XMP元数据不同于它在程序中显示的内容?并且……为什么我应该花时间将输出格式化为RDF规范,当它在一个rdf中很好地混合在一起时:描述?我是新手,所有这些,所以任何指导将不胜感激.

这些示例已经过编辑,因此您可以更轻松地查看格式差异 – 请原谅两者之间因编辑而导致的内容差异.

这是我实际从Photoshop(编辑)收到的内容:

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

MY INFO HEREOOODescription

这里是Photoshops格式很好的视图(已编辑)

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

xmp.did: … ETC…

xmp.iid: …ETC…

6B5F4850BB0819F254E40401F67ACAC9

6B5F4850BB0819F254E40401F67ACAC9

xmlns:xmp="http://ns.adobe.com/xap/1.0/">

Adobe Photoshop CS6 (Windows)

2013-09-06T15:44:49-07:00

2013-09-06T15:44:49-07:00

2013-09-06T15:22:46-07:00

xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/">

True

MY WEB ADDRESS

MY INFO HERE

xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">

xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">

OOOInstructions

OOOHeadline

OOO

xmlns:dc="http://purl.org/dc/elements/1.1/">

image/jpeg

OOODescription

编辑

我很欣赏约书亚的解释.我觉得有趣/奇怪的是,似乎有两种不同的方式来列出一个值.第一个是等号,如tag =“value”,并包含在rdf中:描述括号(注意结束rdf:描述括号):

xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmpRights:Marked="True"

photoshop:Instructions="Notice closing Bracket here">

第二个是Value

xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">

OOOInstructions

解决方法:

关于RDF

似乎Photoshop正在做的是读取一些有效的,格式良好的某些数据的RDF / XML序列化,然后在另一个有效的,格式良好的RDF / XML序列化中将其显示回UI中的用户其他公约.

RDF是基于图的数据表示. RDF的基本知识是三重,也称为声明.每个三元组都有一个主语,一个谓词和一个对象.主题,谓词和对象都可以是IRI引用;主题和对象也可以是空白节点,对象也可以是文字(例如,字符串). RDF / XML是RDF的一个特定序列化. RDF / XML片段:

OOOInstructions

OOOHeadline

OOO

包含三个三元组:

"OOOInstructions"

"OOOHeadline"

"OOO "

其中< this-document>是解析引用“”的结果(rdf:about属性的值.)(XMP文档的第21页说rdf:about属性的值可能是一个空字符串…,这意味着XMP是物理的所描述资源的本地化.应用程序必须依赖于文件格式的知识才能正确地将XMP与资源“.”相关联.

xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">

xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">

OOOInstructions

OOOHeadline

OOO

与做完全一样

xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"

xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">

OOOInstructions

OOOHeadline

OOO

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

"OOOInstructions"

OOOInstructions

photoshop:Instructions="OOOInstructions">

那么,关于你的第二个问题:

Why should I spend the time to format my output to the RDF specs when it works nicely all jumbled together in a single rdf:Description?

如果输出应该在RDF中,则应使其成为有效的RDF.它是否采用特定的美学形式是一个完全不同的问题.在这两者之间进行翻译相对容易,我希望Photoshop正在做的是阅读一大堆RDF(即不依赖于XML序列化的任何特定结构,因为它并不总是相同的(例如, ,you shouldn’t try to manipulate RDF with XPath))然后以一种它认为不错的方式为用户格式化该数据,即您提到的约定.

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

关于RDF中的XMP

注意:这是基于文档的更新.根据第19页的the documentation,XMP仅支持RDF的子集,因此关于上面和问题中的RDF(尽管适合作为RDF)是否适合作为XMP仍然是一个有意义的问题.但是,也从第19页开始:

The sections below describe the high-level structure of XMP data in an XMP Packet:

The outermost element is optionally an x:xmpmeta element

It contains a single rdf:RDF element

which in turn contains one or more rdf:Description elements

each of which contains one or more XMP Properties.

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

The rdf:RDF element can contain one or more rdf:Description elements.

… By convention, all

properties from a given schema, and only that schema, are listed

within a single rdf:Description element. (This is not a requirement,

just a means to improve readability.)

更重要的部分是我们需要的,以便得出结论,我们在上面看到的两种形式都是可以接受的.创建一个大blob可能更容易,如果其他工具将其分解为传统形式,则认为自己很幸运.

标签:php,jpeg,metadata,rdf,xmp

来源: https://codeday.me/bug/20190831/1776557.html

php xmp,在jpeg中编写XMP元数据(使用PHP) – 使用单个或多个rdf:描述块相关推荐

  1. 计算机硬件中内存的作用是什么,系统硬件中内存XMP是什么意思?有必要开吗?内存XMP模式的作用与开启教程...

    系统硬件中内存是电脑与CPU进行沟通的桥梁,它是一台电脑不可或缺的硬件之一,重要性至关重要.而我们在选购内存的时候,会看到在一些内存参数中注明支持X.M.P,那么电脑内存XMP是什么意思?有必要开吗? ...

  2. 如何使用Spring和Velocity在Java中编写HTML电子邮件

    在这篇文章中,我将介绍如何使用Spring和Velocity格式化和发送自动电子邮件. Spring仅提供创建简单文本电子邮件的功能,这对于简单的情况很好,但是在典型的企业应用程序中,由于多种原因,您 ...

  3. SQL Server中的T-SQL元数据功能的完整指南

    In this article, we will demonstrate T-SQL metadata functions available in the SQL Server. 在本文中,我们将演 ...

  4. python使用spark_如何在Python中编写简单代码,并且速度超越Spark?

    全文共3482字,预计学习时长7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选择. ...

  5. python 字节流分段_如何在Python中编写简单代码,并且速度超越Spark?

    全文共 3482字,预计学习时长 7分钟 如今,大家都在Python工具(pandas和Scikit-learn)的简洁性.Spark和Hadoop的可扩展性以及Kubernetes的操作就绪之间做选 ...

  6. 在Rust代码中编写Python是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前,我发布了一个名为inline-python(https: ...

  7. R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象

    R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 目录 R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象 #data.t ...

  8. linux命令行运行c程序,如何在Linux中编写和运行C程序

    Linux正在成为开发人员的编程天堂,成为开源和免费操作系统. Turbo C编译器已经是一种编译程序的旧方法,所以让程序员转向Linux以获得新的编程环境. 在本文中,我们将解释如何编写,编译和运行 ...

  9. 【未完成】[Spark SQL_2] 在 IDEA 中编写 Spark SQL 程序

    0. 说明 在 IDEA 中编写 Spark SQL 程序,分别编写 Java 程序 & Scala 程序 1. 编写 Java 程序 待补充 2. 编写 Scala 程序 待补充 转载于:h ...

最新文章

  1. springboot2.0系列(二):配置属性
  2. abaqus python二次开发攻略_Abaqus有限元分析常见问题解答与实用技巧 12天后上架...
  3. C语言经典例82-八进制转换为十进制
  4. 【Qt】modbus之串口模式写操作
  5. python excel数据分析实战_一次完整的数据分析实战!仅用4步,效率吊打Excel和Python...
  6. gitlab创建分支上传文件_Gitlab管理和使用基本教程
  7. 普通计算机怎么算根号_大学专业介绍 | 计算机专业的真实就业情况
  8. post python爬虫_小白学 Python 爬虫(17):Requests 基础使用
  9. poj 2378 (dijkstra)
  10. 蓝桥杯 入门训练 Fibonacci数列
  11. 在英雄联盟地图中寻找“数据结构的大门”
  12. 记录一下ListItem类的常用的方法
  13. 2.http dns
  14. C#将窗口最小化到系统托盘,并显示图标和快捷菜单
  15. gsonformat java代码_GSONFormat的简单使用
  16. BurpSuite+Proxifer 抓取PC客户端HTTP数据包
  17. 手把手教你领取永久免费服务器
  18. java jedis.incr()_Java Jedis.incr方法代碼示例
  19. 【初等数论】整除、公约数、同余与剩余系
  20. python 优雅的写法_优雅的python写法

热门文章

  1. 滤镜功能针的萌翻了!Snapchat为狗狗配戴眼镜
  2. 大数据的分布式数据库相关知识
  3. poi删除带有合并单元格的行的问题
  4. php偷单,最简单的PHP小偷源码
  5. 【游戏设计模式】之四 《游戏编程模式》全书内容提炼总结
  6. 降龙十八掌-程序员篇
  7. 等保2.0.第九章.等保2.0基础知识
  8. 程序员转正述职报告_程序员转正的述职报告【五篇】
  9. 进入centos命令行的方式
  10. 查看当前Ubuntu系统的版本