我已经看到关于multipage tiffs和关于压缩的一些问题的几个问题,但没有一个(我见过)连接这两个问题。 This question就像我见过的一样近,让我感觉非常接近,所以我希望。我进入了上面提到的Oracle论坛主题(它正在讨论一个多页PDF到TIFF的压缩),我想我已经完成了代码的完成。任何人都可以协助我将删除try/catches来尝试缩短这段头发(基本上他们所做的只是在控制台中输出消息并返回false)。多页Tiff压缩
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问题。但是,它并没有在第一页之外添加任何页面。
我想说的是压缩方面正在工作(在剩余的50%文件大小附近的某个地方),但我从来没有试过用这种方法做多页(我通常使用JAI,但每当我压缩单个页面上面提到的方法并试图使它们与JAI协调一致,文件大小压缩消失了)。在阅读之后,由于专利的发展,JAI不支持LZW。 – Robert 2012-04-25 17:04:18