我见过一些关于多页 tiff 的问题和一些关于压缩的问题,但没有一个(我见过)将两者联系起来。这个问题与我所见过的一样接近,让我非常接近,所以我希望。我进入了提到的 Oracle 论坛主题(它正在谈论一个多页 PDF 到 TIFF 的压缩),我想我已经接近完成代码来执行此操作了。有人可以帮忙吗?我将删除 try/catch 以尝试将其缩短(基本上他们所做的只是在控制台中输出一条消息并返回 false)。
public static boolean CompressedTiff(List<BufferedImage> images, File path)
{
if (!path.getParentFile().exists())
path.getParentFile().mkdirs();
path.createNewFile();
ImageOutputStream ios;
ios = ImageIO.createImageOutputStream(path);
Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("TIFF");
ImageWriter writer = (ImageWriter)imageWriters.next();
writer.setOutput(ios);
TIFFImageWriteParam writeParam = (TIFFImageWriteParam)writer.getDefaultWriteParam();
writeParam.setCompressionMode(2);
writeParam.setCompressionType("LZW");
writer.prepareWriteSequence(null);
for(int i = 0; i < images.size(); i++)
{
ImageTypeSpecifier spec = ImageTypeSpecifier.createFromRenderedImage(images.get(i));
javax.imageio.metadata.IIOMetadata metadata = writer.getDefaultImageMetadata(spec, writeParam);
IIOImage iioImage = new IIOImage(images.get(i), null, metadata);
writer.writeToSequence(iioImage, writeParam);
images.get(i).flush();//modified after release.
images.get(i).flush();
writer.endWriteSequence();
ios.flush();
writer.dispose();
ios.close();
}
return true;
}
它在 writer.writeToSequence 的下一次传递中失败,说我需要调用 prepareWriteSequence。我把它改成
writer.prepareWriteSequence(metadata);
writer.writeToSequence(iioImage, writeParam);
还删除了较早的 writer.prepareWriteSequence(null);
它似乎可以正确导航文件,但是,输出不是任何类型的可渲染 tif。多页或其他。
我已经安装了 JAI,所以如果可以以某种方式使用它来实现压缩图像,那就太好了。我正在使用的生成 TIFF 的代码正在使用它,但我还没有看到任何可以为页面添加压缩的东西。
编辑:我添加了一堆 ios.flush(); ios.close(); 调用 catch 块,它可以防止不可渲染的 TIFF 问题。但是,除了第一个页面之外,它没有添加任何页面。