我看到了一些关于多页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的代码我正在使用这个,但我还没有看到任何有效的添加页面压缩的方法。
编辑:我在catch块中添加了大量的ios.flush(); ios.close();调用,并防止了不可渲染的TIFF问题。 但是,它没有添加除第一个页面之外的任何页面。