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

来源:互联网 发布:删除旧版windows 编辑:程序博客网 时间:2024/06/06 09:15
 

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

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

第一种方法

#include<vfw.h>

加载 vfw32.lib  链接库

//------------------------------设置位图头结构信息----------------------------------------------------------------------// Setup bmpinfo structure yourself   m_bmpinfo=new BITMAPINFO;    // PBITMAPINFO *m_bmpinfo;//  m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);  m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFO);  m_bmpinfo->bmiHeader.biWidth=IMG_WIDTH;  m_bmpinfo->bmiHeader.biHeight=IMG_HEIGHT;  m_bmpinfo->bmiHeader.biPlanes=1;  m_bmpinfo->bmiHeader.biBitCount=24;  m_bmpinfo->bmiHeader.biCompression=0;  m_bmpinfo->bmiHeader.biSizeImage=0;  m_bmpinfo->bmiHeader.biXPelsPerMeter=0;  m_bmpinfo->bmiHeader.biYPelsPerMeter=0;  m_bmpinfo->bmiHeader.biClrUsed=0;  m_bmpinfo->bmiHeader.biClrImportant=0;//-------------在内存中绘制位图头信息-----------------------------------------------------------------------------------// Initialize DIB for drawing... hdib=::DrawDibOpen();    // HDRAWDIB hdib; if(hdib!=NULL) {    ::DrawDibBegin(hdib,        m_hdc,        -1,    // don't stretch        -1,    // don't stretch        &m_bmpinfo->bmiHeader,        IMG_WIDTH,         // width of image        IMG_HEIGHT,        // height of image        0            ); }//---------------绘制位图数据 buf--------------char* buf-------------------------------------------------------------------- ::DrawDibDraw(hdib,      m_hdc,      local_wnd_x,  // dest : left pos      local_wnd_y,  // dest : top pos      -1,      // -1 don't zoom x      -1,      // -1 don't zoom y      &m_bmpinfo->bmiHeader, // bmp header info      buf,      // bmp data      0,      // src :left      0,      // src :top      IMG_WIDTH,     // src : width      IMG_HEIGHT,     // src : height      DDF_SAME_DRAW    // use prev params....      );//------------------------------结束绘制--------------------------------------------------------------------- // Close graphics.... if(hdib!=NULL) { ::DrawDibEnd(hdib); ::DrawDibClose(hdib); }


 

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

第二种方法

 

BITMAPINFO *m_bmphdr; DWORD dwBmpHdr = sizeof(BITMAPINFO); m_bmphdr = new BITMAPINFO[dwBmpHdr]; m_bmphdr->bmiHeader.biBitCount = 24; m_bmphdr->bmiHeader.biClrImportant = 0; m_bmphdr->bmiHeader.biSize = dwBmpHdr; m_bmphdr->bmiHeader.biSizeImage = 0; m_bmphdr->bmiHeader.biWidth = IMG_WIDTH; m_bmphdr->bmiHeader.biHeight = IMG_HEIGHT; m_bmphdr->bmiHeader.biXPelsPerMeter = 0; m_bmphdr->bmiHeader.biYPelsPerMeter = 0; m_bmphdr->bmiHeader.biClrUsed = 0; m_bmphdr->bmiHeader.biPlanes = 1; m_bmphdr->bmiHeader.biCompression = BI_RGB; int nResult = ::StretchDIBits(m_hdc,  local_wnd_x,  local_wnd_y,  IMG_WIDTH,//rc.right - rc.left,  IMG_HEIGHT,//rc.top,  0, 0,  IMG_WIDTH, IMG_HEIGHT,  buf,  m_bmphdr,  DIB_RGB_COLORS,  SRCCOPY);

保存成bmp图片文件

// 创建位图文件BOOL SaveBitmap(BYTE *pBuffer, long lBufferLen){HANDLE hf = CreateFile(m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);if (hf == INVALID_HANDLE_VALUE) return 0;// 写文件头BITMAPFILEHEADER fileheader;ZeroMemory(&fileheader, sizeof(BITMAPFILEHEADER));fileheader.bfType = 'MB';fileheader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+lBufferLen;fileheader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);DWORD dwWritter = 0;WriteFile(hf, &fileheader, sizeof(BITMAPFILEHEADER), &dwWritter, NULL);// 写文图格式BITMAPINFOHEADER infoHeader;ZeroMemory(&infoHeader, sizeof(BITMAPINFOHEADER));infoHeader.biSize = sizeof(BITMAPINFOHEADER);infoHeader.biSizeImage = lBufferLen;infoHeader.biWidth = lWidth;infoHeader.biHeight = lHeight;infoHeader.biBitCount = 24;WriteFile(hf, &infoHeader, sizeof(BITMAPINFOHEADER), &dwWritter, NULL);// 写位图数据WriteFile(hf, pBuffer, lBufferLen, &dwWritter, NULL);CloseHandle(hf);MessageBox(NULL, _T("Save bmp file succeed!"), _T("warn"), MB_OK|MB_ICONINFORMATION);return 0;}