A while back i posted some ThreadedImageEncoder classes to convert BitmapData objects to .PNG or .JPG format over multiple Flash frames. With the arrival of ActionScript Workers i figured they would become obsolete, but we’re still waiting for Workers in mobile AIR so i’m still using them. Anyway, i needed a ‘real’ project to practice generating ASDocs with, so i chose the image encoder classes. I wasn’t planning on doing more than adding some comments, but i got carried away and ended up refactoring a lot of the code too.
Now they’re a bit more polished, i’ve renamed them to AsyncImageEncoders and given them their own github repository. In the repo you’ll find all the source code, a precompiled SWC, ASDocs for the classes and instructions on using them.
They’re easy to use:
//generate a BitmapData object to encode
var myBitmapData:BitmapData = new BitmapData(1000, 1000, true, 0x80FF9900);
//create an encoder
var encoder:IAsyncImageEncoder = new AsyncPNGEncoder();
//add listeners
encoder.addEventListener(AsyncImageEncoderEvent.PROGRESS, encodeProgressHandler);
encoder.addEventListener(AsyncImageEncoderEvent.COMPLETE, encodeCompleteHandler);
//start encoding for 20 milliseconds per frame
encoder.start(myBitmapData, 20);
function encodeProgressHandler(event:AsyncImageEncoderEvent):void
{
//trace progress
trace("encoding progress:", Math.floor(event.percentComplete)+"% complete");
}
function encodeCompleteHandler(event:AsyncImageEncoderEvent):void
{
encoder.removeEventListener(AsyncImageEncoderEvent.PROGRESS, encodeProgressHandler);
encoder.removeEventListener(AsyncImageEncoderEvent.COMPLETE, encodeCompleteHandler);
//trace size of result
trace("encoding completed:", encoder.encodedBytes.length+" bytes");
//do something with the bytes...
//..save to filesystem?
//..upload to server?
//..set as source for flex Image component?
}
There is also a stop() method if you get impatient with a long encode (large JPEGs on mobile can take ages) and an isRunning property which should need no explanation.
Lastly, the AsyncImageEncoderBase class can be extended to create other asynchronous encoders; hopefully, i will demonstrate that by adding a .BMP encoder in the next few days it took me 5 minutes to create a .BMP encoder.

Thanks for going over this.
The 20 ms is intended to support 25 fps ?
Hi.
At 25fps, each frame gets 40ms to do its stuff (without the frame rate dropping) so allocating 20ms per frame to encoding should be fine.
Thanks a ton for all your work on this. Exactly what I was looking for.