Быстрое или асинхронное кодирование AS3 JPEG

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

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

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

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

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


person Bart van Heukelom    schedule 24.03.2010    source источник


Ответы (5)


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

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

В этом примере используется actionscript / flex, но идея та же.

person Jason    schedule 24.03.2010
comment
И как мне это сделать? :) В JPGEncoder есть только один метод - кодирование. - person Bart van Heukelom; 24.03.2010
comment
Опередите меня :) Я также добавил несколько разных примеров для справки. - person Jason; 24.03.2010
comment
Теперь вы можете делать это намного быстрее во Flash 10 с помощью Alchemy. - person forresto; 09.12.2011

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

person Bart van Heukelom    schedule 24.03.2010
comment
Святая корова! (каламбур) Это решение отлично сработало для меня! - person ToddBFisher; 03.04.2012

Вы можете сделать это намного быстрее с помощью Alchemy: http://www.websector.de/blog/2009/06/21/speed-up-jpeg-encoding-using-alchemy/

http://segfaultlabs.com/devlogs/alchemy-asynchronous-jpeg-encoding-2

person forresto    schedule 09.12.2011
comment
Вам больше не следует использовать алхимию. Это устаревшая функция в Flash Player 11.2. - person Warren Seine; 04.01.2012
comment
Будет новая версия Алхимии для 11.2+ - person forresto; 06.01.2012
comment
Но старый код не будет работать, если его не перекомпилировать с новой версией. - person Warren Seine; 07.01.2012
comment
Начиная с Flash Player 11.2 и AIR 3.2, контент, нацеленный на Flash Player 11 и AIR 3 (т. Е. Контент, использующий SWF версии 13 и выше), не будет поддерживать экспериментальный прототип Alchemy. Существующие эксперименты Alchemy, нацеленные на Flash Player 10.x и AIR 2.x, не затронуты. blogs.adobe.com/flashplayer/2011/09/ updates-from-the-lab.html - person forresto; 15.01.2012
comment
Да, вот что я хочу сказать: файл .swc, скомпилированный с помощью экспериментальной Alchemy, не будет работать с Flash Player 11.2. Вам необходимо перекомпилировать свою библиотеку, чтобы она работала с будущими Flash-плеерами. - person Warren Seine; 16.01.2012
comment
не говоря уже о том, что использование Alchemy 2 вместе со Stage3D, в зависимости от дохода от продукта, может повлечь за собой значительные лицензионные сборы. adobe.com/devnet/flashplayer/articles/premium-features.html < / а> - person ericsoco; 19.05.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);
    }
}
}
person nakib    schedule 06.09.2012

асинхронное декодирование изображения png в отдельном потоке, поддерживаемое новой версией ...

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

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

это официально.

person phantomjia    schedule 24.07.2014