We have been doing a lot of work recently on images in Java and will be writing a series of articles on JPEG2000 support, access, bugs and other issues. First off, I want to take a look at performance.
When you are generating a PDF image a lot of time is spent in ImageIO, either decoding the DCTDecode image (which is a JPEG) and writing out the final image as a PNG. Here is what I have found out for trying to speed this up.
1. Doing the conversion in memory does not speed things up.
2. Using a BufferedOutputStream for ImageIO.write images seems to have a marginal improvement on some systems.
3. The ImageIO.write is optimised for Indexed Colorspaces so it is often quicker to convert the image to an Index Colorspace and then write it out. Here is some sample code.
BufferedImage indexedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_INDEXED); Graphics2D g = indexedImage.createGraphics(); g.drawImage(image, 0,0,null); image=indexedImage;
4. JAI JPEG decoding seems to be much slower than ImageIO (certainly on my Mac).
5. ImageIO.setUseCache(true) is slower
Comparing the performance we get in Java compared to non-Java solutions also seems to be disappointing at the moment. So I hope it will be something Sun looks at for Java 8.
Do you have any tips for improving Java ImageIO performance?
Did you know...
IDRsolutions offers a whole range of online file converters to convert PDF and Microsoft Excel, Word and Office Documents to HTML5, SVG or image formats?
It is free to use for single file conversions and also includes Developer links if you want to use our commercial software for bulk conversions. Find out more on this page