Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 快速或异步AS3 JPEG编码_Actionscript 3_Actionscript_Jpeg - Fatal编程技术网

Actionscript 3 快速或异步AS3 JPEG编码

Actionscript 3 快速或异步AS3 JPEG编码,actionscript-3,actionscript,jpeg,Actionscript 3,Actionscript,Jpeg,我目前正在使用AS3核心库中的JPGEncoder将位图编码为JPEG var enc:JPGEncoder = new JPGEncoder(90); var jpg:ByteArray = enc.encode(bitmap); 由于位图相当大(3000 x 2000),编码需要很长时间(约20秒),导致应用程序在编码时似乎冻结。要解决这个问题,我需要: 一个异步编码器,这样我可以在编码时不断更新屏幕(使用进度条或其他东西) 一种速度更快的替代编码器 或者是可能的,我怎么做呢?将编

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

 var enc:JPGEncoder = new JPGEncoder(90);
 var jpg:ByteArray = enc.encode(bitmap);
由于位图相当大(3000 x 2000),编码需要很长时间(约20秒),导致应用程序在编码时似乎冻结。要解决这个问题,我需要:

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

或者是可能的,我怎么做呢?

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

这些是Adobe的


与actionscript/flex一起使用,但想法相同。

我发现了一个异步编码器:

使用炼金术,您可以更快地完成此任务:


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

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

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

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

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

这是官方消息。

我该怎么做?:)JPGEncoder只有一种方法“encode”。请告诉我:)我还添加了一些不同的示例以供参考。现在在Flash 10中使用炼金术可以更快地完成此操作。你不应该再使用炼金术了。从Flash Player 11.2开始,这是一个不推荐使用的功能。11.2+将有一个新版本的Alchemy,但旧代码将无法工作,除非用新版本重新编译。“从Flash Player 11.2和AIR 3.2开始,内容针对Flash Player 11和AIR 3(即使用SWF 13及以上版本的内容)将不支持实验炼金术原型。针对Flash Player 10.x和AIR 2.x的现有炼金术实验不受影响。“@Warrensine承认,这一点不是很好的实践,但我认为使用旧炼金术和针对Flash Player 10仍然适用于Flash Player 11.2+:屏幕截图:演示:天哪!(双关语)这个解决方案对我来说太棒了!