在Java中读取和写出TIFF图像

2022-09-03 13:27:19

我尝试了以下代码来完成读取和写入tiff图像的任务:

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

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

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)

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


答案 1

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

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

要使它工作,您唯一需要做的其他事情就是确保已将JAI ImageIO JAR添加到类路径中,因为如果没有此库中的插件,JRE就无法处理BMP和TIFF。

如果由于某种原因无法使用JAI ImageIO,您可以让它与现有代码一起使用,但您必须做一些额外的工作。为要加载的 TIFF 创建的颜色模型可能是 BMP 不支持的索引颜色模型。您可以通过提供带有 JAI 键的呈现提示来将其替换为 JAI.create(“format”,...) 操作。KEY_REPLACE_INDEX_COLOR_MODEL。

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

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() 可以精细化以为您提供所需的内容。


答案 2
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值


推荐