【问题标题】:Reading and Writing out TIFF image in Java在 Java 中读取和写入 TIFF 图像
【发布时间】:2010-05-24 16:02:12
【问题描述】:

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

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

【问题讨论】:

    标签: java tiff


    【解决方案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.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() 可以巧妙地为您提供你想要什么。

    【讨论】:

    • "ImageIO.write(image, "bmp", new File(outputFile))" 难以写入,无法成功将图像写入“.bmp”文件。当我将代码更改为“.tiff”时,它会起作用。
    • 对不起...有一个小错字。 ImageIO.write 现在应该写出转换后的图像,而不是原始图像。
    • “确保您已将 JAI ImageIO JAR 添加到您的类路径中”的建议绝对挽救了我今天的理智!谢谢。
    • 如this question (installation guide) 中所建议的,JAI 的替代方案是 TwelveMonkeys ImageIO。然后你可以像往常一样使用 ImageIO.read 。不需要像 JAI 那样的本地库。
    • ImageIO.read 自 Java 9 起支持 TIFF,无需额外的库。
    【解决方案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 值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多