⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 保存位图.txt

📁 保存内存中的位图到磁盘上,程序还可以抓取整个屏幕或才是某个窗口
💻 TXT
字号:
 
 
 
 #include <math.h>
void CSaveBitmap::SaveBitmap(HWND hwnd,CString strSaveFile)
{
 CBitmap *pBitmapOld,bitmap;
 CDC cdc,memdc;
 CRect rect;
 /*
 if(hwnd)
  ::GetWindowRect(hwnd,&rect);
    else
  GetWindowRect(hwnd,rect);
 */
 int width = ::GetSystemMetrics(SM_CXSCREEN);
 int height = ::GetSystemMetrics(SM_CYSCREEN);
 
 HDC hdc = ::CreateDC("DISPLAY",NULL,NULL,NULL);
 HDC hmemdc;
 cdc.Attach(hdc);
 hmemdc = ::CreateCompatibleDC(NULL);
 memdc.Attach(hmemdc);
 bitmap.CreateCompatibleBitmap(&cdc,width,height);
 pBitmapOld = memdc.SelectObject(&bitmap);
 memdc.BitBlt(0,0,width,height,&cdc,0,0,SRCCOPY);
 memdc.SelectObject(pBitmapOld);
 CFile file(strSaveFile,CFile::modeCreate|CFile::modeWrite);
 
 BITMAP bInfo;
 bitmap.GetBitmap(&bInfo);
 
 //计算调色板大小
 
 int panelsize = 0;
 
 if (bInfo.bmBitsPixel<24) //非真彩色
 {
  panelsize = (int)pow(2,bInfo.bmBitsPixel)*sizeof(RGBQUAD); 
 }
 //定义位图信息
 BITMAPINFO*  bMapInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
 bMapInfo->bmiHeader.biBitCount = bInfo.bmBitsPixel;
 bMapInfo->bmiHeader.biClrImportant = 0;
 bMapInfo->bmiHeader.biCompression = 0;
 bMapInfo->bmiHeader.biHeight = bInfo.bmHeight;
 bMapInfo->bmiHeader.biPlanes = bInfo.bmPlanes;
 bMapInfo->bmiHeader.biSize = sizeof(BITMAPINFO);
 bMapInfo->bmiHeader.biSizeImage = bInfo.bmHeight*bInfo.bmWidthBytes;
 bMapInfo->bmiHeader.biWidth = bInfo.bmWidth;
 bMapInfo->bmiHeader.biXPelsPerMeter = 0;
 bMapInfo->bmiHeader.biYPelsPerMeter = 0;
 //获取位图的实际数据
 char* pData = new char[bMapInfo->bmiHeader.biSizeImage];
 int len = GetDIBits(hdc,bitmap,0,bInfo.bmHeight,pData,bMapInfo,DIB_RGB_COLORS);
 BITMAPFILEHEADER bFileHeader;
 bFileHeader.bfType = 0x4D42;
 bFileHeader.bfReserved1 = 0;
 bFileHeader.bfReserved2 = 0;
 bFileHeader.bfSize = sizeof(BITMAPFILEHEADER); 
 bFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+panelsize;
 
 //向文件中写入位图数据
 file.WriteHuge(&bFileHeader,sizeof(BITMAPFILEHEADER));
 file.WriteHuge(&bMapInfo->bmiHeader,sizeof(BITMAPINFOHEADER));
 file.WriteHuge(pData,bMapInfo->bmiHeader.biSizeImage+panelsize);
 file.Close();
 delete pData;
 LocalFree(bMapInfo);
 
 bitmap.DeleteObject();
 cdc.DeleteDC();
 memdc.DeleteDC();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -