zoukankan      html  css  js  c++  java
  • [转]Flash Player 中显示GIF动画解决方案

    转自:http://www.limbo-nova.com/blog/2012/09/software-development/flash-dev/flash-player-gif-animation/

    之前遇到这个需求,本人坚持”不重复发明轮子”的原则,弘扬”积极的偷懒不算偷懒”的精神,找到了两个解决方案。因为之前研究了GIF格式和LWZ算法,所以理解起来,没有太大的问题。

    方案一:as3gif

    作者:Thibault Imbert

    项目地址:http://code.google.com/p/as3gif/

    2007年Thibault 在他的Blog里介绍了这个方法,从java GIF encoder 移植而来,可以实现gif的编码、解码和显示。调用也很简单,代码如下:

    ActionScript
    // we create the GIFPlayer, it plays automatically by default
    var myGIFPlayer:GIFPlayer = new GIFPlayer();
    // we show it
    addChild ( myGIFPlayer );
    // we load a gif file
    myGIFPlayer.load ( new URLRequest ("animation.gif") );
    // you can also load any valid GIF stream (ByteArray) with the loadBytes method (version 0.2)
    myGIFPlayer.loadBytes ( gifStream );
    // listen for the IOErrorEvent.IO_ERROR event, dispatched when the GIF fails to load
    myGIFPlayer.addEventListener ( IOErrorEvent.IO_ERROR, onIOError );
    // listen for the GIFPlayerEvent.COMPLETE event, dispatched when GIF is loaded
    myGIFPlayer.addEventListener ( GIFPlayerEvent.COMPLETE, onCompleteGIFLoad );
    // listen for the FrameEvent.FRAME_RENDERED event, dispatched when a GIF frame is rendered on screen
    myGIFPlayer.addEventListener ( FrameEvent.FRAME_RENDERED, onFrameRendered );
    // listen for the FileTypeEvent.INVALID event, dispatched when an invalid file is loaded
    myGIFPlayer.addEventListener ( FileTypeEvent.INVALID, onInvalidFileLoaded );
    // get total frames
    myGIFPlayer.totalFrames;
    // standard methods
    myGIFPlayer.play();
    myGIFPlayer.stop();
    myGIFPlayer.gotoAndStop(3);
    myGIFPlayer.gotoAndPlay(3);

    优点:简单易用,接口丰富,满足一般应用。具备GIF编码类,可将位图数据添加至GIF动画帧中。

    缺点:解码和播放的性能不太理想。在加载大的文件时耗时太长,动画帧控制不准确。

    方案二:AS3GifPlayer

    作者:Brian McKelvey

    项目地址:https://github.com/Worlize/Flash-Animated-GIF-Library

    由于方案一在解码方面的不足,Brian McKelvey 完全从无到有,重写了基于Flash Player的GIF解码类,据称解码的性能提高了2个数量级(10^2)。另外动画帧的播放也更精确,因为是基于舞台的帧率而播放的,而且当舞台帧率太低时还支持跳帧。上面的Demo就是采用AS3GifPlayer的。

    示例代码如下:

    ActionScript
    player.addEventListener(GIFPlayerEvent.COMPLETE, handleGifLoadComplete);
    player.addEventListener(AsyncDecodeErrorEvent.ASYNC_DECODE_ERROR, handleAsyncDecodeErrorEvent);
    player.addEventListener(GIFPlayerEvent.FRAME_RENDERED, handleFrameRendered);
    player.loadBytes(ref.data);

    优点:简单易用,接口丰富,性能优越,代码结构清晰易读。

    缺点:只有解码和播放功能,无编码功能。

    总结

    总体而言,as3gif由来已久,而且是从java gif encoder项目移植而来,因此在Flash Player中性能欠佳也无可厚非。AS3GifPlayer性能很好,使用很方便,如果只需要解码和播放功能的话,完全可以采用。项目代码结构清晰,接口方法和as3gif略有不同,但都十分简明易用,不再赘述。

    参考资料

    1. AS3 GIF Animation Encoding Class 0.1 by Thibault Imbert
    2. AS3 GIF Player Class 0.3 by Thibault Imbert
    3. https://github.com/Worlize/Flash-Animated-GIF-Library
  • 相关阅读:
    window8用户在安装VirtualBox时弹出了“Installation failed!Error:系统找不到指定的路径”的错误提示
    JSON和JSONP原理和区别
    设计模式前言
    Apache POI使用指南(HSSFWorkbook生成excel)
    java策略模式
    记一次mysql5.7保存Emoji表情
    StopWatch任务计时器
    详谈linux中压缩
    List集合中元素排序
    java中文拼音字母排序
  • 原文地址:https://www.cnblogs.com/longhuang/p/2844785.html
Copyright © 2011-2022 走看看