java - 在 Java 中读取和写入 TIFF 图像

标签 java tiff

我尝试了以下代码来完成读写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)

知道如何解决这个问题吗?

最佳答案

读取 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.KEY_REPLACE_INDEX_COLOR_MODEL 键的呈现提示,将其替换为 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() 可以被巧妙地给你你想要什么。

关于java - 在 Java 中读取和写入 TIFF 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2898311/

相关文章:

python - 保存 32 位浮点 TIFF 图像

c# - 尝试在 Winform 应用程序中显示大 (2 GB) Tiff 图像的一部分

c - 我怎样才能简单地在 libtiff 中加载灰度 tiff 并获得像素强度数组?

java - sqlite 和 mysql。当应用程序的所有进程都在同一台机器上运行并且数据库几乎没有 2 个表时,哪个更好

java - 使用 commons-io 的 IOUtils.toString(input) 后是否需要手动关闭输入流?

java - 如何用java读取网站源代码

java - 使用更少的内存填充 PDF 表单,展平,使用 iText

java - 如何从 tmdb json feed 加载电影图像

python - 在 Python 中从 TIF 图像读取和写入 exif 元数据

java - 使用 imageIO 读取 Tiff 图像元数据时出现问题