2017-06-28 7 views
0

私はTIFFファイルを持っていますが、どの圧縮を使用したのか知りたいのですが、ImageIOを使用してそれを実現する方法はありますか?私はIIOMetadataオブジェクトからこの情報を得ることに失敗しました。私は最初にこのファイルからBufferedImageを作成し、それを処理して元の同じ名前の異なる同じ圧縮で保存しようとします。この圧縮名が常にプラグインのImageWriteParamによってサポートされている圧縮タイプ名と一致しない場合があることImageIOを使用してファイル圧縮に関する情報を取得する方法は?

ImageReader reader = ...; 

IIOMetadata metadata = reader.getImageMetadata(0); // 0, first image 
IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName); 
IIOMetadataNode compression = (IIOMetadataNode) root.getElementsByTagName("CompressionTypeName").item(0); 
String compressionName = compression.getAttribute("value"); 

System.out.printf("Compression: %s", compressionName); 

注:次のコードは、(人間が読める形で)あなたの圧縮を与えるImageIOでのAPIを使用して

+0

本当に保存したファイルが必要ですか、情報を取得するために保存していますか?読み込みや保存でデータが壊れる可能性があるため(たとえば、Javaが完全にサポートしていないtiffやその他のオプションの複数ページのプロパティなど)、情報の保存のみが必要な場合は、悪い考えです。あなたはファイル情報が必要です私はImageIOをまったく使用しません - ファイルを直接解析するか、またはこれを行うライブラリを使用します。 – Robert

+0

私は本当にそれを処理し、それを保存する必要があります - 通常、いくつかの部分で、私は元のものと同じ圧縮タイプでそれらを永続化したい。 –

+1

あなたは 'tiffdump YourImage.tif | grep Compression 'を実行し、TIFFタグ259を参照して値を解釈する。 –

答えて

1

(それはしばしばありますが)。上記は、standard or "plug-in neutral" metadata format(ほとんどの場合)をサポートするすべてのプラグインで動作します。

いずれの場合でも、圧縮を維持したい場合は、ImageWriteParamCOPY_FROM_METADATA圧縮モードを使用することをお勧めします(これはデフォルトのため、指定する必要はありません)。 metadataは書き込みメソッドにオブジェクトを渡します(イメージメタデータとして渡し、メタデータをストリームしないでください)。これは、リーダーとライターが同じ形式を理解している限り、サポートされているメタデータ形式に関係なく機能します。

IIOImage iioimg = reader.readAll(0, readParam); // image AND metadata in one go 

RenderedImage image = iioimg.getRenderedImage(); // normally a BufferedImage 
// ... image manipulation 
iioimg.setRenderedImage(modifiedImage);   // in case the reference changed 

writer.write(null, iioimg, writeParam);   // will preserve compression by default 

小警告:

これを達成する最も簡単な方法は、このようImageReader.readAll(..)メソッドを使用して読み取ることがおそらくいくつかのプラグインは、対応するライターが書くことができるより多くの圧迫を読み込み、読者を持っています。例えば。 TIFFの場合、ライターは新しい「JPEG」圧縮での書き込みのみをサポートしていますが、読者は現在廃止予定の「旧式JPEG」圧縮を読むことができます。

関連する問題