ネットカムのバッファからビットマップを取得しています。これらを PictureBox に割り当てると、赤と青が逆になります。
赤と青を適切な場所に配置するには、ビットマップまたは PictureBox に対して何ができますか?
次のコードは、必要な変換を行います。
public static void RGBtoBGR(Bitmap bmp)
{
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
int length = Math.Abs(data.Stride) * bmp.Height;
unsafe
{
byte* rgbValues = (byte*)data.Scan0.ToPointer();
for (int i = 0; i < length; i += 3)
{
byte dummy = rgbValues[i];
rgbValues[i] = rgbValues[i + 2];
rgbValues[i + 2] = dummy;
}
}
bmp.UnlockBits(data);
}
LockBits
メモリ内のビットマップをロックして、コンテンツに直接アクセスして変更できるようにします。安全でないコンテキストを保持したくない場合は、バイト配列を作成し、それを使用Marshal.Copy
してデータをそこにコピーし、操作後にビットマップに戻すことができます。ビットマップ データを操作するには、を使用するのが最速のオプションです (またはLockBits
よりもはるかに高速です)。GetPixel
SetPixel
ループ反復子 ( ) は、ビットマップの にi += 3
依存します。PixelFormat
ここでは、 であると想定していますPixelFormat.Format24bppRgb
。それFormat32bppArgb
はi += 4
.