用Java读写TIFF图像

我尝试了下面的代码来完成读写tiff图像的任务:

// Define the source and destination file names. String inputFile = http://img.dovov.comFarmHouse.tif String outputFile = http://img.dovov.comFarmHouse.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); 

但是,当我运行代码时,出现以下错误消息:

 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) 

任何想法我怎么能解决这个问题?

读取TIFF并输出BMP的最简单方法是使用ImageIO类:

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

您需要做的唯一一件事就是确保您已经将JAI ImageIO JAR添加到您的类path中,因为如果没有来自此库的插件,JRE不处理BMP和TIFF。

如果由于某种原因无法使用JAI ImageIO,可以使用JAI ImageIO来处理现有的代码,但是您需要做一些额外的工作。 正在为您正在加载的TIFF创build的颜色模型可能是一个索引的颜色模型,不支持BMP。 您可以用JAI.KEY_REPLACE_INDEX_COLOR_MODEL键提供渲染提示,将其replace为JAI.create(“format”,…)操作。

将从文件中读取的图像写入临时图像然后写出临时图像可能会有一些好运:

 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)); 

我想知道你是否遇到了与常规JAI相同的索引颜色模型问题。 理想情况下,您应该使用ImageIO类来获取ImageReader和ImageWriter实例,而不是最简单的情况,以便相应地调整读写参数,但是可以对ImageIO.read()和.write()你要什么。

 FileInputStream in = new FileInputStream(imgFullPath); FileChannel channel = in.getChannel(); ByteBuffer buffer = ByteBuffer.allocate((int)channel.size()); channel.read(buffer); tiffEncodedImg = Base64.encode(buffer.array()); 

将此内容(即“tiffEncodedImg”的值)作为HTML中的img标签的src值