RenderedImage to BufferedImage for reading in multi-page mode

I use JAI to load multi-page TIFF images

File file = workArea[0]; SeekableStream s = new FileSeekableStream(file); TIFFDecodeParam param = null; ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param); //first page RenderedImage op1 = new NullOpImage(dec.decodeAsRenderedImage(0), null, OpImage.OP_IO_BOUND, null); BufferedImage pg1 = new BufferedImage(op1.getWidth(), op1.getHeight(), BufferedImage.TYPE_INT_RGB); pg1.getGraphics().drawImage((Image) op1, 0, 0, null); 

However, in the last line, I get a runtime error:

  Exception in thread "main" java.lang.ClassCastException: javax.media.jai.MullOpImage cannot be cast to java.awt.Image 

I clean up the RenderedImage after trying to set the BufferedImage, so I don't need a RenderedImage if there is another way to do this.

I tried:

  pg1.setData(op1.getData()); 

and this gives an ArrayIndexOutOfBoundsException exception. I'm not sure why, since pg1 width and height are set to op1, but there is probably a very good reason.

+4
source share
5 answers

Use op1. getAsBufferedImage() to create pg1.

+4
source

I found a solution at http://www.jguru.com/faq/view.jsp?EID=114602

The first one did not work, however the convertRenderedImage function did work.

 public BufferedImage convertRenderedImage(RenderedImage img) { if (img instanceof BufferedImage) { return (BufferedImage)img; } ColorModel cm = img.getColorModel(); int width = img.getWidth(); int height = img.getHeight(); WritableRaster raster = cm.createCompatibleWritableRaster(width, height); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); Hashtable properties = new Hashtable(); String[] keys = img.getPropertyNames(); if (keys!=null) { for (int i = 0; i < keys.length; i++) { properties.put(keys[i], img.getProperty(keys[i])); } } BufferedImage result = new BufferedImage(cm, raster, isAlphaPremultiplied, properties); img.copyData(raster); return result; } 
+10
source

If you are stuck in a RenderedImage, you can use

 PlanarImage.wrapRenderedImage(renderedImage).getAsBufferedImage() 

see here for documentation

+2
source

JAI seems to have a converter class:

 ImageDecoder dec = ImageCodec.createImageDecoder("PNM", new File(input), null); return new RenderedImageAdapter(dec.decodeAsRenderedImage()).getAsBufferedImage() 

ref: http://www.programcreek.com/java-api-examples/index.php?api=com.sun.media.jai.codec.ImageDecoder

+1
source

Try the following:

  RenderedImage im = dec.decodeAsRenderedImage(); BufferedImage bi = PlanarImage.wrapRenderedImage(im).getAsBufferedImage(); 
0
source

All Articles