私はLockBitsを使ってカラーピッカーを作ろうとしているので、カーソルをピクチャボックスの上に移動すると、カーソル位置にある色が表示されます。しかし、GetPixelでのアプローチは、私がLockBitsを使ってこれを行う方法に興味があります。ビットマップからロックビットを使って色を選ぶ
私の試みは、残念ながら白のすべての時間を示しています。ここ
void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image);
// we will try to get the pixel using raw data and make color from it
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, bmp.PixelFormat);
// default format is 32bpp argb (4 bytes per pixel)
unsafe
{
byte* scanline = (byte*)data.Scan0;
for(int y = 0; y < data.Height; y++)
{
// row
for (int x = 0; x < data.Width; x+=4)
{
int r = scanline[x];
int g = scanline[x+1];
int b = scanline[x+2];
//int a = scanline[x+3];
Color color = Color.FromArgb(255, r, g, b);
pictureBox2.BackColor = color;
}
}
}
bmp.UnlockBits(data);
//Color color = bmp.GetPixel(e.X, e.Y);
}
チャンネルを逆にしているだけでなく(物理的にはBGRAです)、実際のピクセルフォーマットとストライドは無視されます。 1つのピクセルをピックするときにgetPixelでlockbitsを使用するというパフォーマンス上の理由がありません。なぜなら、humnan slo-moユーザーがピッキングを行うときだけではありません。多くの[作業例](http://stackoverflow.com/questions/24411114/c-sharp-copy-bitmaps-pixels-in-the-alpha-channel-on-another-bitmap/24411925#24411925)があります。 。 – TaW
はい、私はこの方法でこれを行う方法を学びたいと思います。 – lll
さらに、マウスが動くたびにビットマップ全体をループするのは奇妙に思えます。少なくとも、あなたは 'MouseEventArgs'パラメータで提供されるX、Y座標を使用し、その単一のピクセルを選択するためにlockbitsを使用すると思います。 –