求助用avicap32.dll的API捕获摄像头信息,回调函数中的信息是什么格式,怎么还原为BMP图像,谢谢

jasinechen 2012-03-27 03:28:26
如题,以下是回调函数:
private void FrameCallback(IntPtr lwnd, IntPtr lpvhdr)
{
VideoAPI.VIDEOHDR videoHeader = new VideoAPI.VIDEOHDR();
byte[] VideoData;
videoHeader = (VideoAPI.VIDEOHDR)VideoAPI.GetStructure(lpvhdr, videoHeader);
VideoData = new byte[videoHeader.dwBytesUsed];
VideoAPI.Copy(videoHeader.lpData, VideoData);
if (this.RecievedFrame != null)
this.RecievedFrame(VideoData);
}
我用public Bitmap(int width,int height,int stride,PixelFormat format,IntPtr scan0)创建BMP得到的图像是黑白的,而且图像被还原成了这个样子http://blog.csdn.net/jasine/article/details/7399098
图像变成了黑白色,而且右边多出来一部分,不知道怎么回事,不知道是不是Stride设置的不合适。。求高人指点。。
...全文
317 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fubo1980 2014-06-27
  • 打赏
  • 举报
回复
你好!代码能传一份吗qq42066827
Nick2019 2012-11-30
  • 打赏
  • 举报
回复
这个问题的答案,我也很想知道啊。。。有高人吗???
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
求解答啊,自己顶。。
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
不一致,bmpData.Stride = data.Length / bmpData.Height =1280;
bmpData.Width * 3 =1920;
width=640 ,height=480;
但是每一次返回的数据data只有480*1280=614400 而按理来说应该需要480*1920=921600bytes的数据,但是为什么返回的数据会少呢
mngzilin 2012-03-27
  • 打赏
  • 举报
回复
bmpData.Stride = data.Length / bmpData.Height ;
-----------------------------------------------------
data.Length / bmpData.Height这个结果和data.width*3是否一致
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
捕获的数据是什么格式呢?谁来解答一下啊
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
按照上面还原有问题吗?
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mngzilin 的回复:]

你是24位的,你bitmap也需要是24位的才能显示正常
[/Quote]
嗯,我就用的24位啊
GCHandle hObject = GCHandle.Alloc(data, GCHandleType.Pinned);
IntPtr pObject = hObject.AddrOfPinnedObject();
if (hObject.IsAllocated)
hObject.Free();
BitmapData bmpData = new BitmapData();
bmpData.Height = video.bitmapInfo.bmiHeader.biHeight;
bmpData.Width = video.bitmapInfo.bmiHeader.biWidth;
bmpData.Scan0 = pObject;
bmpData.PixelFormat = PixelFormat.Format24bppRgb;
bmpData.Stride = data.Length / bmpData.Height ;
System.Runtime.InteropServices.Marshal.Copy(data, 0, pObject, data.Length);
Bitmap newBitmap = new Bitmap(bmpData.Width, bmpData.Height, bmpData.Stride, bmpData.PixelFormat, bmpData.Scan0);
pictureBox1.Image = newBitmap;
mngzilin 2012-03-27
  • 打赏
  • 举报
回复
你是24位的,你bitmap也需要是24位的才能显示正常
jasinechen 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mngzilin 的回复:]

你返回的数据是rgb24位还是rgb16,还是rgb32位
[/Quote]
我也不知道,在捕获的时候设置的视频格式是
bitmapInfo.bmiHeader = new VideoAPI.BITMAPINFOHEADER();
bitmapInfo.bmiHeader.biSize = VideoAPI.SizeOf(bitmapInfo.bmiHeader);
bitmapInfo.bmiHeader.biWidth = mWidth;
bitmapInfo.bmiHeader.biHeight = mHeight;
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 24;

所以,返回的应该是rgb24吧,但是就是拿rgb24重新构造BMP,结果却不对。
mngzilin 2012-03-27
  • 打赏
  • 举报
回复
你返回的数据是rgb24位还是rgb16,还是rgb32位

jasinechen 2012-03-27
  • 打赏
  • 举报
回复
在线等啊,也没有人解答一下。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧