0

非圧縮 TIFF ファイルとして別の場所に書き込む必要がある大きなサイズの CCITT Group 4 圧縮 TIFF ファイルを受け取りました。私はそれを行うためにjai_imageio TIFFリーダーとライターを使用していますが、画像の幅*高さ_の積が整数に収まる限りうまく機能します。

私が使用しているコードは次のとおりです。

TIFFImageReaderSpi readerSpi= new TIFFImageReaderSpi();
ImageReader imageReader = readerSpi.createReaderInstance();
byte[] data = blobManager.getObjectForIdAndVersion(id, version);
ImageInputStream imageInputStream = ImageIO.createImageInputStream(data); 
imageReader.setInput(imageInputStream);

TIFFImageWriterSpi writerSpi = new TIFFImageWriterSpi();
ImageWriter imageWriter = writerSpi.createWriterInstance();
ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED);
//bufferFile is created in the constructor
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(bufferFile);
imageWriter.setOutput(imageOutputStream);

//Now read the bitmap
BufferedImage bufferedImage = imageReader.read(0);
IIOImage iIOImage = new IIOImage(bufferedImage, null, null);
//and write it
imageWriter.write(null, iIOImage, imageWriteParam);

残念ながら、受け取るファイルは非常に大きく、BufferedImage を作成できません。ImageReader から ImageWriter に直接ストリーミングする方法を見つけようとしていますが、その方法がわかりません。提案がある人はいますか?

4

3 に答える 3

1

TIFF タイルを使用して、TIFF を小さな部分 (「タイル」) に分割できます。大きな画像を作成するコードを制御すると、JAI を使用して画像コンテンツをタイルごとに取得できます。

JAI でタイル画像を作成する方法の例を次に示します。

ColorModel cm = source.createColorModel();
// SampleModel with the tilesize
SampleModel sm = cm.createCompatibleSampleModel(tileWidth, tileHeight);
TiledImage image = new TiledImage(0, 0, imageWidth, imageHeight, 0, 0, sm, cm);

TIFFEncodeParam tep = new TIFFEncodeParam();
tep.setTileSize(tileWidth, tileHeight); // Set tile size to avoid OOM
tep.setWriteTiled(true);
JAI.create("filestore", image, filepath, "TIFF", tep);

TIFF の制作を制御できない場合、JAI に関する私の知識はあまりにも限られているため、あまり役に立ちません。

于 2013-03-18T16:44:53.127 に答える
1

私はいくつかの問題を抱えていましたが、最終結果はあなたを驚かせるかもしれません:

Runtime.exec() メソッドを使用して、いくつかのコマンドライン オプションを指定して IrfanView を呼び出すことになりました。そうすれば、圧縮やサイズについて心配する必要はありません。それは機能し、正しいファイルを正しいフォルダーに出力します。

Linux を使用している場合は、ImageMagik などを使用できます。

于 2012-06-01T09:46:39.507 に答える
0

Java VM のメモリを増やしてください。

それでもうまくいかない場合は、JAI ソース コード の TIFF プラグインのソース コードを見てください。ストリーミング アプローチを使用してデータ構造を解凍するだけの独自のプロセッサを作成できる場合があります (したがって、いつでもイメージ全体をメモリに保持する必要はありません)。

それでもうまくいかない場合は、Java から DLL のコードを呼び出すことができるJNAを調べてください (C コードは必要ありません。Sun の JNI API とは異なり、すべて純粋な Java から実行されます)。

于 2012-06-01T11:50:21.363 に答える