日期:2014-05-17  浏览次数:20747 次

有没有人能帮我解释一下。。。摄像头视频帧图片恢复

我获取摄像头的数据(是一个长614400个字节的数组,我的摄像头像素是640*480的),然后将它还原成图片并显示在picturebox里,为什么我还原的图片变成右边那样了啊。。。

                  GCHandle hObject = GCHandle.Alloc(VideoData, GCHandleType.Pinned);
                IntPtr pObject = hObject.AddrOfPinnedObject();
                if (hObject.IsAllocated)
                {
                    hObject.Free();
                }
                BitmapData bmpData = new BitmapData();
                bmpData.Width = bitmapinfo.bmiHeader.biWidth;
                bmpData.Height = bitmapinfo.bmiHeader.biHeight;
                bmpData.Scan0 = pObject;
                bmpData.PixelFormat = PixelFormat.Format16bppRgb565;
                bmpData.Stride = VideoData.Length / bmpData.Height;
                bitmap = new Bitmap(bmpData.Width, bmpData.Height, bmpData.Stride, bmpData.PixelFormat, bmpData.Scan0);

这是还原的代码,在此之前已经得到了一帧的数据,保存在VideoData这个一维数组中。。。

PS:另外,有一个疑问,我其实不知道得到的字节数组中的数据时怎么个数据,在网上查了很多资料,说是视频帧的像素的数据,既然这样,我的摄像头的像素是640*480 = 307200个像素,而得到的字节数组VideoData的大小始终是614400,有这样一个关系614400 = 307200 * 2= 640 * 480 *2...这样是不是以为着一个像素值用16位,两个字节表示,所以我用了bmpData.PixelFormat = PixelFormat.Format16bppRgb565;但是这样不行啊,其他的Format16bppRgb1555,Format16bppRgb555,我都试过了,得到的效果差不多。。。真是不明白的,各位大侠们,多多指点啊,已经一个星期了,一点进展没有。。。
------解决方案--------------------
自己先UP一个。。。
------解决方案--------------------
该回复于2012-11-29 11:03:18被管理员删除
------解决方案--------------------
看一下这个demo:http://www.codesoso.com/code/Motion_Detection.aspx,C#能做的事情,为什么非要调用别的方法呢?
------解决方案--------------------
谢谢楼上的回答,不过我想知道这个中的转化细节。。。
------解决方案--------------------
试试 PixelFormats.Bgr555
------解决方案--------------------
引用:
试试 PixelFormats.Bgr555

好像没有bgr555这个格式,只有rgb555,其他的rgb1555什么的都试过了。。。不行!
------解决方案--------------------
引入PresentationCore.dll, 然后用 System.Windows.Interop.Imaging.CreateBitmapSourceFromMemorySection 创建位图,或者自己写个格式i转换把bgr转成rgb
------解决方案--------------------
谢谢你们的回答,不过都不是我想要的。。。