Bitmap与IplImage之间的转换

  • //Karl_bmp.h
  • //1.IplImage 2 CBitmap
  • CBitmap * IplImage2CBitmap(const IplImage *pImage)
  • {
  •     if( pImage && pImage->depth == IPL_DEPTH_8U )
  •     {
  •         HDC hDC=GetDC()->GetSafeHdc();
  •        uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
  •        BITMAPINFO* bmi = (BITMAPINFO*)buffer;
  •        int bmp_w = pImage->width, bmp_h = pImage->height;
  •        FillBitmapInfo( bmi, bmp_w, bmp_h, pImage->depth*pImage->nChannels, pImage->origin );
  •      
  •        char *pBits=NULL;
  •        HBITMAP hBitmap=CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,(void**)&pBits,NULL,0);
  •        memcpy(pBits,pImage->imageData,pImage->imageSize);
  •        CBitmap *pBitmap=new CBitmap;
  •        pBitmap->Attach(hBitmap);
  •  
  •        return pBitmap;
  •     }
  •     else
  •        return NULL;
  • }
  •  
  • void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin)
  • {
  •     assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
  •  
  •     BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
  •  
  •     memset( bmih, 0, sizeof(*bmih));
  •     bmih->biSize = sizeof(BITMAPINFOHEADER);
  •     bmih->biWidth = width;
  •     bmih->biHeight = origin ? abs(height) : -abs(height);
  •     bmih->biPlanes = 1;
  •     bmih->biBitCount = (unsigned short)bpp;
  •     bmih->biCompression = BI_RGB;
  •  
  •     if( bpp == 8 )
  •     {
  •        RGBQUAD* palette = bmi->bmiColors;
  •        int i;
  •        for( i = 0; i < 256; i++ )
  •        {
  •         palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
  •         palette[i].rgbReserved = 0;
  •        }
  •     }
  • }
  •  
  • //2.CBitmap 2 IplImage
  • IplImage *CBitmap2IplImage(const CBitmap *pBitmap)
  • {
  •      DIBSECTION ds;
  •      pBitmap->GetObject(sizeof(ds),&ds);
  •      IplImage *pImage=cvCreateImage(cvSize(ds.dsBm.bmWidth,ds.dsBm.bmHeight),8,ds.dsBmih.biBitCount/8);
  •      memcpy(pImage->imageData,ds.dsBm.bmBits,pImage->imageSize);
  •      return pImage;
  • }
  •  
  • //3.HBITMAP 2 IplImage
  • IplImage* hBitmap2Ipl(HBITMAP hBmp)
  • {
  •     BITMAP bmp; 
  • ::GetObject(hBmp,sizeof(BITMAP),&bmp);//hBmp-->bmp
  • int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;
  • int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U; 
  • IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight),depth,nChannels); //cvCreateImageHeader
  • //pBuffer = (char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
  •     memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
  • IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,3);
  • cvCvtColor(img,dst,CV_BGRA2BGR);
  • cvReleaseImage(&img);
  • return dst;
  • }
  • //4.IplImage 2 HBITMAP
  • HBITMAP  IplImage2hBitmap(IplImage* pImg)
  • {
  • BYTE tmp[sizeof(BITMAPINFO)+1024];
  • BITMAPINFO *bmi = (BITMAPINFO*)tmp;
  • HBITMAP hBmp;
  • int i;
  • memset(bmi,0,sizeof(BITMAPINFO));
  • bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  • bmi->bmiHeader.biWidth = pImg->width;
  • bmi->bmiHeader.biHeight = pImg->height; 
  • bmi->bmiHeader.biPlanes = 1;
  • bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;
  • bmi->bmiHeader.biCompression = BI_RGB;
  • bmi->bmiHeader.biSizeImage = 0;//if biCompression is BI_RGB,this can be 0
  • bmi->bmiHeader.biClrImportant =0 ;
  • switch(pImg->nChannels * pImg->depth) 
  • case 8 : 
  • for(i=0 ; i < 256 ; i++){ 
  • bmi->bmiColors[i].rgbBlue = i;
  • bmi->bmiColors[i].rgbGreen= i;
  • bmi->bmiColors[i].rgbRed= i;
  • }
  • break;
  • case 32:
  • case 24: 
  • ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000;
  • ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00;
  • ((DWORD*) bmi->bmiColors)[2] = 0x000000FF;
  • break; 
  • hBmp = ::CreateDIBSection(NULL,bmi,DIB_RGB_COLORS,NULL,0,0);
  • SetDIBits(NULL,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);
  • return hBmp;
  • }
  • //5.HBITMAP 2  CBitmap
  • CBitmap HBITMAP2CBitmap(HBITMAP  hbitmap)
  • {
  • CBitmap   cbitmap;
  • cbitmap.Attach(hbitmap);
  • return cbitmap;
  • }
  • 6.CBitmap 2 HBITMAP
  • HBITMAP  CBitmap2HBITMAP(CBitmap bitmap )
  • {
  • HBITMAP bmp = HBITMAP(bitmap);
  • //bmp=(HBITMAP)bitmap.GetSafeHandle();
  • return bmp;
  • }
  • //7.BITMAP 2 CBitmap
  • CBitmap BITMAP2CBitmap(BITMAP   bmp)
  • {
  • CBitmap bitmap;
  • bitmap.GetBitmap(&bmp);
  • return bitmap;
  • }
  • //8.HBITMAP 2 BITMAP 
  • BITMAP HBITMAP2BITMAP(HBITMAP hBmp)
  • {
  • BITMAP bmp; 
  • ::GetObject(hBmp,sizeof(BITMAP),&bmp);//
  • return bmp;
  • }
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Bitmap转为iplimage代码 复制代码 收藏代码

  1. IplImage* BitmapToIplImage(HBITMAP hBmp)   
  2. {   
  3.     BITMAP bmp;       
  4.        
  5.     GetObject(hBmp, sizeof(BITMAP), &bmp);   
  6.     int depth     = (bmp.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;   
  7.     int nChannels = (bmp.bmBitsPixel == 1) ? 1 : bmp.bmBitsPixel/8;       
  8.        
  9.     IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight), depth, nChannels);     
  10.        
  11.     BYTE *pBuffer = new BYTE[bmp.bmHeight*bmp.bmWidth*nChannels];       
  12.     GetBitmapBits(hBmp, bmp.bmHeight*bmp.bmWidth*nChannels, pBuffer);   
  13.     memcpy(img->imageData, pBuffer, bmp.bmHeight*bmp.bmWidth*nChannels);      
  14.     delete pBuffer;   
  15.   
  16.     IplImage *dst = cvCreateImage(cvGetSize(img), img->depth,3);       
  17.     cvCvtColor(img, dst, CV_BGRA2BGR);      
  18.     cvReleaseImage(&img);      
  19.     return dst;   
  20. }  

 如果要从CBitmap转为IplImage,可以先将CBitmap转为BITMAP,再由BITMAP转为IplImage;

Cbitmap 转为 bitmap代码 复制代码 收藏代码

  1. // CBitmap 转为 BITMAP   
  2. CBitmap bitmap;   
  3. bitmap.LoadBitmap(IDB_BITMAP);   
  4. BITMAP   bmp;   
  5. bitmap.GetBitmap(&bmp);   
  6.   
  7. // CBitmap与HBITMAP间的转换   
  8. // CBitmap转为HBITMAP   
  9. CBitmap bitmap;   
  10. bitmap.LoadBitmap(IDB_BITMAP);   
  11. HBITMAP bmp = HBITMAP(bitmap);   
  12. // HBITMAP转为CBitmap   
  13. HBITMAP  hbitmap;     
  14. CBitmap   bitmap;   
  15. bitmap.Attach(hbitmap);  

转载于:https://my.oschina.net/u/1777508/blog/914444

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值