我试图采取多个多页.tif文件,并将它们组合成一个单页多页tif文件.
我在这个问题中找到了一些代码,但它似乎只占用了每个单独的.tif文件的第一页,并用这些第一页创建了新的多页.tif.
是否有一个小的改变,我没有看到会导致相同的代码从源.tif文件中获取每个页面并将它们全部放入组合的.tif?
为了澄清,我想要源文件:
合并成
我还希望能够指定.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);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我只是遗漏了一些关于在单个.tif中迭代页面的一小部分,我只是不确定它在哪里.
更多的互联网搜索让我发现,而不是做:
PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(0), null, null, OpImage.OP_IO_BOUND);
Run Code Online (Sandbox Code Playgroud)
我想用以下内容迭代当前文档中的每个页面:
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());
}
Run Code Online (Sandbox Code Playgroud)
这会将每个.tif的每个页面添加到图像列表中.最后一个陷阱就是最后的召唤
encoder.encode(images.get(0));
Run Code Online (Sandbox Code Playgroud)
会导致第一页在新的.tif中两次,所以我添加了一个中间循环和列表填充,它不会在调用中添加第一页:
params.setExtraImages(imageList.iterator());
Run Code Online (Sandbox Code Playgroud)
这使得第一页保持在"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);
}
}
Run Code Online (Sandbox Code Playgroud)