从相机显示实时图像

时间:2009-04-08 03:34:44

标签: c# .net image-processing

我正在开发一个C#.NET应用程序,它将显示从相机(智能相机)捕获的图像。我正在使用下面的函数将从相机接收的原始数据(这是一个字节数组)转换为位图图像。我在下面的代码中遇到的问题是,C#.NET应用程序的图片框(理想情况下应该是实时图像)中显示的图像看起来像电影卷轴并且它一直向右滚动。不知道如何解决这个问题?

private Image ByteArrayToImage(byte[] myByteArray) 
{
    if (myByteArray != null)
    {
        MemoryStream ms = new MemoryStream(myByteArray);
        int Height = 504; /*The exact height of image from Smart Camera*/
        int Width = 664;  /*The exact width of image from Smart Camera*/

        BitmapData bmpData = 
            bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), 
                         ImageLockMode.WriteOnly, bmp.PixelFormat);

        Marshal.Copy(myByteArray, 0, bmpData.Scan0, myByteArray.Length);

        Bitmap bmp = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);
        BitmapData bmpData = 
            bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), 
                         ImageLockMode.ReadWrite, bmp.PixelFormat);
        int offset = 0;
        long ptr = bmpData.Scan0.ToInt64();
        for (int i = 0; i < Height; i++)
        {
            Marshal.Copy(myByteArray, offset, new IntPtr(ptr), Width);
            offset += (Width);
            ptr += bmpData.Stride;
        }
        bmp.UnlockBits(bmpData);
        return bmp;
    }
    return null;
}

@Mark,在我用于从相机接收数据的代码段下方找到...

逻辑:我首先收到sizeof图像,然后打开套接字连接n循环,直到我从相机获得sizeof字节。

public static byte[] receivedata(Socket clientSock)
{
    if (clientSock != null)
    {
        byte[] size = new byte[10000000]; 
        byte[] buffer = null;
        int ch, received, offset;

        try
        {
            clientSock.Receive(size);
            //MessageBox.Show("size array is " + size[0] 
            // +  " " + size[1] +  " " + size[2] +  " " );
            ch = BitConverter.ToInt32(size, 0);

            //ch = 334656;

            //MessageBox.Show("Sizeofimg = " + ch + "");

            buffer = new byte[ch];

            //MessageBox.Show("Start receiving image from camera");
            received = 0;
            offset = 0;
            do
            {
                received += clientSock.Receive(buffer, 
                                               offset + received, 
                                               ch - received,
                                               SocketFlags.None);
            } while (received < ch);

                //MessageBox.Show("Received " + received + " values");
                System.Threading.Thread.Sleep(50);
            }
            catch (Exception e)
            {
                MessageBox.Show("Error receiving ...");
                MessageBox.Show(e.StackTrace);
            }
            return buffer;
        }
        else
        {
            return null;
        }
    }
}

请指出问题...... 提前谢谢。

1 个答案:

答案 0 :(得分:0)

“向右滚动”告诉我每个图像都是一致的解码,但连续的图像相互关闭。正确?这意味着问题不在于您向我们展示的代码中,而是在从相机读取的代码中。

编辑:您的宽度和高度似乎有点偏差。我发现的664x504相机的唯一文档指出“活动区域”(实际包含图片的部分)实际上是648x488。如果是这种情况,你的图片似乎也会倾斜一点,因为每一行都会从下一行偏移,并且随着你读取的每一帧都将成为下一帧数据的一部分,它会向上移动。