Adobe XMP and jpeg embedding

I was discussing picture metadata with some people this morning and
decided to have a play with the Adobe XMP toolkit [1]. Here are my
notes, in case they are of use or interest to anyone.

job 1: compile under linux, which is unsupported 
* the code compiles with warnings if you apply these small 
     changes across the .c, .cpp and .h files: 
* s/xap_xpdomconf.h/XAP_XPDOMConf.h/g 
* s/XPDom.h/XPDOM.h/g 
* s/XAPTkinternals.h/XAPTkInternals.h/g 
* tsk tsk to adobe for developing on a case-insensitive OS but 
     putting mixed-case filenames in their zipfiles 
* also, some files use FREE, REALLOC, CALLOC and MALLOC macros 
     which presumably would get correctly resolved via a chain of ifdefs
     and stuff if i were on windows, but for now just #define them to 
     regular libc free, realloc, calloc and malloc 
* then compile everything with gcc/g++ version 3 
* i should make a Makefile really, but i'm too dumb so I just 
     muck about on the cmdline 
* the sample XAPDumper also needs the PacketScanner utility to 
     compile, but that's also in the distribution and compiles OK 
     (perhaps with similar case-changes for include files) 
* having done this, i end up with a bunch of apparently 
     working code, but I am getting some segfaults on exit 
* i shall run a memory profiler when i get a round tuit 

job 2: try the dumper 
* as you'd hope, the PDF files that document the XMP toolkit 
     themselves have XMP embedded 
* so I ran the dumper on XMPEmbedding.pdf and got this dump [2] 
* and here's a nice w3c rdf validator visualisation of the 
     metadata [3] 

job 3: insert XMP into JPEG as described in XMPEmbedding.pdf 
* now, time to write some C++ using the toolkit 
* I used the MetaXAP object to create a new chunk of rdf 
     describing a jpeg as having dc:creator David Brophy 
* that gets rendered to RDF/XML and the UtilityXAP object 
     creates an 'xml packet' wrapper around the metadata 
* i now have a string ready to insert into a jpeg 
* i use libexif5 and something named 'libjpeg' extracted from 
     the source distribution of the 'exif' command to add data to the 
     existing jpeg file 
* this goes in an APP1 segment that starts with a length value 
     and the null-terminated string 'http://ns.adobe.com/xap/1.0/', 
     followed by the 
     <?xpacket begin='\x{FEFF}' id='W5M0MpCehiHzreSzNTczkc9d'?> 
     ... 
     <?xpacket end='w' ?> 
     wrapper created by the toolkit 
* the resulting jpeg [4] still renders correctly as a jpeg, 
     and also contains xmp data giving dc:creator as David Brophy 
* and works as expected with dan brickley's XMP demo: 
* extracted metadata: [5], raw RDF/XML: [6] 
* the slightly shoddy code that does job 3 is available [7] 

References 

   1. http://www.adobe.com/products/xmp/
   2. http://www.picdiary.com/~mattb/misc/xmpdump.txt
   3. http://www.picdiary.com/~mattb/misc/xmpdump.png
   4. http://www.picdiary.com/~mattb/misc/xmp.jpg
   5.
http://www.w3.org/2001/sw/Europe/200206/imagemeta/extract/extract?uri=http://www.picdiary.com/~mattb/misc/xmp.jpg&html=true
   6.
http://www.w3.org/2001/sw/Europe/200206/imagemeta/extract/extract?uri=http://www.picdiary.com/~mattb/misc/xmp.jpg&html=false
   7. http://www.picdiary.com/~mattb/misc/xmptest.cpp

Cheers,
Matt.

Received on Saturday, 3 August 2002 14:21:57 UTC