Those of you that came to my Grails Exchange talk (slides) will know that I’ve been working hard on a strategy for Browser Thumbnail generation. Well I’ve finally got one that works fairly reliably. I took the opportunity to upgrade groovyblogs to Grails 1.0 RC1 at the same time.

GroovyBlogs with thumbnails

I’ve tried a few approaches to thumbnails with various Swing libraries, but found the best results came from using the SWT Browser component. This component wraps a real browser (ie on windows, Safari on OSX, and Firefox on Linux). It means I can run my thumbnail server on whatever box I like (though the Linux routines produce a significantly more jagged images…). My Java code launches a new shell containing a browser component, points it at a URL, waited until browser component fires its “all done” event, then grabs an Image of the component and writes it to a JPEG.

Why does it generate JPEGs and not PNGs/GIFs? I’ve tried all the formats, but JPEG is the only one that works with all of the websites I’ve sampled. I haven’t got to the bottom of it yet, but the SWT libraries on OSX seems to write PNGs that have a bit-depth that is too complex for some browsers. And if won’t generate GIFs for sites with complex bit-depths at all! Both those cases only happen for a percentage of sites… but enough to be a pain. I haven’t found a site that won’t JPEG reliably, so I’m sticking with that (and the thumbnails are quite a lot smaller in file size, though there is a little artifacting).

When can you get the source? Real soon now… The upgrade to Grails 1.0 RC1 clobbered my build.xml file which builds my distro.zip… and my CVS server is only freshly restored from backup, so I have to hunt down the old version. But I should have something next week for people to download and play with if they’re keen.

The SWT stuff that does the browser grab is written in Java, but exposed by a XML RPC service written in Groovy. I wanted to do all the funky browser-launching stuff in a separate VM from the app server, and XMLRPC was such an easy option with the Groovy XMLRPC module. Things get even trickier cause my server is OSX, and SWT needs a special JVM switch of -XstartOnFirstThread, so it was pretty compelling to have it as a standalone service. I’ll post some more details and sample client code, when I get some downtime…

Happy thumbnailing!