Быстрое или асинхронное кодирование JPEG AS3 - PullRequest
5 голосов
/ 24 марта 2010

В настоящее время я использую JPGEncoder из базовой библиотеки AS3 для кодирования растрового изображения в JPEG

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

Поскольку растровое изображение довольно большое (3000 x 2000), кодирование занимает много времени (около 20 секунд), что приводит к зависанию приложения во время кодирования. Чтобы решить эту проблему, мне нужно:

  • Асинхронный кодер, поэтому я могу постоянно обновлять экран (с индикатором выполнения или чем-то еще) во время кодирования
  • Альтернативный кодер, который просто быстрее

Возможно ли и как это сделать?

Ответы [ 5 ]

6 голосов
/ 24 марта 2010

Я нашел асинхронный кодировщик: http://www.switchonthecode.com/tutorials/flex-tutorial-an-asynchronous-jpeg-encoder

2 голосов
/ 24 марта 2010

Лучше всего будет установить асинхронный кодировщик.

Вот два примера от Adobe

Этот пример относится к actionscript / flex, но это та же идея.

1 голос
/ 24 июля 2014

асинхронное декодирование изображения 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 голос
/ 06 сентября 2012

Вы можете использовать алхимический кодировщик. Это действительно быстро, и вы можете кодировать изображения асинхронно. Вы можете использовать этот класс, чтобы абстрагировать его.

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 голос
/ 09 декабря 2011
...