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(Event.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:Event):void { encoder.removeEventListener(AsyncImageEncoderEvent.PROGRESS, encodeProgressHandler); encoder.removeEventListener(Event.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.