AS3:在flex中读取嵌入式元数据

时间:2010-01-03 02:44:01

标签: flex actionscript-3

我看到你可以像在mp3中那样将元数据嵌入到图像中,here

有人能指点我一个如何嵌入和阅读这些信息的教程,包括photoshop和flex吗? 我真的不知道从哪里开始...尝试谷歌搜索,但我不确定我有正确的关键字。

谢谢!

4 个答案:

答案 0 :(得分:2)

我写了一个关于此事的小片段。这个片段远未经过适当的测试,而且最明确的是没有以清晰连贯的方式编写。但是现在似乎有效。我会在工作时更新。

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);
}

最初来自http://snipplr.com/view/51037/xmp-metadata-from-jpg/

答案 1 :(得分:1)

AS3没有内置类来读取jpg头。

但是,如果您使用URLLoader加载图像,则可以使用ByteArray手动读取。

您可以在此处找到规范: http://www.obrador.com/essentialjpeg/HeaderInfo.htm

如果你需要一些使用Bytearray的教程,你可以从这里开始: How to convert bytearray to image or image to bytearray ?

或在这里: http://digitalmedia.oreilly.com/pub/a/oreilly/digitalmedia/helpcenter/flex3cookbook/chapter8.html?page=7

原理是相同的 - 读取字节,使用上面的规范将它们转换为可读数据并使用它。

祝你好运!

答案 2 :(得分:1)

Photoshop(CS4 +我认为)也可以添加XMP标头(XML样式),它比字节更容易解析,但它包含不同的信息。

http://code.google.com/p/exif-as3/

这是一个应该完成这项工作的课程。它只是非商业性的,但还有另一种选择。

www.ultrashock.com/forums/server-side/extracting-metadata-from-photos-86065.html

这是一个可以移植到as3的php脚本 - 它可能比从头创建一个更容易。如果您确实希望php读取信息,我会使用内置的exif函数:)

答案 3 :(得分:0)

是的,完全有可能。 ByteArray是你的朋友。

您可能想要阅读此内容: http://www.anttikupila.com/flash/getting-jpg-dimensions-with-as3-without-loading-the-entire-file/

这也可能有用,但我宁愿选择第一个选项: http://download.macromedia.com/pub/developer/xmp/sdk/XMPLibrary-v1.0.zip