views:

62

answers:

4

I'm writing a Web application that let user upload images in several formats (e.g. png,jpg,bmp). After the image has been uploaded the system should convert it to "png" and scale it to a predefined resolution.

To convert the image I use the handy method:

javax.imageio.ImageIO.write(im, type, baos);

Here's where the problem start. The first argument of Image javax.imageio.ImageIO.write is a RenderedImage. The Java Doc states that the only known implementation is BufferedImage.

I try to find a way to convert a java.awt.Image to a BufferedImage, but it doesn't seems possible. However, it is possible to draw an image on a BufferedImage.

The problem is that creating a new BufferedImage each time is very memory expensive. I can start creating a pool of BufferedImage but I'm looking for clever/news ideas.

A: 

You could look at the implementation of BufferedImage and implement your own (A file-based implementation perhaps?). These classes are generally pretty straight-forward to read, often 50-70% comments and clearly written.

They give out the sources, why not make use of 'em?

Bill K
+1  A: 

There's a bunch of Java libraries and SO posts about this. Did you check them out?

The Alchemist
No, I didn't check them. Do you have any recommendation for this problem. I mean, converting images with low memory footprint
Dani Cricco
No, sorry, I haven't used any of them so I can't recommend anything. You can probably find some results on Google or whereever, but your best bet is to just try them yourself.
The Alchemist
A: 

You could reuse one buffered image over and over again, using subimage to size appropriately when it's time to use the ImageIO.write method

I82Much
Ahap, that was the original idea (as the question describes)
Dani Cricco
A: 

Launch a native converter like netpbm or imagemagick.

Thorbjørn Ravn Andersen