winformsのpictureBoxに入れたい640x480の画像データフレームを吐き出すUSBビデオカメラがあります。SetPixel を使用してデータを pictureBox にマップすると、画像はきれいに見えますが、SetPixel は非常に遅いので、代わりにこれを試しました。
void CreateBitmap()
{
int width = bitmap.Width;
int height = bitmap.Height;
int n = 0;
// copy normalized data into 1D array
lock (imageDataLocker)
{
for (int i = 0; i < width; ++i)
{
for (int j = 0; j < height; ++j)
{
Color c = Colorizer.GetColor(imageData[i, j]);
rgbValues[n] = c.R;
rgbValues[n + 1] = c.G;
rgbValues[n + 2] = c.B;
n += 3;
}
}
}
// Copy image data into the bitmap
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, bitmap.PixelFormat);
IntPtr ptr = bitmapData.Scan0;
int bytes = rgbValues.Length;
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
bitmap.UnlockBits(bitmapData);
}
ここで、rgbValues は 1 ピクセルあたり 3 バイトを含む 1D バイト配列、imageData はカメラによって提供される 2D int 配列、bitmap は 24bppRgb 形式です。これでエラーは発生しませんが、pictureBox の BackgroundImage にビットマップを割り当てると、奇妙なバンディング効果があります。
ここで何が欠けていますか?