gpt4 book ai didi

java - 如何将多个多页 tif 文件合并为一个 tif

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:33:26 25 4
gpt4 key购买 nike

我正在尝试获取多个多页 .tif 文件并将它们组合成一个多页 tif 文件。

我在这个 question 中找到了一些代码, 但它似乎只占用每个单独的 .tif 文件的第一页,并用这些第一页创建新的多页 .tif。

是否有一个我没有看到的小变化会导致相同的代码从源 .tif 文件中获取每个页面并将它们全部放入组合的 .tif 中?

澄清一下,我想要源文件:

  • SourceA.tif(3 页)
  • SourceB.tif(4 页)
  • SourceC.tif(1 页)

合并成

  • combined.tif(8 页)

我还希望能够指定 .tif 的分辨率和压缩,但我不确定 JAI 是否支持它并且它不是正确答案的必要条件。

为了方便回答,我修改了引用问题中的代码以加载目录中的所有 .tif 文件:

public static void main(String[] args) {
String inputDir = "C:\\tifSources";
File sourceDirectory = new File(inputDir);
File file[] = sourceDirectory.listFiles();
int numImages = file.length;

BufferedImage image[] = new BufferedImage[numImages];

try
{
for (int i = 0; i < numImages; i++)
{
SeekableStream ss = new FileSeekableStream(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();
}

TIFFEncodeParam params = new TIFFEncodeParam();
OutputStream out = new FileOutputStream(inputDir + "\\combined.tif");
ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
List<BufferedImage> imageList = new ArrayList<BufferedImage>();
for (int i = 0; i < numImages; i++)
{
imageList.add(image[i]);
}
params.setExtraImages(imageList.iterator());
encoder.encode(image[0]);
out.close();
}
catch (Exception e)
{
System.out.println("Exception " + e);
}
}

最佳答案

我知道我只是遗漏了一些关于在单个 .tif 中遍历页面的小部分,我只是不确定它在哪里。

在互联网上的更多搜索让我找到了那个而不是做:

PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);

我想用类似的东西遍历当前文档中的每一页:

int numPages = decoder.getNumPages();
for(int j = 0; j < numPages; j++)
{
PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(j), null, null, OpImage.OP_IO_BOUND);
images.add(op.getAsBufferedImage());
}

这会将每个 .tif 的每一页添加到图像列表中。最后一个陷阱是对

encoder.encode(images.get(0));

会导致第一页在新的 .tif 中出现两次,所以我添加了一个中间循环和列表填充,它不会在调用中添加第一页:

params.setExtraImages(imageList.iterator());

将第一页保留在“ExtraImages”之外,并通过调用编码将其添加。

最终更新的代码是:

public static void main(String[] args) {
String inputDir = "C:\\tifSources";
File faxSource = new File(inputDir);
File file[] = faxSource.listFiles();
System.out.println("files are " + Arrays.toString(file));
int numImages = file.length;

List<BufferedImage> images = new ArrayList<BufferedImage>();

try
{
for (int i = 0; i < numImages; i++)
{
SeekableStream ss = new FileSeekableStream(file[i]);
ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null);

int numPages = decoder.getNumPages();
for(int j = 0; j < numPages; j++)
{
PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(j), null, null, OpImage.OP_IO_BOUND);
images.add(op.getAsBufferedImage());
}
}

TIFFEncodeParam params = new TIFFEncodeParam();
OutputStream out = new FileOutputStream(inputDir + "\\combined.tif");
ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
List<BufferedImage> imageList = new ArrayList<BufferedImage>();
for (int i = 1; i < images.size(); i++)
{
imageList.add(images.get(i));
}
params.setExtraImages(imageList.iterator());
encoder.encode(images.get(0));
out.close();
}
catch (Exception e)
{
System.out.println("Exception " + e);
}
}

关于java - 如何将多个多页 tif 文件合并为一个 tif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6668067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com