vc/mfc获取rgb图像数据后动态显示及保存图片的方法

时间:2023-03-09 01:00:14
vc/mfc获取rgb图像数据后动态显示及保存图片的方法

vc/mfc获取rgb图像数据后动态显示及保存图片的方法

该情况可用于视频通信中获取的位图数据回放显示或显示摄像头捕获的本地图像

第一种方法

#include<vfw.h>

加载 vfw32.lib  链接库

  1. //------------------------------设置位图头结构信息----------------------------------------------------------------------
  2. // Setup bmpinfo structure yourself
  3. m_bmpinfo=new BITMAPINFO;    // PBITMAPINFO *m_bmpinfo;
  4. //  m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  5. m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFO);
  6. m_bmpinfo->bmiHeader.biWidth=IMG_WIDTH;
  7. m_bmpinfo->bmiHeader.biHeight=IMG_HEIGHT;
  8. m_bmpinfo->bmiHeader.biPlanes=1;
  9. m_bmpinfo->bmiHeader.biBitCount=24;
  10. m_bmpinfo->bmiHeader.biCompression=0;
  11. m_bmpinfo->bmiHeader.biSizeImage=0;
  12. m_bmpinfo->bmiHeader.biXPelsPerMeter=0;
  13. m_bmpinfo->bmiHeader.biYPelsPerMeter=0;
  14. m_bmpinfo->bmiHeader.biClrUsed=0;
  15. m_bmpinfo->bmiHeader.biClrImportant=0;
  16. //-------------在内存中绘制位图头信息-----------------------------------------------------------------------------------
  17. // Initialize DIB for drawing...
  18. hdib=::DrawDibOpen();    // HDRAWDIB hdib;
  19. if(hdib!=NULL)
  20. {
  21. ::DrawDibBegin(hdib,
  22. m_hdc,
  23. -1,    // don't stretch
  24. -1,    // don't stretch
  25. &m_bmpinfo->bmiHeader,
  26. IMG_WIDTH,         // width of image
  27. IMG_HEIGHT,        // height of image
  28. 0
  29. );
  30. }
  31. //---------------绘制位图数据 buf--------------char* buf--------------------------------------------------------------------
  32. ::DrawDibDraw(hdib,
  33. m_hdc,
  34. local_wnd_x,  // dest : left pos
  35. local_wnd_y,  // dest : top pos
  36. -1,      // -1 don't zoom x
  37. -1,      // -1 don't zoom y
  38. &m_bmpinfo->bmiHeader, // bmp header info
  39. buf,      // bmp data
  40. 0,      // src :left
  41. 0,      // src :top
  42. IMG_WIDTH,     // src : width
  43. IMG_HEIGHT,     // src : height
  44. DDF_SAME_DRAW    // use prev params....
  45. );
  46. //------------------------------结束绘制---------------------------------------------------------------------
  47. // Close graphics....
  48. if(hdib!=NULL)
  49. {
  50. ::DrawDibEnd(hdib);
  51. ::DrawDibClose(hdib);
  52. }

//***********************************************

第二种方法

  1. BITMAPINFO *m_bmphdr;
  2. DWORD dwBmpHdr = sizeof(BITMAPINFO);
  3. m_bmphdr = new BITMAPINFO[dwBmpHdr];
  4. m_bmphdr->bmiHeader.biBitCount = 24;
  5. m_bmphdr->bmiHeader.biClrImportant = 0;
  6. m_bmphdr->bmiHeader.biSize = dwBmpHdr;
  7. m_bmphdr->bmiHeader.biSizeImage = 0;
  8. m_bmphdr->bmiHeader.biWidth = IMG_WIDTH;
  9. m_bmphdr->bmiHeader.biHeight = IMG_HEIGHT;
  10. m_bmphdr->bmiHeader.biXPelsPerMeter = 0;
  11. m_bmphdr->bmiHeader.biYPelsPerMeter = 0;
  12. m_bmphdr->bmiHeader.biClrUsed = 0;
  13. m_bmphdr->bmiHeader.biPlanes = 1;
  14. m_bmphdr->bmiHeader.biCompression = BI_RGB;
  15. int nResult = ::StretchDIBits(m_hdc,
  16. local_wnd_x,
  17. local_wnd_y,
  18. IMG_WIDTH,//rc.right - rc.left,
  19. IMG_HEIGHT,//rc.top,
  20. 0, 0,
  21. IMG_WIDTH, IMG_HEIGHT,
  22. buf,
  23. m_bmphdr,
  24. DIB_RGB_COLORS,
  25. SRCCOPY);

保存成bmp图片文件

    1. // 创建位图文件
    2. BOOL SaveBitmap(BYTE *pBuffer, long lBufferLen)
    3. {
    4. HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE,
    5. FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
    6. if (hf == INVALID_HANDLE_VALUE) return 0;
    7. // 写文件头
    8. BITMAPFILEHEADER fileheader;
    9. ZeroMemory(&fileheader, sizeof(BITMAPFILEHEADER));
    10. fileheader.bfType = 'MB';
    11. fileheader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+lBufferLen;
    12. fileheader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    13. DWORD dwWritter = 0;
    14. WriteFile(hf, &fileheader, sizeof(BITMAPFILEHEADER), &dwWritter, NULL);
    15. // 写文图格式
    16. BITMAPINFOHEADER infoHeader;
    17. ZeroMemory(&infoHeader, sizeof(BITMAPINFOHEADER));
    18. infoHeader.biSize = sizeof(BITMAPINFOHEADER);
    19. infoHeader.biSizeImage = lBufferLen;
    20. infoHeader.biWidth = lWidth;
    21. infoHeader.biHeight = lHeight;
    22. infoHeader.biBitCount = 24;
    23. WriteFile(hf, &infoHeader, sizeof(BITMAPINFOHEADER), &dwWritter, NULL);
    24. // 写位图数据
    25. WriteFile(hf, pBuffer, lBufferLen, &dwWritter, NULL);
    26. CloseHandle(hf);
    27. MessageBox(NULL, _T("Save bmp file succeed!"), _T("warn"), MB_OK|MB_ICONINFORMATION);
    28. return 0;
    29. }