2009-07-02 4 views
1

私は8bppIndexedグレースケールイメージをメモリにロードし、ピクセル値を読み込みます。問題は、ピクセルから取得した値が実際のイメージと一致していないように見えることです。常に暗くなります。私の画像は、このような単純な灰色の勾配である:右下の画素191を返すとトップ左上が実際に64であり、右下はここ255C#のビットマップイメージの濃淡の問題

である0を左

alt text

画像をロードする方法:

Bitmap threshImg = new Bitmap(@"C:\grey.bmp"); 

PixelFormatを確認すると、Format8bppIndexedになっていることが確認されます。私は、それぞれのコーナーに正しい色値を参照

BitmapData data = threshImg.LockBits(new Rectangle(0, 0, rectWidth, rectHeight), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); 
unsafe 
{ 
    byte* pixel = (byte*)data.Scan0.ToPointer(); 
    int topVal = (int)(byte)pixel[0]; 
    int bottomVal = (int)(byte)pixel[((threshImg.Height * threshImg.Width)) - 1]; 
} 
threshImg.UnlockBits(data); 

を私は24bppRbgに画像を変換する(それに応じてコードを調整する)場合:ので、私はそうのような左、右下の画素と上面を読み取ります。

なぜ8bppIndexed画像を使用すると、より暗い値になるのですか?

答えて

3

8bppインデックスイメージの値は、色自体(またはグレー値)ではなくインデックスです。パレットの色の値を調べてみてください。

+0

カラーパレットを見て、インデックスが正しい色に一致しました。私はちょうどパレットが256色をカバーするグレースケールの均等分布であると仮定しましたが、実際にはインデックス192からの64色の黒色の範囲がありました:-) – badbod99

1

インデックス付きの画像では、特定の数の色しか使用できません(この場合はグレーの濃淡です)。通常は256です。元の画像に色調の範囲全体を表示するには十分ではありません。

正確な色合いを持つことが重要なので、私は24bppの画像に移行します。

+0

+1:スケーリングの問題になります。 –

+0

元の画像は8bpp形式で保存されました。高フレームレートで1394aバスの帯域幅内に保つために、8bppに設定されたグレースケールビデオカメラを使用しているため、元の画像はこの形式になっています。 – badbod99