XMP struct tags
Added by Mikayel Egibyan over 6 years ago
Hi,
Is there any way to extract structural tag values at the time?
e.g. xmpData["Xmp.xmpMM.DerivedFrom/stRef:instanceID"]
, xmpData["Xmp.xmpMM.DerivedFrom/stRef:..."]
, ...
Instead of doing all this things separately to do something like xmpData["Xmp.xmpMM.DerivedFrom/stRef:ALL"]
or xmpData["Xmp.xmpMM.DerivedFrom..."]
to get {*istanceID, ..., *...} values?
Any help is appreciated.
Thanks,
Mikayel
Replies (11)
RE: XMP struct tags - Added by Robin Mills over 6 years ago
Mikayel
Benjamin recently asked about this topic. Regrettably, I couldn't help him. However perhaps you and Benjamin can cooperate to solve this puzzle - and share the solution with the world. That's how open source works. http://dev.exiv2.org/boards/3/topics/1871
Alan (Pater) asked recently about converting ACDE "Category" xml tags into LightRoom Hierarchies. I was able to give him a solution to that by using some Perl to reformat the ACDE xml into LR tags. I think this is a little different from your question. However my solution shows how to use external tools such as Perl and XMLlint (which includes an XPath evaluator). http://dev.exiv2.org/boards/3/topics/1912
Good Luck
Robin
RE: XMP struct tags - Added by Robin Mills over 6 years ago
One other thought about this. In the discussion with Benjamin (1871), I referred him to some code to extract the raw XML from the image file using the formidable 'dd' utility (dd == deadly dangerous). It's probably better to locate the raw xml data from the image and use XPath or something to navigate the dom.
http://dev.exiv2.org/boards/3/topics/1608?r=1624#message-1624
Perhaps that helps. Perhaps not. If you find a solution, please share.
RE: XMP struct tags - Added by Robin Mills over 6 years ago
I have added a new option to exiv2(.exe) -pX to extract the XMP block from an image. With this option, you can easily extract the xml and process it with xmllint, perl, python, xslt or any external tool. r3650
RE: XMP struct tags - Added by Robin Mills over 6 years ago
I've had a little think about this. I've used the new exiv2 -pX option to extract the XMP from BabyGnuTux-BigWLPG.jpg:
<?xml version="1.0"?> <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" rdf:about="" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmp:CreateDate="2012-01-04T20:32:52+01:00" xmp:ModifyDate="2012-01-04T20:34:45+01:00" xmp:MetadataDate="2012-01-04T20:34:45+01:00" dc:format="image/jpeg" photoshop:ColorMode="3" photoshop:ICCProfile="sRGB IEC61966-2.1" xmpMM:InstanceID="xmp.iid:4E9C1E280B37E111A568FF94F417581A" xmpMM:DocumentID="xmp.did:4D9C1E280B37E111A568FF94F417581A" xmpMM:OriginalDocumentID="xmp.did:4D9C1E280B37E111A568FF94F417581A"> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="created" stEvt:instanceID="xmp.iid:4D9C1E280B37E111A568FF94F417581A" stEvt:when="2012-01-04T20:32:52+01:00" stEvt:softwareAgent="Adobe Photoshop CS5 Windows"/> <rdf:li stEvt:action="converted" stEvt:parameters="from image/png to image/jpeg"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:4E9C1E280B37E111A568FF94F417581A" stEvt:when="2012-01-04T20:34:45+01:00" stEvt:softwareAgent="Adobe Photoshop CS5 Windows" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> </rdf:Description> <rdf:Description xmlns:MP="http://ns.microsoft.com/photo/1.2/"> <MP:RegionInfo> <rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <MPRI:Regions xmlns:MPRI="http://ns.microsoft.com/photo/1.2/t/RegionInfo#"> <rdf:Bag xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:li> <rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.661608, 0.244310, 0.130501, 0.261002</MPReg:Rectangle> <MPReg:PersonDisplayName xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">Baby Tux</MPReg:PersonDisplayName> </rdf:Description> </rdf:li> <rdf:li> <rdf:Description xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <MPReg:Rectangle xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">0.205615, 0.226100, 0.130501, 0.261002</MPReg:Rectangle> <MPReg:PersonDisplayName xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#">Baby Gnu</MPReg:PersonDisplayName> </rdf:Description> </rdf:li> </rdf:Bag> </MPRI:Regions> </rdf:Description> </MP:RegionInfo> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end='w'?>I used samples/exiv2json to format the xmp metadata from an image and it revealed:
"Xmp": { "xmp": { "CreatorTool": "Adobe Photoshop CS5 Windows", "CreateDate": "2012-01-04T20:32:52+01:00", "ModifyDate": "2012-01-04T20:34:45+01:00", "MetadataDate": "2012-01-04T20:34:45+01:00" }, "dc": { "format": "image\/jpeg" }, "photoshop": { "ColorMode": "3", "ICCProfile": "sRGB IEC61966-2.1" }, "xmpMM": { "InstanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "DocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "OriginalDocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "History": "type=\"Seq\"", "History[1]": "type=\"Struct\"", "History[1]/stEvt:action": "created", "History[1]/stEvt:instanceID": "xmp.iid:4D9C1E280B37E111A568FF94F417581A", "History[1]/stEvt:when": "2012-01-04T20:32:52+01:00", "History[1]/stEvt:softwareAgent": "Adobe Photoshop CS5 Windows", "History[2]": "type=\"Struct\"", "History[2]/stEvt:action": "converted", "History[2]/stEvt:parameters": "from image\/png to image\/jpeg", "History[3]": "type=\"Struct\"", "History[3]/stEvt:action": "saved", "History[3]/stEvt:instanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "History[3]/stEvt:when": "2012-01-04T20:34:45+01:00", "History[3]/stEvt:softwareAgent": "Adobe Photoshop CS5 Windows", "History[3]/stEvt:changed": "\/" }, "MP": { "RegionInfo": "type=\"Struct\"", "RegionInfo/MPRI:Regions": "type=\"Bag\"", "RegionInfo/MPRI:Regions[1]": "type=\"Struct\"", "RegionInfo/MPRI:Regions[1]/MPReg:Rectangle": "0.661608, 0.244310, 0.130501, 0.261002", "RegionInfo/MPRI:Regions[1]/MPReg:PersonDisplayName": "Baby Tux", "RegionInfo/MPRI:Regions[2]": "type=\"Struct\"", "RegionInfo/MPRI:Regions[2]/MPReg:Rectangle": "0.205615, 0.226100, 0.130501, 0.261002", "RegionInfo/MPRI:Regions[2]/MPReg:PersonDisplayName": "Baby Gnu" } }I looked at this and manually compiled it into this:
"xmp": { "CreatorTool": "Adobe Photoshop CS5 Windows", "CreateDate": "2012-01-04T20:32:52+01:00", "ModifyDate": "2012-01-04T20:34:45+01:00", "MetadataDate": "2012-01-04T20:34:45+01:00" }, "dc": { "format": "image\/jpeg" }, "photoshop": { "ColorMode" : "3", "ICCProfile": "sRGB IEC61966-2.1" }, "xmpMM": { "InstanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "DocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "OriginalDocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "History": [ { "stEvt": { "action": "created", "instanceID": "xmp.iid:4D9C1E280B37E111A568FF94F417581A", "when": "2012-01-04T20:32:52+01:00", "softwareAgent": "Adobe Photoshop CS5 Windows" } }, "stEvt" : { "action": "converted", "parameters": "from image\/png to image\/jpeg" } }, { "stEvt" : { "action": "saved", "instanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "when": "2012-01-04T20:34:45+01:00", "softwareAgent": "Adobe Photoshop CS5 Windows", "changed": "\/" } } ] }, "MP": { "RegionInfo": { "MPRI" { Regions": [ "MPReg" { "Rectangle": "0.661608, 0.244310, 0.130501, 0.261002", "PersonDisplayName": "Baby Tux" } , "MPReg" { "Rectangle": "0.205615, 0.226100, 0.130501, 0.261002", "PersonDisplayName": "Baby Gnu" } ] } } }
A Struct -> a JSON object { ... }. A Seq (or Alt or Bag) -> a JSON array [ .... ]. I've half written the code to do this automatically. However I'm going on vacation for 2 weeks and don't have time to finish and submit the code. This isn't difficult and I am sure you can do this for yourself in an afternoon.
RE: XMP struct tags - Added by Mikayel Egibyan over 6 years ago
Can you please attach the updated version?
Thanks,
Mikayel
RE: XMP struct tags - Added by Robin Mills over 6 years ago
You're out of luck, Mikayel. I didn't finish it at the weekend and now I'm on vacation. However I did submit the code with the exiv2(.exe) -pX option to extract the XMP "raw" xml which you can process with various tools of course.
RE: XMP struct tags - Added by Robin Mills over 6 years ago
Mikayel
The code is more tricky than I thought. I'm making progress. I've updated the notes above concerning the manual compilation. I'm using those notes to help me debug this. Patience .....................
Robin
RE: XMP struct tags - Added by Robin Mills over 6 years ago
Right. I've got the code working. Much harder than I expected. I don't want to submit yet because I'm on vacation and I'd like to review the code to see if it can be simplified. Here's the output:
"Xmp": { "xmp": { "CreatorTool": "Adobe Photoshop CS5 Windows", "CreateDate": "2012-01-04T20:32:52+01:00", "ModifyDate": "2012-01-04T20:34:45+01:00", "MetadataDate": "2012-01-04T20:34:45+01:00" }, "dc": { "format": "image\/jpeg" }, "photoshop": { "ColorMode": "3", "ICCProfile": "sRGB IEC61966-2.1" }, "xmpMM": { "InstanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "DocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "OriginalDocumentID": "xmp.did:4D9C1E280B37E111A568FF94F417581A", "History": [ { "stEvt": { "action": "created", "instanceID": "xmp.iid:4D9C1E280B37E111A568FF94F417581A", "when": "2012-01-04T20:32:52+01:00", "softwareAgent": "Adobe Photoshop CS5 Windows" } }, { "stEvt": { "action": "converted", "parameters": "from image\/png to image\/jpeg" } }, { "stEvt": { "action": "saved", "instanceID": "xmp.iid:4E9C1E280B37E111A568FF94F417581A", "when": "2012-01-04T20:34:45+01:00", "softwareAgent": "Adobe Photoshop CS5 Windows", "changed": "\/" } } ] }, "MP": { "RegionInfo": { "MPRI": { "Regions": [ { "MPReg": { "Rectangle": "0.661608, 0.244310, 0.130501, 0.261002", "PersonDisplayName": "Baby Tux" } }, { "MPReg": { "Rectangle": "0.205615, 0.226100, 0.130501, 0.261002", "PersonDisplayName": "Baby Gnu" } } ] } } } }When the data has been parsed into this format, you can navigate it in C++ using Jzon without having to serialize. Of course, you can serialize and read it into your favorite JSON reader.
RE: XMP struct tags - Added by Robin Mills over 6 years ago
RE: XMP struct tags - Added by Mikayel Egibyan over 6 years ago
Thank you Robin,
Can you please attach the file with source?
Thank you once more,
Mikayel
RE: XMP struct tags - Added by Robin Mills over 6 years ago
Mikayel
You can get the code from svn:
$ svn export svn://dev.exiv2.org/svn/trunk/samples/exiv2json.cpp
If you don't have an SVN client, I highly recommend Tortoise on Windows. I use SmartSVN on Mac/Linux/Windows - and the command-line.