5

チャンネルごとに 16 ビットの RGBA TIFF 画像を C 言語で処理しようとしていますが、仕様で 16 ビット画像に関する多くの情報を見つけることができませんでした。

チャンネルあたり 8 ビットの RGBA 画像の場合、ピクセルは uint32 として格納され、32 ビットを 8 ビットの 4 つのグループ (R、G、B、A) にグループ化することでインターレース解除できることを理解しています。次に、チャネルごとに 8 ビットの RGBA 画像を処理するために、次のことを行っています (ここに同封のソース コードも参照してください)。

  1. 画像データを uint32 タブ (TIFFReadRGBAImageOriented を使用) として保存します。data_tiff
  2. 次のコマンドを使用してピクセルのインターレースを解除します: (uint8) TIFFGetR(*data_tiff)(uint8) TIFFGetG(*data_tiff)(uint8) TIFFGetB(*data_tiff)&(uint8) TIFFGetA(*data_tiff)

チャンネルあたり 16 ビットの RGBA 画像の場合、ピクセルのインターレースを解除する方法を教えてください。画像データを uint64 タブとして取得できれば、次のことができます。

#define    TIFF16GetR(abgr)    ((abgr) & 0xffff)
#define    TIFF16GetG(abgr)    (((abgr) >> 16) & 0xffff)
#define    TIFF16GetB(abgr)    (((abgr) >> 32) & 0xffff)
#define    TIFF16GetA(abgr)    (((abgr) >> 48) & 0xffff)`
  1. 画像データを uint64 タブとして読み込みます
  2. (uint16) TIFF16GetR(*data_tiff)(uint16) TIFF16GetG(*data_tiff)(uint16) TIFF16GetB(*data_tiff)&を使用してピクセルをインターレース解除します(uint16) TIFF16GetA(*data_tiff)

しかし、データはuint64タブにネイティブに保存されていないように見えるので、チャンネルごとに16ビットの画像をどのようにuint32ピクセルタブにインターレースするのだろうか.

また、16ビットのグレースケール画像を同じ方法で処理するのも困難です(TIFFReadRGBAImageOriented画像データを取得し、各ピクセルをuint16に変換しようとしています)

より一般的に言えば、16 ビットのグレースケールおよびカラー画像に関するドキュメントはありますか?

よろしくお願いいたします。

レミー A.

4

1 に答える 1

8

高レベル インターフェイスは、TIFFReadRGBAImage常にサンプルあたり 8 ビットの精度でイメージを読み取ります。

精度を落とさずにチャンネルあたり 16 ビットの画像を読み取るには、直接使用して、およびTIFFReadScanlineに従って正しい量のデータを読み取ることができます。ただし、これが機能するのは、画像がストリップ (TIFF 6.0 で導入されたタイルではなく) に格納され、圧縮された各ストリップに 1 つの行しかない場合 (画像が圧縮されている場合) のみです。SamplesPerPixelBitsPerSample

を使用せずにすべての種類の TIFF イメージを処理するTIFFReadRGBAImage場合は、イメージ形式を検出し、 や などの低レベル インターフェイスを使用する必要が TIFFReadEncodedStripありTIFFReadEncodedTileます。

TIFF 仕様は非常に広範かつ柔軟であり、これらの低レベル インターフェイスを使用して考えられるすべての種類の画像を処理するのは簡単な作業ではないため、可能であれば libtiff よりも高レベルのライブラリを使用する方がよい場合があります。

編集

コメントで言及しているのは、ベースライン TIFFとして知られる TIFF 6.0 仕様の最初の部分です。

« TIFF が導入されたとき、その拡張性が互換性の問題を引き起こしました。エンコーディングの柔軟性は、TIFF が何千もの互換性のないファイル形式を表しているという冗談を引き起こしました.[9] これらの問題を回避するために、すべての TIFF リーダーはベースライン TIFF を読み取る必要がありました。ベースライン TIFF には、レイヤー、または JPEG または LZW による圧縮は含まれません。ベースライン TIFF は正式には TIFF 6.0、パート 1: ベースライン TIFF »ウィキペディアから

ベースライン TIFF は 8 ビットを超えるビット深度をサポートしていないため、ベースライン TIFF の仕様ではBitsPerSample、グレースケール イメージの の値は 4 または 8 のみであり、RGB イメージの値はチャネルあたり 8 ビットのみです。 . より高いビット深度は、ベースライン TIFF 仕様の拡張としてサポートされており、TIFF リーダーがそれらをサポートする必要はありません。

Tiled Images は Baseline 仕様の拡張でもありStripOffsets、 、、StripByteCountsおよびRowsPerStripフィールドが に置き換えられているためTileWidth、を使用して既存のフィールドを調べることで、タイル化された画像とストリップされた画像を区別できます。TileLengthTileOffsetsTileByteCountsTIFFGetField()

于 2013-04-16T10:25:23.743 に答える