Ipl2DIB.cpp
上传用户:zhaobiao
上传日期:2013-10-27
资源大小:92k
文件大小:3k
源码类别:

OpenCV

开发平台:

Visual C++

  1. // Ipl2DIB.cpp: implementation of the CIpl2DIB class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. //#include "Ipl2ImgTest2.h"
  6. #include "Ipl2DIB.h"
  7. #define CImage CvvImage 
  8. #ifdef _DEBUG
  9. #undef THIS_FILE
  10. static char THIS_FILE[]=__FILE__;
  11. #define new DEBUG_NEW
  12. #endif
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CIpl2DIB::CIpl2DIB(HWND hWnd)
  17. {
  18. m_HDC = ::GetDC(hWnd);
  19. m_hWnd = hWnd;
  20. m_Rect.SetRect(0,0,320,240);
  21. }
  22. CIpl2DIB::~CIpl2DIB()
  23. {
  24. ReleaseDC(m_hWnd,m_HDC);
  25. }
  26. void CIpl2DIB::SetRegin(CRect Rect)
  27. {
  28. m_Rect = Rect;
  29. }
  30. HBITMAP CIpl2DIB::IplImage2DIB(const IplImage *Image)
  31. {
  32. int bpp = Image->nChannels * 8;
  33. assert(Image->width >= 0 && Image->height >= 0 &&
  34. (bpp == 8 || bpp == 24 || bpp == 32));
  35. CvMat dst;
  36. void* dst_ptr = 0;
  37. HBITMAP hbmp = NULL;
  38. unsigned char buffer[sizeof(BITMAPINFO) + 255*sizeof(RGBQUAD)];
  39. BITMAPINFO* bmi = (BITMAPINFO*)buffer;
  40. BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
  41. ZeroMemory(bmih, sizeof(BITMAPINFOHEADER));
  42. bmih->biSize = sizeof(BITMAPINFOHEADER);
  43. bmih->biWidth = Image->width;
  44. bmih->biHeight = Image->origin ? abs(Image->height) :
  45. -abs(Image->height);
  46. bmih->biPlanes = 1;
  47. bmih->biBitCount = bpp;
  48. bmih->biCompression = BI_RGB;
  49. if (bpp == 8) {
  50. RGBQUAD* palette = bmi->bmiColors;
  51. int i;
  52. for (i = 0; i < 256; i++) {
  53. palette[i].rgbRed = palette[i].rgbGreen = palette[i].rgbBlue
  54. = (BYTE)i;
  55. palette[i].rgbReserved = 0;
  56. }
  57. }
  58. hbmp = CreateDIBSection(NULL, bmi, DIB_RGB_COLORS, &dst_ptr, 0, 0);
  59. //int pix_size = CV_ELEM_SIZE(CV_8UC1);
  60. cvInitMatHeader(&dst, Image->height, Image->width, CV_8UC1,
  61. dst_ptr, (Image->width * Image->nChannels + 3) & -4);
  62. cvConvertImage(Image, &dst, 0/*Image->origin ? CV_CVTIMG_FLIP : 0*/);
  63. return hbmp;
  64. }
  65. void CIpl2DIB::Display(const IplImage *Image,BOOL stretch)
  66. {
  67. HBITMAP hBmp;
  68. if(!stretch)
  69. {
  70. m_Rect.SetRect(m_Rect.left,m_Rect.top,Image->width,Image->height);
  71. }
  72. hBmp = IplImage2DIB(Image);
  73. HDC hMemDC = CreateCompatibleDC(m_HDC); 
  74. HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hBmp); 
  75. //BitBlt(m_HDC, m_Rect.left, m_Rect.top, m_Rect.right,m_Rect.bottom, hMemDC, 0, 0, SRCCOPY); 
  76. StretchBlt(m_HDC,m_Rect.left, m_Rect.top, m_Rect.right,m_Rect.bottom, hMemDC, 0, 0, Image->width,Image->height,SRCCOPY);
  77. SelectObject(hMemDC, hOldBmp);
  78. DeleteObject(hBmp); 
  79. DeleteDC(hMemDC); 
  80. }