2012-01-25 22 views
1

大きな画像のセクションのビットマップイメージを生成するためにLibTiff.Netを使用して読んでいるインデックス付きTiffイメージがあります。 Tiffには、出力ビットマップで使用される256の32ビットピクセル値に変換する256の色項目があると私は信じています。Tifでインデックスされた8ビットカラーを32ビットカラーに変換する

int bitsPerSample = tif.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
FieldValue[] colourIndex = tif.GetField(TiffTag.COLORMAP); 
int[] palette = new int[256]; 
for(int i = 0; i < 256; i++) 
{ 
    short red = colourIndex[0].ToShortArray()[i]; 
    short green = colourIndex[1].ToShortArray()[i]; 
    short blue = colourIndex[2].ToShortArray()[i]; 

    palette[i] = ? 
} 

RGBの短絡を32ビットピクセル値に変換するにはどうすればよいですか?

答えて

1

Try System.Drawing.Color.FromArgb(red, green, blue).ToArgb()

ただし、LibTiffとWin32の両方でARGB値に同じバイト順序が使用されている場合にのみ、これは正しい結果を示します。また、赤、緑、青の値が0〜255の範囲にあることを前提としています。そうでない場合は、それらを拡大縮小することができます。

+0

優れ、感謝を!それは働いているようだ。色の値は0〜65536なので、65535で割り、255を掛けましたが、予想される色とはまったく異なります。 – JWood

+0

-32768から32767まで実行される 'short'を使用しています。libtiffが全範囲を使用しているかどうかわかりません。どちらの方法でも計算が正しく行われません。 – arx

+0

申し訳ありませんが、今私はushortを使用していると述べたはずです。計算は正しいです。 – JWood

0

TIFF ColorMapでは、各色の値の数は2 ** BitsPerSampleです。したがって、8ビットのパレットカラーイメージのColorMapフィールドは3 * 256の値を持ちます。

各値の幅は16ビットです。 0は最小強度を表し、65535は最大強度を表す。ブラックだから、あなたはおそらく次のコードを使用する必要があり、65535

を0,0,0で表され、65535、65535で白さ:

ushort red = colourIndex[0].ToShortArray()[i]; 
ushort green = colourIndex[1].ToShortArray()[i]; 
ushort blue = colourIndex[2].ToShortArray()[i]; 

palette[i] = System.Drawing.Color.FromArgb(red/255, green/255, blue/255).ToArgb(); 
関連する問題