2011-03-13 79 views

回答

1

我写了一个关于此事的小片段。这个片段远未得到适当的测试,并且最明确的是没有以清晰和一致的方式书写。但现在看来工作。我会在更新时对其进行更新。

http://snipplr.com/view/51037/xmp-metadata-from-jpg/

private function init(event:Event):void 
{ 
    var ldr:Loader = new Loader(); 
    ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded); 
    var s:String = "link/to/asset.jpg"; 
    ldr.load(new URLRequest(s)); 
} 
private function imgLoaded(e:Event):void{ 
    var info:LoaderInfo = e.target as LoaderInfo; 
    var xmpXML:XML = getXMP(info.bytes); 

    //trace(xmpXML); 
    var meta:XMPMeta = new XMPMeta(xmpXML); 
} 
private function trim(s:String):String{ 
    return s.replace(/^([\s|\t|\n]+)?(.*)([\s|\t|\n]+)?$/gm, "$2"); 
} 
private function getXMP(ba:ByteArray):XML{ 
     var LP:ByteArray = new ByteArray(); 
    var PACKET:ByteArray = new ByteArray(); 
    var l:int; 

    ba.readBytes(LP, 2, 2); 
    /* 
    http://www.adobe.com/devnet/xmp.html 
    read part 3: Storage in Files. 

    that will explain the -2 -29 and other things you see here. 
    */ 
    l = LP.readInt() - 2 -29; 
    ba.readBytes(PACKET, 33, l); 

    var p:String = trim(""+PACKET); 
    var i:int = p.search('<x:xmpmeta xmlns:x="adobe:ns:meta/"'); 
    /* Delete all in front of the XMP XML */ 
    p = p.substr(i); 
    /* 
    For some reason this left some rubbish in front, so I'll hardcode it out for now 

    TODO clean up 
    */ 

    var ar:Array = p.split('<'); 
    var s:String = ""; 
    var q:int; 
    var j:int = ar.length; 
    for(q=1;q<j;q++){ 
     s += '<'+ar[q]; 
    } 
    i = s.search('</x:xmpmeta>'); 
    i += ('</x:xmpmeta>').length; 
    s = s.slice(0,i); 
    /* Delete all behind the XMP XML */ 
    return XML(s); 
}