RenderedImage to BufferedImage for multipage-tiff reading

Rob*_*ert 4 java jai

我正在使用JAI加载多页TIFF图像

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);
Run Code Online (Sandbox Code Playgroud)

但是,在最后一行,我得到一个运行时错误:

 Exception in thread "main" java.lang.ClassCastException: 
      javax.media.jai.MullOpImage cannot be cast to java.awt.Image
Run Code Online (Sandbox Code Playgroud)

在尝试设置BufferedImage之后我清除了RenderedImage,所以如果还有另一种方法,我不会"需要"RenderedImage.

我试过:

 pg1.setData(op1.getData());
Run Code Online (Sandbox Code Playgroud)

这给出了一个ArrayIndexOutOfBoundsException.我不确定为什么pg1的宽度和高度完全由op1设置,但可能有一个非常正确的原因.

Rob*_*ert 10

我在http://www.jguru.com/faq/view.jsp?EID=114602找到了解决方案

第一个不起作用,但convertRenderedImage函数确实有效.

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;
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*rey 4

使用op1。getAsBufferedImage()创建 pg1.