OpenCV中IplImage 与 Gdiplus 中Bitmap之间的相互转换

时间:2022-05-03 17:49:29
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. }
经测试可用,如果有问题,欢迎讨论!
mail:  mosesyuan at gmail.com