快速或异步AS3 JPEG编码

时间:2010-03-24 16:41:22

标签: actionscript-3 actionscript jpeg

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

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

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

  • 一个异步编码器,这样我可以在编码时继续更新屏幕(带进度条等)
  • 一种更快的替代编码器

是否有可能,我该怎么办?

5 个答案:

答案 0 :(得分:6)

答案 1 :(得分:2)

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

以下是Adobe的two examples

This example与actionscript / flex有关,但它的想法相同。

答案 2 :(得分:1)

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

在单独的线程中异步解码png图片,由新版本支持...

var loaderContext:LoaderContext = new LoaderContext();
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD;

var loader:Loader = new Loader();
loader.load(new URLRequest("...png"),loaderContext);
addChild(loader);
那位官员。