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