There’s an updated version of ThumbGenie in the wild that sports a new skin designed by Nick Gorsline (aka Gorz). It was the first Flex component skin for Nick and first Illustrator-to-Flex workflow for moi. I think after after the experience we’re both looking forward to some Catalyst.
In addition to the new look, videos are now scaled in the preview window to match the output dimensions. This should make it easier to get a handle on what thumbnails of various sizes will actually look like.
*Update*
Sometimes you’re an idiot and you spend a lot of time reinventing the wheel because you misread one little line of documentation. This is one of those times where I get to be that idiot. I invented a solution for bilinear resampling in Flash Player when I didn’t need to. You can actually get the same results pretty simply using just BitmapData.draw() method with smoothing on (I had read this didn’t work when down sizing), but it requires creating a temp BitmapData object if the source you’re feeding the BitmapData.draw() method is not another BitmapData object (i.e. a DisplayObject). Here’s what that scenario would look like.
// source in this example is a DisplayObject var temp:BitmapData = new BitmapData( sourceWidth, sourceHeight ); temp.draw( source ); var output:BitmapData = new BitmapData( outputWidth, outputHeight ); var matrix:Matrix = new Matrix(); matrix.scale( outputWidth / sourceWidth, outputHeight / sourceHeight ); output.draw( temp, matrix, null, null, null, true ); temp.dispose();
One of the things that’s sort of sucked about ThumbGenie has been the quality of scaled thumbnails. The 640×360 image below was generated from a 960×540 video frame. Notice the edge degradation (jaggies) and poorly rendered text that results from the nearest neighbor scaling. (more…)
I updated ThumbGenie over the weekend to support generation of embed code. Now, every time you create a thumbnail from an MPEG4-AVC file or SWF embed code will be generated. ThumbGenie ships with a default “object / embed” code template, but you can easily modify or replace the template with your own code. (more…)
While making some improvements to my ilist metadata (iTunes MPEG4 style metadata) classes I ended up needing to convert an ISO 8601 date and time string to a native AS3 Date object and vice versa.
An ISO 8601 date and time string comes in two flavors, basic and extended. As you can see below, the basic format simply eschews dashes and colons in favor of a more compact syntax.
The standard requires a fixed number of digits to represent a date (8 digits) or a time (6 digits). When fewer digits are needed to represent a date / time the number must be padded with leading zeros. The Z at the end of the string designates the UTC “Zulu” timezone (GMT or so called universal time).
I took a quick buzz around the interwebs, but couldn’t find an AS3 lib that could convert one of these strings into a date object or take a date object and have it generate a correctly formatted string, so, you guessed it–I spent my Sunday evening whipping together a utility class that will do the trick (download the source here).
I’m not claiming compliance with every nook and cranny of the spec, but it covers the fundamentals decently. Hand the util an AS3 Date object and you can generate a date, time or date + time in the basic or extended format. You can also parse a basic / extended date, time or date + time string and have an AS3 Date object returned with the appropriate UTC values set on it.
Here’s what the basic usage would look like for a date + time scenario:
// instantiate a ISO8601Util object var util:ISO8601Util = new ISO8601Util(); // parse a date + time string into an AS3 Date - takes either a basic or // extended representation var date:Date = util.parseDateTimeString( "2009-02-21T09:07:59Z" ); // to turn a date into an ISO 8601 date + time representation grab a date object var currentdate:Date = new Date(); // create a string with the extended or basic format var extended:String = util.formatExtendedDateTime( currentdate ) var basic:String = util.formatBasicDateTime( currentdate );
Hopefully, I’m now the only poor bastard who has to do this!