【问题标题】:Fast or asynchronous AS3 JPEG encoding快速或异步 AS3 JPEG 编码
【发布时间】:2011-01-31 08:38:53
【问题描述】:

我目前正在使用 AS3 核心库中的 JPGEncoder 将位图编码为 JPEG

 var enc:JPGEncoder = new JPGEncoder(90);
 var jpg:ByteArray = enc.encode(bitmap);

由于位图相当大 (3000 x 2000),编码需要很长时间(大约 20 秒),导致应用程序在编码时似乎冻结。为了解决这个问题,我需要:

  • 异步编码器,因此我可以在编码时不断更新屏幕(使用进度条或其他东西)
  • 速度更快的替代编码器

有可能吗,我该怎么做?

【问题讨论】:

    标签: actionscript-3 actionscript jpeg


    【解决方案1】:

    将编码器设置为异步可能是您最好的选择。

    这里是来自 Adob​​e 的 two examples

    This example 和 actionscript/flex 是一样的,但是思路是一样的。

    【讨论】:

    • 我该怎么做? :) JPGEncoder 只有一种方法,“encode”。
    • 打败我 :) 我还添加了一些不同的示例以供参考。
    • 您现在可以在 Flash 10 中使用 Alchemy 更快地完成此操作。
    【解决方案2】:

    【讨论】:

    • 天哪! (双关语)这个解决方案对我来说太棒了!
    【解决方案3】:

    【讨论】:

    • 你不应该再使用炼金术了。这是自 Flash Player 11.2 起已弃用的功能。
    • 11.2+会有新版Alchemy
    • 但是旧代码是不行的,除非用新版本重新编译。
    • "从 Flash Player 11.2 和 AIR 3.2 开始,针对 Flash Player 11 和 AIR 3 的内容(即使用 SWF 13 及更高版本的内容)将不支持实验性 Alchemy 原型。针对 Flash 的现有 Alchemy 实验Player 10.x 和 AIR 2.x 不受影响。” blogs.adobe.com/flashplayer/2011/09/updates-from-the-lab.html
    • @WarrenSeine 诚然,这不是一个好的做法,但我认为使用旧的 Alchemy 和 targeting Flash Player 10 仍然适用于 Flash Player 11.2+ : 截图:imgur.com/9bWvk 演示:meemoo.org/iframework/#gist/2759842
    【解决方案4】:

    您可以使用炼金术编码器。它非常快,您可以异步编码图像。你可以使用这个类来抽象它。

    public class JPGAlchemyEncoder {
    
        private static var alchemyWrapper:Object;
        private var quality:Number;
    
        public function JPGAlchemyEncoder(quality:Number) {
            this.quality = quality;
            if (!alchemyWrapper){
                var loader:CLibInit = new CLibInit;
                alchemyWrapper = loader.init();
            }
        }
    
        public function encode(bitmapData:BitmapData):ByteArray{
            var data: ByteArray = bitmapData.clone().getPixels( bitmapData.rect );
            data.position = 0;
            return alchemyWrapper.write_jpeg_file(data, bitmapData.width, bitmapData.height, 3, 2, quality);
        }
    
        public function encodeAsync(bitmapData:BitmapData, completeHandler:Function):void{
            var encodedData:ByteArray = new ByteArray();
            var data: ByteArray = bitmapData.clone().getPixels(bitmapData.rect);
            data.position = 0;
            var encodeComplete:Function = function():void{
                completeHandler(encodedData);
            };
            alchemyWrapper.encodeAsync(encodeComplete, data, encodedData, bitmapData.width, bitmapData.height, quality);
        }
    }
    }
    

    【讨论】:

      【解决方案5】:

      独立线程异步解码png图片,新版本支持...

      var loaderContext:LoaderContext = new LoaderContext();
      loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;
      
      var loader:Loader = new Loader();
      loader.load(new URLRequest("...png"),loaderContext);
      addChild(loader);
      

      这是官方的。

      【讨论】:

        猜你喜欢
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 2018-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多