快速或异步AS3 JPEG编码

5

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

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

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

  • 一个异步编码器,这样我就可以在编码时不断更新屏幕(使用进度条或其他方式)
  • 一种更快的替代编码器

这两种方法都可行吗?如何实现?

5个回答

6

天哪!(双关语)这个解决方案对我来说非常棒! - ToddBFisher

2
设置编码器为异步可能是最好的选择。
以下是 Adobe 提供的两个示例:示例一示例二
这个示例是使用 ActionScript/Flex 实现的,但是其基本思路是相同的。

1
那我该怎么做呢? :) JPGEncoder只有一个方法,即“encode”。 - Bart van Heukelom
赶我一步了 :) 我还添加了一些不同的示例供参考。 - Jason
现在使用Alchemy和Flash 10,您可以更快地完成此操作。 - forresto

1
您可以使用Alchemy编码器。它非常快速,您可以异步地对图像进行编码。您可以使用此类来进行抽象化处理。
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);
    }
}
}

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

这是官方的。

1

你不应再使用Alchemy。自从Flash Player 11.2版本起,此功能已被弃用。 - Warren Seine
从Flash Player 11.2和AIR 3.2开始,针对Flash Player 11和AIR 3(即使用SWF版本13及以上的内容)的内容将不支持实验性Alchemy原型。 针对Flash Player 10.x和AIR 2.x的现有Alchemy实验不受影响。" http://blogs.adobe.com/flashplayer/2011/09/updates-from-the-lab.html - forresto
是的,这就是我的观点:使用实验性Alchemy编译的.swc文件将无法在Flash Player 11.2中运行。您需要重新编译您的库以使其与未来的Flash Player兼容。 - Warren Seine
更不用说,使用Alchemy 2以及Stage3D,根据产品收入的不同,可能会带来一些显著的许可费用。http://www.adobe.com/devnet/flashplayer/articles/premium-features.html - ericsoco
1
@WarrenSeine 承认,在这一点上这不是一个好的做法,但我可以证明,使用旧版Alchemy和以Flash Player 10为_target_仍然适用于Flash Player 11.2 +:截图:http://imgur.com/9bWvk演示:http://meemoo.org/iframework/#gist/2759842 - forresto
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接