2011-12-19 7 views
3

私は8ビットのビットマップカラー画像を持っています。私はC#印刷画素値

Color pixelcolor = b.GetPixel(j,i);  
Console.Write(pixelcolor.ToString() + " "); 

を行うとき、私は私が唯一の8ビットの値を取得する必要があり

Color [A=255, R=255, G=255, B=255] 

を取得します。 R、G、B、Aの24ビットの値ではありません。あなたが欲しい

+0

が画像8ビットのインデックスまたは非インデックス付きのですか? –

+0

@ErnodeWeerd私は正直なところインデックスされていない8bppフォーマットに遭遇したことはありません。これは、意味のある色情報を格納するには小さすぎる各色成分に対して2または3ビットしか持たないことを意味する。 – Nyerguds

+0

@ニーアードーズ - それが遭遇しても、それは仕様によると不可能ではありません。単色または4色の画像は、まったく遠くに取り込まれません。 –

答えて

4

Bitmapクラスを直接使用する方法はありません。最初のプロジェクトでenable unsafe codeに思い出してくれる:

:しかし、あなたが直接このようなunsafeコードを使用して、ピクセルにアクセスするためのLockBitsメソッドを使用することができます。

private static unsafe byte GetIndexedPixel(Bitmap b, int x, int y) 
{ 
    if (x < 0 || x >= b.Width) throw new ArgumentOutOfRangeException("x", string.Format("x should be in 0-{0}", b.Width)); 
    if (y < 0 || y >= b.Height) throw new ArgumentOutOfRangeException("y", string.Format("y should be in 0-{0}", b.Height)); 
    var data = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Indexed); 
    try 
    { 
     var scan0 = (byte*) data.Scan0; 
     return scan0[x + y*data.Stride]; 
    } 
    finally 
    { 
     if (data != null) b.UnlockBits(data); 
    } 
} 
+0

'Marshal.Copy'を使用してバイトを取得することで、安全でないことを避けることができます。 – Nyerguds

+1

ええ、1ピクセルを照会するだけでバッファ全体をコピーするのは面倒です。しかし、通常はほとんどすべてのピクセルが読み取られていない場合は、この場合Marshal.Copyは最適な方法です。 – vidstige

+1

うん...このコードをそのまま使用すると、通常のGetPixelと同じ問題が発生することがよくあります。すべてのコンテンツをループして、各ピクセルをロックしたりアンロックしたりすると、数千から数千万ピクセルの画像にバイト配列の内容をチェックするだけでは猛烈です。 – Nyerguds

-1

値が実際にRedGreenと色のBlue対応する構成要素の8ビットのビットマップ値でありRGB、です。

Aは、Alfaであり、色の透明度値です。気にしない場合は、文字列出力に表示しないでください。

+0

@downvoter:説明する気に? – Tigran

+1

これはインデックス付きビットマップがどのように動作するかではありません... – vidstige

1

Bitmapクラスのメソッドでは、パレットインデックスを直接取得することはできません。

Paletteプロパティを使用して画像のパレットを取得し、その色を探しますが、これは回避策です。

パレットインデックスを直接取得するには、LockBitsメソッドを使用してイメージデータに直接アクセスします。データを配列にコピーするにはマーシャリングを使用するか、安全でないモードのポインターを使用してアクセスしなければなりません。


ColorAプロパティは、アルファ成分です。 0〜255の値を持つことができます.0は完全に透明、255は完全にソリッドです。

0

あなたがするLockBitsを使用したくない場合は、あなたがこれを行うことができます:

/// <summary> 
/// Gets the pixel value in bytes. Uses Bitmap GetPixel method. 
/// </summary> 
/// <param name="bmp">Bitmap</param> 
/// <param name="location">Pixel location</param> 
/// <returns>Pixel value</returns> 
public static byte Get8bppImagePixel(Bitmap bmp, Point location) 
{ 
    Color pixelRGB = bmp.GetPixel(location.X, location.Y); 
    int pixel8bpp = Array.IndexOf(bmp.Palette.Entries, pixelRGB); 
    return (byte)pixel8bpp; 
} 
+0

パレットに重複がある場合、これは信頼できません。 – Nyerguds