C# 正确显示winforms picturebox的USB摄像头输入时出现问题

C# 正确显示winforms picturebox的USB摄像头输入时出现问题,c#,winforms,webcam,C#,Winforms,Webcam,我有一个USB摄像机,它可以输出640x480个图像数据帧,我想把这些帧放在winforms pictureBox中。当我使用SetPixel将数据映射到pictureBox时,图像看起来很好,但SetPixel速度非常慢,因此我尝试了以下方法: void CreateBitmap() { int width = bitmap.Width; int height = bitmap.Height; int n = 0;

我有一个USB摄像机,它可以输出640x480个图像数据帧,我想把这些帧放在winforms pictureBox中。当我使用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);
    }
void CreateBitmap()
{
int width=位图宽度;
int-height=位图.height;
int n=0;
//将规范化数据复制到1D数组中
锁(imageDataLocker)
{
对于(int i=0;i
其中,rgbValues是一个1D字节数组,每个像素包含3个字节,imageData是由相机提供的2D int数组,位图具有24bppRgb格式。我没有发现任何错误,但当我将位图指定给pictureBox的背景图像时,会出现一种奇怪的带状效果:


我在这里遗漏了什么?

首先,我认为你的外环应该是j=0;J 我用这个简单的模式进行了测试,它制作了一个左半蓝色和右半黑色的位图

        Bitmap bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        BitmapData bitmapData = bm.LockBits(new Rectangle(0,0,16,16), ImageLockMode.WriteOnly, bm.PixelFormat);
        IntPtr ptr = bitmapData.Scan0;

        byte[] rgbValues = new byte[16 * 16 * 3];

        int b = 0;

        for (int y = 0; y < bm.Height; y++)
        {
            for (int x = 0; x < bm.Width; x++)
            {
                if (x < 7)
                {
                    rgbValues[b++] = 255; // BLUE, not red!
                    rgbValues[b++] = 0; // g
                    rgbValues[b++] = 0; // r
                }
                else
                {
                    rgbValues[b++] = 0; // r
                    rgbValues[b++] = 0; // g
                    rgbValues[b++] = 0; // b

                }
            }
        }

        int bytes = rgbValues.Length;
        System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
        bm.UnlockBits(bitmapData);
        pictureBox1.Image = bm;

    }
Bitmap bm=新位图(16,16,System.Drawing.Imaging.PixelFormat.Format24bppRgb);
BitmapData BitmapData=bm.LockBits(新矩形(0,0,16,16),ImageLockMode.WriteOnly,bm.PixelFormat);
IntPtr ptr=bitmapData.Scan0;
字节[]rgbValues=新字节[16*16*3];
int b=0;
对于(int y=0;y

另外,请注意,您写入的第一个字节应该是蓝色,然后是绿色,然后是红色。

您确定一个像素由3个字节编码吗?图像应该是网络摄像头的图像Gabba:根据此页面,是:可能是在输出位图中的另一个表示形式?您尝试过使用不同的网络摄像头输入图片吗?结果总是一样的吗?你能发布一张输入图片,这样我们就可以比较预期的结果和实际的结果吗?啊,在我测试了这段代码之后,你实际上暴露了我的问题;我的宽度是外环,高度是内环,所以我把它绕错了方向。真蠢。谢谢