aihot  2017-06-03 08:47:28  OpenCV |   查看评论   

 

  1. // HBITMAP 转换IplImage

  2. IplImage* hBitmap2Ipl(HBITMAP hBmp)

  3. {

  4. BITMAP bmp;

  5. ::GetObject(hBmp,sizeof(BITMAP),&bmp);

  6. int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;

  7. int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;

  8. IplImage* img = cvCreateImageHeader( cvSize(bmp.bmWidth, bmp.bmHeight)

  9. , depth, nChannels );

  10. img->imageData =

  11. (char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));

  12. memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);

  13. return img;

  14. }

  15.  

  16. void createDIB(IplImage* &pict){

  17. IplImage * Red=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),

  18. IPL_DEPTH_8U, 1 );

  19. IplImage * Green=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),

  20. IPL_DEPTH_8U, 1 );

  21. IplImage * Blue=cvCreateImage( cvSize(IMAGE_WIDTH,IMAGE_HEIGHT),

  22. IPL_DEPTH_8U, 1 );

  23. cvSetImageCOI( pict, 3);

  24. cvCopy(pict,Red);

  25. cvSetImageCOI( pict, 2);

  26. cvCopy(pict,Green);

  27. cvSetImageCOI(pict, 1);

  28. cvCopy(pict,Blue);

  29. //Initialize the BMP display buffer

  30. bmi = (BITMAPINFO*)buffer;

  31. bmih = &(bmi->bmiHeader);

  32. memset( bmih, 0, sizeof(*bmih));

  33. bmih->biSize = sizeof(BITMAPINFOHEADER);

  34. bmih->biWidth = IMAGE_WIDTH;

  35. bmih->biHeight = IMAGE_HEIGHT; // -IMAGE_HEIGHT;

  36. bmih->biPlanes = 1;

  37. bmih->biCompression = BI_RGB;

  38. bmih->biBitCount = 24;

  39. palette = bmi->bmiColors;

  40. for( int i = 0; i < 256; i++ ){

  41. palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed =

  42. (BYTE)i;

  43. palette[i].rgbReserved = 0;

  44. }

  45. cvReleaseImage(&Red);

  46. cvReleaseImage(&Green);

  47. cvReleaseImage(&Blue);

  48. }

  49.  

  50. // HBITMAP转换DIB

  51. HBITMAP plIamgeToDIB(IplImage *pImg,int Size)  

  52. {  

  53.     HDC hDC = ::CreateCompatibleDC(0);  

  54.     BYTE tmp[sizeof(BITMAPINFO)+255*4];  

  55.     BITMAPINFO *bmi = (BITMAPINFO*)tmp;  

  56.     HBITMAP hBmp;  

  57.     int i;  

  58.     memset(bmi,0,sizeof(BITMAPINFO));  

  59.     bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  

  60.     bmi->bmiHeader.biWidth = pImg->width;  

  61.     bmi->bmiHeader.biHeight = -pImg->height;  

  62.     bmi->bmiHeader.biPlanes = Size;  

  63.     bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;  

  64.  

  65.     bmi->bmiHeader.biCompression = BI_RGB;  

  66.     bmi->bmiHeader.biSizeImage = pImg->width*pImg->height*1;  

  67.     bmi->bmiHeader.biClrImportant =0 ;  

  68.     switch(pImg->nChannels * pImg->depth)  

  69.     {  

  70.     case 8 :  

  71.     for(i=0 ; i < 256 ; i++)  

  72.     {  

  73.     bmi->bmiColors[i].rgbBlue = i;  

  74.     bmi->bmiColors[i].rgbGreen= i;  

  75.     bmi->bmiColors[i].rgbRed= i;  

  76.     }  

  77.     break;  

  78.     case 32:  

  79.     case 24:  

  80.     ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000; /* red mask */ 

  81.     ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00; /* green mask */ 

  82.     ((DWORD*) bmi->bmiColors)[2] = 0x000000FF; /* blue mask */ 

  83.     break;  

  84.     }  

  85.     hBmp = ::CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,NULL,0,0);  

  86.     SetDIBits(hDC,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);  

  87.     ::DeleteDC(hDC);  

  88. return hBmp;  

  89.  

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自十、HBITMAP 转换IplImage、IplImage转换为DIB(OpenCV学习笔记)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]