複数ページの tiff に関するいくつかの質問と圧縮に関するいくつかの質問を見てきましたが、2 つをリンクしている (私が見た) ものはありません。この質問は、私が見た限りでは非常に近いものであり、私を信じられないほど近くに置いているので、願っています. 言及されている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 の問題を防ぎます。ただし、最初のページを超えてページを追加することはありません。