私はFreeImage.NetとC#を使用してJPEG圧縮でJPEGをTIFFに変換しようとしています。これは問題なく機能しますが、低品質のJPGESの場合、TIFFファイルは元のファイルよりもはるかに大きくなります。出力画像は常にほぼ同じサイズであったため、TIFFサイズは元のJPEG品質に依存しないと思います。
例(スクリーンショットの変換):
2065kb JPEG (quality: 100%) --> 1282kb TIFF
379kb JPEG (quality: 50%) --> 1200kb TIFF
私たちのクライアントと私たちはかなり多くのドキュメントを扱っているので、このサイズの増加は私たちの会社には受け入れられません。
興味深いことに、GIMPで画像を変換してもほぼ同じ結果が得られます。今私は疑問に思っています:これはTIFF標準によるものですか、それともFreeImage / GIMPに特別なものですか?(どちらもlibtiff.dllを使用していると思います)。
別の方法があると思います。私たちの会社には、はるかに小さいサイズのJPEG圧縮TIFFとして画像を生成するスキャナーがあります。この変換をより効果的に処理できる、またはFreeImageでこれを実現できる別のライブラリ(無料かどうかに関係なく)について誰か知っていますか?
アップデート:
TIFF 6.0仕様を調べ、スキャナーが生成したファイルを分析し、JPEGを非常に単純なTIFFコンテナーにラップする関数を記述できました(複数ページのTIFFにマージされた複数のJPEGでも機能します)。
TIFFについて少し知っている人のために:私は新しいTIFFファイル(画像/ページの数に応じて1つ以上のIFDを含む)を作成し、既存のJPEG画像の生データを単一のストリップに書き込みました(IFDごと)。次のフィールド/エントリを使用します。
NewSubfileType = 0
ImageWidth = //(width of the original JPEG)
ImageLength = //(height of the original JPEG)
BitsPerSample = {8, 8, 8} //(count: 3)
Compression = 7 //(JPEG)
PhotometricInterpretation = 6 //(YCbCr)
StripOffsets = //(offset of raw JPEG data, count: 1)
SamplesPerPixel = 3
RowsPerStrip = //(height of the original JPEG)
StripByteCounts = //(length of raw JPEG data, count: 1)
XResolution = //(horizontal resolution of original JPEG data)
YResolution = //(vertical resolution of original JPEG data)
PlanarConfiguration = 1 (chunky)
ResolutionUnit = 2 //(Inch)
(元の画像の情報を取得するために、FreeImageを使用しましたが、他の画像ライブラリも同様に機能するはずです。)
まだ知らない落とし穴があるかもしれません。JPEGファイルでは動作しない可能性があります。また、なぜ他のフィールドの値を使用PhotometricInterpretation = 6
しなければならなかったのかわかりません。PlanarConfiguration = 1
ただし、動作します。
他のライブラリでの私の問題は、常に同じ品質の完全に新しいJPEGを生成し(TIFF圧縮をJPEGに設定することしかできず、それ以上のオプションを指定できないため)、それをTIFFコンテナにラップしたことだと思います。
私も今知っていますが、TIFFでのJPEG圧縮は、必ずしも最良の選択ではありません(JPEG圧縮されたTIFFは、通常のJPEGファイルよりも優れているだけでなく、損失が多く、一般的ではなく、ほとんどサポートされていません)。しかし、私たちのクライアントはそれを要求します。上記が適切な解決策になるかどうか、または私がなんとか他の解決策を見つけることができるかどうかを見てみましょう。