如何在JAVA中将两个或多个tiff图像文件合并成一个多页tiff图像

8

我有5个单页的tiff图像。 我想将这五个tiff图像合并成一个多页的tiff图像。 我正在使用Java高级图像API。 我已经阅读了SUN提供的JAI API文档和教程。 我是JAI的新手。 我知道基本的Java编程语言。 然而,我不理解SUN提供的文档和教程。 请给我一些有关如何将5个tiff图像文件合并成一个多页tiff图像的指导。 我已经在互联网上搜索了这个问题,但没有找到任何线索。


使用这个Java图像库 - https://github.com/dragon66/icafe,您可以轻松地合并两个或任意数量的TIFF图像。此外,您无需解码图像,甚至可以合并多页TIFF文件。 - dragon66
1个回答

12

希望你的电脑内存足够大。TIFF图像文件很大。

你是正确的,你需要使用 Java高级图像 (JAI) API来进行此操作。

首先,您必须将TIFF图像转换为java.awt.image.BufferedImage格式。以下是一些可能有效的代码。我还没有测试过这段代码。

BufferedImage image[] = new BufferedImage[numImages];
for (int i = 0; i < numImages; i++) {
    SeekableStream ss = new FileSeekableStream(input_dir + file[i]);
    ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);
    PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);
    image[i] = op.getAsBufferedImage();
}

然后,您将BufferedImage数组转换回多个TIFF图像。我也没有测试过这个代码。

TIFFEncodeParam params = new TIFFEncodeParam();
OutputStream out = new FileOutputStream(output_dir + image_name + ".tif"); 
ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
Vector vector = new Vector();   
for (int i = 0; i < numImages; i++) {
    vector.add(image[i]); 
}
params.setExtraImages(vector.listIterator(1)); // this may need a check to avoid IndexOutOfBoundsException when vector is empty
encoder.encode(image[0]); 
out.close(); 

不用客气。既然你了解了 BufferedImage,你可以进行其他照片转换了。 - Gilbert Le Blanc
1
@GilbertLeBlanc,不好意思打扰你,我想问个问题。使用你上面提供的代码会导致生成一个多页的tiff图像,其中第一页会重复出现(3个独立的图像变成了页1、1、2、3)。我认为这是因为你在最后初始化的向量迭代器会再次遍历第一张图像,即使它已经设置好要写入了。有没有什么办法可以解决这个问题呢? - Giardino
2
@user1806716 我已经更新了答案,修复了第一页重复的问题。这是一个很好的答案,运行得非常好 +1 - Kuldeep Jain
我怀疑如果内存有问题,你可以实现一个惰性迭代器,将图像在编码时进行转换? - Rich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接