Я пытаюсь изменить код из PHP_JPEG_Metadata_Toolkit, чтобы я мог правильно читать и писать данные XMP для jpeg-файлов с помощью PHP. В настоящее время файлы jpeg (при сохранении Toolkit) дают ошибки в Adobe Photoshop & Bridge из-за блока XMP.
Есть два способа, которыми я вижу схему XMP RDF, используемую Photoshop. Во-первых, Photoshop фактически сохраняет в jpg и который я импортирую. Photoshop использует единый блок rdf: Description для всего. Он выдает много идентификаторов схемы (URL-адресов) внутри самого блока. PLUS добавляет значения для многих полей метаданных. Далее следуют блоки тегов для Dublin Core, Photoshop, Iptc4xmpCore и т. Д., Но все они объединены в один тег описания.
Второй – это аккуратно отформатированные метаданные, отображаемые внутри Photoshop «Информация о файле», которая следует за документацией XMP для RDF (которая гласит: «По соглашению все свойства из данной схемы и только эта схема перечислены в одном элементе rdf: Description ".)
Я смог исправить проблему с помощью Photoshop, давая ошибки при редактировании Toolkit, следуя примеру того, что Photoshop отправляет (все под одним rdf: Описание)
Два вопроса: Любая идея, почему 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>
Вот фотошоп красиво отформатированный вид (отредактированный)
<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>
Править Я ценю объяснение Джошуа. То, что я нахожу интересным / нечетным, состоит в том, что, как представляется, существует два разных способа перечислить значение. Первый имеет знак равенства, как в теге = «значение» и включен в скобки rdf: Description (уведомление о закрытии 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>
Похоже, что то, что делает 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
. (Страница 21 документации XMP говорит, что значение атрибута 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"
могут быть серализованными с использованием элементов, как описано в разделе 2.2 Элементы узла и элементы свойств рекомендации RDF / XML:
<rdf:Description rdf:about="" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"> <photoshop:Instructions>OOOInstructions</photoshop:Instructions> </rdf:Description>
или используя атрибуты для указания значения свойства, как описано в разделе 2.5 Атрибуты свойств того же документа:
<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, как следует (т. Е. Не зависящее от какой-либо конкретной структуры сериализации XML, поскольку это не всегда одно и то же (например, , вы не должны пытаться манипулировать RDF с помощью XPath )), а затем форматирование этих данных для пользователя таким образом, чтобы он считал приятным, а именно соглашение, о котором вы говорили.
Если вы еще этого не сделали, я настоятельно рекомендую вам использовать RDF-библиотеку в PHP для построения графика метаданных, а не пытаться построить сериализацию RDF / XML вручную.
Примечание. Это обновление, основанное на документации. Согласно документации , страница 19, XMP поддерживает только подмножество RDF, поэтому по-прежнему остается осмысленным вопрос о том, подходит ли RDF выше и в вопросе, хотя он подходит как RDF, в качестве XMP. Однако, также со страницы 19:
В приведенных ниже разделах описывается структура высокоуровневых данных XMP в пакете XMP:
- Самый внешний элемент – необязательно элемент x: xmpmeta
- Он содержит один элемент rdf: RDF
- который, в свою очередь, содержит один или несколько элементов rdf: Описание
- каждый из которых содержит одно или несколько свойств XMP.
В статье содержится некоторое rdf:Description
элементов rdf:Description
(выделено мной):
Элемент rdf: RDF может содержать один или несколько элементов rdf: Description. … По соглашению все свойства из данной схемы и только эта схема перечислены в одном элементе rdf: Description. (Это не требование, а просто средство для повышения удобочитаемости.)
Часть с дополнительным акцентом – это то, что нам нужно, чтобы сделать вывод, что обе формы, которые мы видели выше, приемлемы. Вероятно, проще просто создать один большой кусочек и подумать, что вам повезло, если какой-нибудь другой инструмент разделит его на обычную форму для вас.