主題が言うように、私は.bmp
画像を持っており、画像の任意のピクセルの色を取得できるコードを記述する必要があります。これは 1bpp (インデックス付き) のイメージなので、色は黒または白になります。ここに私が現在持っているコードがあります:
//This method locks the bits of line of pixels
private BitmapData LockLine(Bitmap bmp, int y)
{
Rectangle lineRect = new Rectangle(0, y, bmp.Width, 1);
BitmapData line = bmp.LockBits(lineRect,
ImageLockMode.ReadWrite,
bmp.PixelFormat);
return line;
}
//This method takes the BitmapData of a line of pixels
//and returns the color of one which has the needed x coordinate
private Color GetPixelColor(BitmapData data, int x)
{
//I am not sure if this line is correct
IntPtr pPixel = data.Scan0 + x;
//The following code works for the 24bpp image:
byte[] rgbValues = new byte[3];
System.Runtime.InteropServices.Marshal.Copy(pPixel, rgbValues, 0, 3);
return Color.FromArgb(rgbValues[2], rgbValues[1], rgbValues[0]);
}
しかし、どうすれば 1bpp イメージで動作させることができますか? ポインターから 1 バイトだけを読み取った場合、常に255
値が含まれているため、何か間違ったことをしていると思います。このメソッドの使用はお勧めし
ません。System.Drawing.Bitmap.GetPixel
動作が遅すぎるため、コードをできるだけ速く動作させたいからです。前もって感謝します。
編集: 誰かがこれを必要とする場合に備えて、これは正常に機能するコードです:
private Color GetPixelColor(BitmapData data, int x)
{
int byteIndex = x / 8;
int bitIndex = x % 8;
IntPtr pFirstPixel = data.Scan0+byteIndex;
byte[] color = new byte[1];
System.Runtime.InteropServices.Marshal.Copy(pFirstPixel, color, 0, 1);
BitArray bits = new BitArray(color);
return bits.Get(bitIndex) ? Color.Black : Color.White;
}