高分求救!摄象头捕获到的视频帧如何用DrawDibDraw显示?

jlhx_NET 2006-03-17 08:43:37
平台调用声明如下:
[DllImport("MsVfW32.dll")]
public static extern bool DrawDibDraw(IntPtr hdd,IntPtr hdc,int xDst,int yDst,int dxDst,int dyDst,IntPtr lpbi,IntPtr Bits,int xSrc,int ySrc,int dxSrc,int dySrc,int wFlags);


[StructLayout(LayoutKind.Sequential)] public struct VIDEOHDR
{
[MarshalAs(UnmanagedType.I4)] public int lpData;
[MarshalAs(UnmanagedType.I4)] public int dwBufferLength;
[MarshalAs(UnmanagedType.I4)] public int dwBytesUsed;
[MarshalAs(UnmanagedType.I4)] public int dwTimeCaptured;
[MarshalAs(UnmanagedType.I4)] public int dwUser;
[MarshalAs(UnmanagedType.I4)] public int dwFlags;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=4)] public int[] dwReserved;
}
FrameCallBack是一个回调函数,当捕获到一帧视频时,会自动触发该函数执行。

private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
{
AVICAP.VIDEOHDR videoHeader = new AVICAP.VIDEOHDR();
videoHeader = (AVICAP.VIDEOHDR)AVICAP.GetStructure(lpVHdr,videoHeader);

AVICAP.BITMAPINFOHEADER btComeepre = new serverWin.AVICAP.BITMAPINFOHEADER();
if(videoHeader.dwBytesUsed!=0)
{
byte[] VideoData = new byte[videoHeader.dwBytesUsed];
AVICAP.Copy(videoHeader.lpData ,VideoData);
capGetVideoFormat(this.lwndC,ref btComeepre,AVICAP.SizeOf(btComeepre));
display(mControlTo,mWidthTo,mHeightTo,VideoData,btComeepre);
}

}
public void display(IntPtr handle, int width,int height,byte[] _bmpDate,AVICAP.BITMAPINFOHEADER _btm)
{
//hdc是绘图控件句柄
IntPtr hdc =AVICAP.GetDC(handle);
//hdd是设备环境
IntPtr hdd=AVICAP.DrawDibOpen();
//下面代码操作内存
unsafe
{
//获取图象头指针
IntPtr phead = Marshal.AllocHGlobal(sizeof(AVICAP.BITMAPINFOHEADER));
//将参数图象头结构拷贝到非托管区,phead指针指向该区域
Marshal.StructureToPtr(_btm,phead,true);

//为BMP数据分配指针
IntPtr pdata = Marshal.AllocHGlobal(_btm.biSizeImage);
//将参数BMP图象数组拷贝到非托管内存区,pdata指针指向该区域
Marshal.Copy(_bmpDate,0,pdata,_btm.biSizeImage);

try
{
//执行这个函数就要出异常,为什么?
AVICAP.DrawDibDraw(hdd,hdc,0,0,width,height,phead,pdata,0,0,_btm.biWidth,_btm.biHeight,AVICAP.DDF_SAME_DRAW|AVICAP.DDF_SAME_HDC);
}
catch(Exception ex)
{
throw ex;
}

AVICAP.DrawDibEnd(hdd);
AVICAP.DrawDibClose(hdd);
}
}
问题:我测试过图象头和图象的数据(phead和pdata指针指向),没有任何问题,为什么在调用DrawDibDraw时会出现异常?异常消息是:未将对象引用到对象实例。

拜托各位高人了,我想了一天都没得到解决,估计错误是不是在DrawDibDraw函数要求BMP图片流的原始位置,而不是拷贝到非托管内存中的数据的位置?
...全文
198 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bflovesnow 2006-04-21
up
回复
jlhx_NET 2006-03-27
up
回复
jlhx_NET 2006-03-23
up....
回复
jlhx_NET 2006-03-23
up....几天了.....
回复
心情解码 2006-03-18
:)




-
回复
fellowcheng 2006-03-18
不会呀,只能关注下
回复
wxdl1981 2006-03-18
帮顶..............
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2006-03-17 08:43
社区公告

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