进程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。对图像处理不熟悉,很晕~
还可以使用DLL共享数据段。
-------------------------------------------------------
广告:VC/WinAPI 网络/多线程讨论 QQ群, 群号:41356711
一个 DDE client过时了,但仍然很方便
BITMAPFILEHEADER fileHead;
BITMAPINFOHEADER infoHead; //create BITMAPINFOHEADER
infoHead.biSize = sizeof(BITMAPINFOHEADER);
infoHead.biWidth = m_nWidth;
infoHead.biHeight = m_nHeight;
infoHead.biPlanes = 1;
infoHead.biBitCount = 24;
infoHead.biCompression = BI_RGB;
infoHead.biSizeImage = m_nWidth * m_nHeight * 3;
infoHead.biXPelsPerMeter = 0;
infoHead.biYPelsPerMeter = 0;
infoHead.biClrUsed = 0;
infoHead.biClrImportant = 0; //create BITMAPFILEHEADER
fileHead.bfType = (((int)'M') << 8) + 'B';
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
fileHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
fileHead.bfSize = fileHead.bfOffBits + m_nWidth * m_nHeight * 3; *ppData = new char[fileHead.bfSize];
*pnDataSize = fileHead.bfSize;
memcpy(*ppData, (BYTE*)&fileHead, sizeof(BITMAPFILEHEADER));
memcpy(*ppData+sizeof(BITMAPFILEHEADER), (BYTE*)&infoHead, sizeof(BITMAPINFOHEADER));
memcpy(*ppData+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER), pDst, infoHead.biSizeImage);#ifdef _DEBUG
TCHAR szFile[MAX_PATH];
memset(szFile, 0, sizeof(szFile));
swprintf(szFile, _T("c:\\[%d]decoder_%05d.bmp"), GetCurrentThreadId(), m_nFrameCount);
HANDLE hFile = ::CreateFile(szFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL );
DWORD dwWritten = 0;
WriteFile(hFile, *ppData, *pnDataSize, &dwWritten, NULL);
CloseHandle(hFile);
#endif