当前位置: 首页 > 面试题库 >

用Java读写TIFF图像

鲜于阳成
2023-03-14
问题内容

我尝试了以下代码来完成读取和写入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()可以精巧地为您提供你想要什么。



 类似资料:
  • 我试图使用open JDK11ImageIO、ImageReader和ImageWriter类将多个输入TIFF文件合并为一个多页输出TIFF文件。我的例程对从许多不同品牌的扫描设备创建的几乎所有示例输入文件都能正常工作。这些设备使用旧的和新的JPEG压缩生成各种TIFF文件。然而,来自一个特定设备的TIFF文件会导致具有粉红色背景的错误输出。更奇怪的是,用纵向扫描产生的TIFF会产生正确的输出,

  • 问题内容: 有没有人有一种方法可以在Python中导入每通道16位,3通道TIFF图像? 我还没有找到一种在处理TIFF格式时可以保留每个通道16位深度的方法。我希望一些乐于助人的人能够解决。 这是到目前为止我没有成功尝试过的结果以及结果的列表: 到目前为止,我发现的唯一解决方案是使用ImageMagick将图像转换为PNG。然后,沼泽标准会毫无问题地读取PNG文件。 我遇到的另一个问题是将任何n

  • 我目前正在编写一个应用程序来读取TIFF文件,然后执行一些压缩算法。我已经成功地做到了这一点...但是现在,我想读取TIFF图像的元数据,但似乎找不到正确的方法。 我应该使用什么库和函数?

  • 本文向大家介绍python+tifffile之tiff文件读写方式,包括了python+tifffile之tiff文件读写方式的使用技巧和注意事项,需要的朋友参考一下 背景 使用python操作一批同样分辨率的图片,合并为tiff格式的文件。 由于opencv主要用于读取单帧的tiff文件,对多帧的文件支持并不好。 通过搜索发现了两个比较有用的包:TiffCapture和tifffile。两者都可

  • 如何从Python中的TIFF图像中读取元数据(如坐标)?我尝试了来自PIL的,但收到消息: AttributeError:“TiffImageFile”对象没有属性“\u getexif” 有可能用PIL得到它吗?

  • 问题内容: 我有一个很大的摆动组件要写入TIFF。该组件是太大,无法加载TIFF在内存中,所以我要么需要使这是由一个基于磁盘的备份的WritableRaster(如提到一个大的BufferedImage这里,或者使用JAI。 除了项目完全混乱之外,JAI似乎是更好的答案。 鉴于此,有人可以概述在不耗尽内存的情况下将我的swing组件写入图块TIFF的步骤吗? 图片大小可能是10000x700 理想