我自己的技术还没到家,所以只讲怎么保存成bmp格式的位图文件。
一开始的时候我陷在整个屏幕截图的泥潭中,保存的图像总有好大一部分黑边。后来终于想
明白了。你想截取哪个窗口的图像,就找到那个窗口的DC (设备上下文),然后创建与之
兼容的DC,和与之大小的兼容位图,将DC复制到兼容的DC中,保存起来。陷在我想保存客
户区内的图像,那我就找到客户区的DC,然后将之整个的保存起来。
详细代码如下:
////////////////////////////////////////////////////////////////////////////////////////
//拷贝客户区的DC内容到兼容DC
///////////////////////////////////////////////////////////////////////////////////////
CDC *pDC=GetDC();
CRect rect;
GetClientRect(&rect);
CDC bmemDC;
bmemDC.CreateCompatibleDC(pDC);
CBitmap bmprect;
bmprect.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
bmemDC.SelectObject(&bmprect);
bmemDC.BitBlt(0,0,mbitmap.bmWidth,mbitmap.bmHeight,pDC,0,0,SRCCOPY);
/////////////////////////////////////////////////////////////////////////////////////////
//将位图信息填充到一个缓冲区内
////////////////////////////////////////////////////////////////////////////////////////
BITMAP mbitmap;
bmprect.GetBitmap(&mbitmap);
BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = mbitmap.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = mbitmap.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = mbitmap.bmWidthBytes * mbitmap.bmHeight;//图像数据大小
bih.biWidth = mbitmap.bmWidth;//宽度
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + mbitmap.bmWidthBytes * mbitmap.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;
byte * p = new byte[mbitmap.bmWidthBytes * mbitmap.bmHeight];//申请内存保存位图数据
GetDIBits(bmemDC.m_hDC, (HBITMAP) bmprect.m_hObject, 0, rect.Height(), p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据
///////////////////////////////////////////////////////////////////////////////////////////
//文件保存对话框,保存文件
//////////////////////////////////////////////////////////////////////////////////////////////
CString strFileName,strszFilter;
strszFilter="位图文件(*.bmp)|*.bmp|全部文件(*.*)|*.*||";
CFileDialog bmpdlg(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strszFilter,NULL);
if(IDOK == bmpdlg.DoModal())
{
strFileName = bmpdlg.GetFileName();
strFileName +=".bmp";
char filename[MAX_PATH];
strcpy(filename,strFileName);
FILE *fp = fopen(filename, "w+b");
fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头
fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头
fwrite(p, 1, mbitmap.bmWidthBytes * mbitmap.bmHeight, fp);//写入位图数据
fclose(fp);
}
delete [] p;