tags:

views:

147

answers:

2

I tried the following code to accomplish the task of reading and writing tiff images:

 // Define the source and destination file names.
 String inputFile = /images/FarmHouse.tif
 String outputFile = /images/FarmHouse.bmp

 // Load the input image.
 RenderedOp src = JAI.create("fileload", inputFile);

 // Encode the file as a BMP image.
 FileOutputStream stream =
     new FileOutputStream(outputFile);
 JAI.create("encode", src, stream, BMP, null);

 // Store the image in the BMP format.
 JAI.create("filestore", src, outputFile, BMP, null);

However, when I run the code, I get the following error message:

Caused by: java.lang.IllegalArgumentException: Only images with either 1 or 3 bands 
can be written out as BMP files.
 at com.sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.java:123)
 at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79)

Any idea how I could solve this issue?

A: 

The easiest way to read in a TIFF and output a BMP would be to use the ImageIO class:

BufferedImage image = ImageIO.read(inputFile);
ImageIO.write(image, "bmp", new File(outputFile));

The only additional thing you would need to do to get this to work is make sure you've added the JAI ImageIO JARs to your classpath, since BMP and TIFF are not handled by the JRE without the plugins from this library.

If you can't use JAI ImageIO for some reason, you can get it to work with your existing code but you'll have to do some additional work. The color model that is being created for the TIFF that you are loading is probably an indexed color model which is not supported by a BMP. You can replace it with the JAI.create("format",...) operation by providing a rendering hint with a key of JAI.KEY_REPLACE_INDEX_COLOR_MODEL.

You may have some luck writing the image read from file into a temporary image and then writing out the temp image:

BufferedImage image = ImageIO.read(inputFile);
BufferedImage convertedImage = new BufferedImage(image.getWidth(), 
    image.getHeight(), BufferedImage.TYPE_INT_RGB);
convertedImage.createGraphics().drawRenderedImage(image, null);
ImageIO.write(convertedImage, "bmp", new File(outputFile));

I'm wondering if you're running into the same index color model issue as with the regular JAI. Ideally you should be using the ImageIO class to get ImageReader and ImageWriter instances for all but the simplest cases so that you can tweak the read and write params accordingly, but the ImageIO.read() and .write() can be finessed to give you what you want.

Jeff
"ImageIO.write(image, "bmp", new File(outputFile))" is stiff not writing able to successfully write the image as a ".bmp" file. when I change the code to ".tiff" instead, then it'll work.
sorry...there was a small typo. The ImageIO.write should now be writing out the convertedImage, not the original image.
Jeff
Thanks Jeff. it worked! you really saved my day ;)
A: 

Using:

BufferedImage image = ImageIO.read(inputFile);

to read any TIFF image file, it always returns a null. why is that? ImageIO doesn't seem to support tiff files at all!

Did you get the JAI ImageIO JAR files?"The only additional thing you would need to do to get this to work is make sure you've added the JAI ImageIO JARs to your classpath, since BMP and TIFF are not handled by the JRE without the plugins from this library."
Jeff
I did, then when I tried to read the file out, it worked fine. Now I'm running into another issue which is dealing this code: ImageIO.write(image, "bmp", new File(outputFile));The issue is I can't write out the tiff image as bmp. When I change the code to "tiff" instead, then it worked. But I need the image stored as "bmp" extension. any thoughts?
see edit to my original post for a possible reason/solution.
Jeff