OpenCV中IplImage 与 Gdiplus 中Bitmap之间的相互转换(转载)
Gdiplus::Bitmap转 IplImage
1 // pIplImage 需要外部释放 Mosesyuan 2 void CGeneral::BitmapToIplImage(Bitmap* pBitmap, IplImage* &pIplImg) 3 { 4 if (!pBitmap) 5 { 6 return; 7 } 8 if(pIplImg) 9 { 10 cvReleaseImage(&pIplImg); 11 pIplImg = NULL; 12 } 13 BitmapData bmpData; 14 Rect rect(0,0,pBitmap->GetWidth(),pBitmap->GetHeight()); 15 pBitmap->LockBits(&rect, ImageLockModeRead, PixelFormat24bppRGB, &bmpData); 16 IplImage* tempImg = cvCreateImage(cvSize(pBitmap->GetWidth(), pBitmap->GetHeight()), IPL_DEPTH_8U, 3); 17 BYTE* temp = (bmpData.Stride>0)?((BYTE*)bmpData.Scan0):((BYTE*)bmpData.Scan0+bmpData.Stride*(bmpData.Height-1)); 18 memcpy(tempImg->imageData, temp, abs(bmpData.Stride)*bmpData.Height); 19 pBitmap->UnlockBits(&bmpData); 20 pIplImg = tempImg; 21 //判断Top-Down or Bottom-Up 22 if (bmpData.Stride<0) 23 cvFlip(pIplImg, pIplImg); 24 }
OpenCV中 IplImage 转 Gdiplus::Bitmap
1 // pBitmap 同样需要外部释放!! 2 void CGeneral::IplImageToBitmap(IplImage* pIplImg, Bitmap* &pBitmap) 3 { 4 if(!pIplImg) 5 return; 6 BITMAPINFOHEADER bmih; 7 memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); 8 bmih.biSize = sizeof(BITMAPINFOHEADER); 9 bmih.biWidth = pIplImg->width; 10 bmih.biHeight = pIplImg->height; 11 bmih.biPlanes = 1; 12 bmih.biBitCount = pIplImg->depth*pIplImg->nChannels; 13 bmih.biSizeImage = pIplImg->imageSize; 14 BYTE* pData=new BYTE[bmih.biSizeImage]; 15 memcpy(pData, pIplImg->imageDataOrigin, pIplImg->imageSize); 16 if (pBitmap) 17 { 18 delete pBitmap; 19 pBitmap = NULL; 20 } 21 pBitmap = Gdiplus::Bitmap::FromBITMAPINFO((BITMAPINFO*)&bmih, pData); 22 }