2010-03-24 13 views
5

Actualmente estoy usando el JPGEncoder de la lib núcleo AS3 para codificar un mapa de bits a JPEGJPEG AS3 rápida o asíncrono codificación

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

Debido a que el mapa de bits es bastante grande (3000 x 2000) la codificación tarda mucho while (unos 20 segundos), lo que hace que la aplicación aparentemente se congele durante la codificación. Para solucionar esto, necesito ya sea:

  • Un codificador asíncrona para que pueda mantener la actualización de la pantalla (con una barra de progreso o algo así) durante la codificación
  • Un codificador alternativo que es simplemente más rápido

¿Es posible, y cómo puedo hacerlo?

Respuesta

2

Configurar el codificador para que sea asíncrono probablemente sea su mejor opción.

Éstos son twoexamples de Adobe

This example es con ActionScript/Flex, pero es la misma idea.

+1

¿Y cómo puedo hacer eso? :) El JPGEncoder tiene solo un método, "codificar". –

+0

Encontrado uno, ver mi respuesta. –

+0

Dale un golpe :) También he agregado algunos ejemplos diferentes para referencia. – Jason

1
+0

Ya no deberías usar Alchemy. Esta es una característica obsoleta a partir de Flash Player 11.2. –

+0

Habrá una nueva versión de Alchemy para 11.2+ – forresto

+0

Pero el código anterior no funcionará a menos que se vuelva a compilar con la nueva versión. –

1

Usted puede utilizar el codificador de la alquimia. Es realmente rápido y puedes codificar imágenes de forma asíncrona. Puedes usar esta clase para abstraerlo.

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

decodificación asíncrona la imagen PNG en hilo separado, con el apoyo de una nueva versión ...

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

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

que es oficial.