2010-03-24 15 views
5

Attualmente sto usando il JPGEncoder dal lib nucleo AS3 per codificare un bitmap in JPEGAS3 JPEG veloce o asincrona codifica

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

Poiché il bitmap è piuttosto grande (3000 x 2000) la codifica richiede molto mentre (circa 20 secondi), l'applicazione sembra bloccarsi durante la codifica. Per risolvere questo problema, ho bisogno di uno:

  • Un encoder asincrono in modo da poter mantenere l'aggiornamento dello schermo (con una barra di avanzamento o qualcosa del genere) durante la codifica
  • Un encoder alternativa che è semplicemente più veloce

È possibile e come posso farlo?

risposta

2

Impostare l'encoder in modo asincrono potrebbe essere la soluzione migliore.

Ecco twoexamples da Adobe

This example è con ActionScript/Flex, ma la sua stessa idea.

+1

E come faccio? :) JPGEncoder ha solo un metodo, "encode". –

+0

Trovato uno, vedere la mia risposta. –

+0

Picchiami :) Ho aggiunto anche alcuni esempi diversi per riferimento. – Jason

1

È possibile utilizzare l'encoder l'alchimia. È molto veloce e puoi codificare le immagini in modo asincrono. Puoi usare questa classe per astrarla.

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

decodifica asincrona l'immagine png in thread separato, supportato dalla nuova versione ...

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

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

che è ufficiale.