Asynchronous Image Encoders

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.

Interim Posting

It has been quite a while since my last post – with all the confusion over Flash started by Adobe i really didn’t know what the future held (and still don’t!). At times it felt like Flash would be dead in a week – I even spent a couple of weeks investigating HTML5 (i felt pretty dirty after that!).
Continue reading