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

 

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;
	}



 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页