进程A:实时获取摄像头得到的视频帧,可得到HBITMAP,然后通过CBitmap,可获得BITMAP。进程B如何得到进程A获得的一个同样的BITMAP?我想关键在于传递实际的像素信息,但是一直没有成功:(我的做法:进程A中:CBitmap cb;
cb.Attach((HBITMAP)pHandle); //pHandle是一个其它类型的图片句柄
cb.GetBitmap(&(m_pFrame->image)); //m_pFrame是自定义的结构体指针,image为BITMAP cb.GetBitmapBits(800*600,&(m_pFrame->bit)); //bit为800*600大小的一维byte数组然后通过内存共享,进程B可得到这些数据进程B中:myFileMapping.Read(buffer);
memcpy(frame,buffer,sizeof(FRAME));//这两行是读取A共享的数据int x,y;
int nWidth=frame->image.bmWidth;
int nHeigh=frame->image.bmHeight;BYTE *px = new BYTE[nHeigh*nWidth]; //声明暂存数组
for(int j=0;j<nWidth*nHeigh;j++)
px[j]=frame->bit[j];CBitmap cb;
HBITMAP hBmp=NULL;
hBmp=::CreateBitmap(nWidth,nHeigh,frame->image.bmPlanes,frame->image.bmBitsPixel,px);
//BOOL r=cb.CreateBitmap(nWidth,nHeigh,frame->image.bmPlanes,frame->image.bmBitsPixel,px);
//cb.CreateBitmapIndirect(&(frame->image));
//DWORD r=cb.SetBitmapBits(nWidth*nHeigh,frame->bit);但是无论是未注释掉的还是注释掉的方法,都以失败而告终,甚是郁闷我不知道用800*600大小的数组对不对,因为我看到过这样的代码:BYTE *bufferBmp = NULL ;
int sizeBmp = iW * iH * 4;
bufferBmp = (BYTE *)malloc(sizeof(BYTE) * sizeBmp) ;
cBitmap.GetBitmapBits(sizeBmp , bufferBmp);这里用的是iW * iH * 4。对图像处理不熟悉,很晕~
cb.Attach((HBITMAP)pHandle); //pHandle是一个其它类型的图片句柄
cb.GetBitmap(&(m_pFrame->image)); //m_pFrame是自定义的结构体指针,image为BITMAP cb.GetBitmapBits(800*600,&(m_pFrame->bit)); //bit为800*600大小的一维byte数组然后通过内存共享,进程B可得到这些数据进程B中:myFileMapping.Read(buffer);
memcpy(frame,buffer,sizeof(FRAME));//这两行是读取A共享的数据int x,y;
int nWidth=frame->image.bmWidth;
int nHeigh=frame->image.bmHeight;BYTE *px = new BYTE[nHeigh*nWidth]; //声明暂存数组
for(int j=0;j<nWidth*nHeigh;j++)
px[j]=frame->bit[j];CBitmap cb;
HBITMAP hBmp=NULL;
hBmp=::CreateBitmap(nWidth,nHeigh,frame->image.bmPlanes,frame->image.bmBitsPixel,px);
//BOOL r=cb.CreateBitmap(nWidth,nHeigh,frame->image.bmPlanes,frame->image.bmBitsPixel,px);
//cb.CreateBitmapIndirect(&(frame->image));
//DWORD r=cb.SetBitmapBits(nWidth*nHeigh,frame->bit);但是无论是未注释掉的还是注释掉的方法,都以失败而告终,甚是郁闷我不知道用800*600大小的数组对不对,因为我看到过这样的代码:BYTE *bufferBmp = NULL ;
int sizeBmp = iW * iH * 4;
bufferBmp = (BYTE *)malloc(sizeof(BYTE) * sizeBmp) ;
cBitmap.GetBitmapBits(sizeBmp , bufferBmp);这里用的是iW * iH * 4。对图像处理不熟悉,很晕~
解决方案 »
- debug release 结构体
- 请教高人。。。关于 CRITICAL_SECTION 是局部变量的问题
- 服务器地址放哪?
- 如何通過発送消息実現CombolBox的選択操作
- 在线等待!!------怎么安装VisualStudio!
- 关于字符串指针的问题。
- 一个让我真想把电脑砸了当废品卖的线程问题:这样的参数传递竟然会出错,你信不信?
- 高手们,我先装了XP,在接着装2000 Professional,弄的XP启动不起来,我现在想启动XP,我该怎么办,不能丢失XP下的数据与程序!
- 如何实现显示对话框之前修改其标题?
- SDK的TTS
- 为什么我动态建立的 List View 没有 3D 显示?
- 高手给个思路!分不够再加!!!
//肯定不正确,32位色深的bitmap数据,就需要4个字节表示一个点,就是你所提到的iW*iH*4
CBitmap cb;
cb.Attach((HBITMAP)pHandle);
cb.GetBitmap(&(m_pFrame->image));
cb.GetBitmapBits(800*600*3,&(m_pFrame->bit));将像素数据保存在m_pFrame->bit这个数组中,并通过进程通信传递给了进程B。现在遇到了新的问题:在进程B中,我打算用这些像素数据还原出一个.NET中的Bitmap图像:int nWidth=frame->image.bmWidth;
int nHeigh=frame->image.bmHeight;
memcpy(px,frame->bit,nWidth*nHeigh*3);
Bitmap ^ lastFrame=gcnew Bitmap(nWidth,nHeigh,sizeof(px),PixelFormat::Format32bppRgb,IntPtr(px));接着把lastFrame用另外一个对象的方法写进一个avi文件中。这是一个循环的过程,总之最后能够得到一个可以播放的AVI文件。但是看到播放的AVI文件不正确,也就是还原出来的Bitmap不正确,都是从右上角到右下角的斜线以及色条。如果视频有动作,录制下来的这种图像可以看到有变化。我想到像素数据的正序与倒序的问题,刚刚把frame->bit倒序地存进px中,结果一样
Bitmap(nWidth,nHeigh,sizeof(px),PixelFormat::Format24bppRgb,IntPtr(px));
第三个参数错了,应该是每行的大小,而不是整个的大小,改成:
Bitmap(nWidth,nHeigh,frame->image.bmWidthBytes,PixelFormat::Format24bppRgb,IntPtr(px));就OK啦~