进程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。对图像处理不熟悉,很晕~

解决方案 »

  1.   

    800*600大小的数组对不对 
    //肯定不正确,32位色深的bitmap数据,就需要4个字节表示一个点,就是你所提到的iW*iH*4
      

  2.   

    800*600不对,你采集的图象大小跟你的摄象头有关系,普通的只有352*288,或者320*240,你使用过DirectShow来做这些事情很简单的,还可以对视频属性进行设置,就象QQ的视频聊天一样,进行各种压缩,然后传输,存储为视频文件,你都不需要过多的关心这些细节。
      

  3.   

    的确,数组的大小不正确,经过调试,知道获得的图像是800×600的24色的,所以数组大小应该是800×600×3。我已经通过
    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中,结果一样
      

  4.   

    更正:格式应该用Format24bppRgb,但是结果一样
      

  5.   

    知道了,
    Bitmap(nWidth,nHeigh,sizeof(px),PixelFormat::Format24bppRgb,IntPtr(px));
    第三个参数错了,应该是每行的大小,而不是整个的大小,改成:
    Bitmap(nWidth,nHeigh,frame->image.bmWidthBytes,PixelFormat::Format24bppRgb,IntPtr(px));就OK啦~