2011-03-13 4 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); 
} 
에서