新建一个MFC基于对话框的应用程序,在界面上放一个Button,为其实现点击事件,代码如下:

void CScreenShotDlg::OnBtnScreenshot()
{RECT rect = {0, 0, 1900, 1000};HBITMAP hbmp = CopyScreenToBitmap(&rect);SaveBitmapToFile(hbmp, "a.bmp");MessageBox("Save bmp file Successful");
}

被调用的这两个函数实现如下:

HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{HDC hScrDC, hMemDC;                // 屏幕和内存设备描述表HBITMAP hBitmap, hOldBitmap;   // 位图句柄int nX, nY, nX2, nY2;            // 选定区域坐标int nWidth, nHeight;           // 位图宽度和高度int xScrn, yScrn;             // 屏幕分辨率if (IsRectEmpty(lpRect))return NULL;hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);      // 为屏幕创建设备描述表hMemDC = CreateCompatibleDC(hScrDC);              // 为屏幕设备描述表创建兼容的内存设备描述表nX = lpRect->left;nY = lpRect->top;nX2 = lpRect->right;nY2 = lpRect->bottom;xScrn = GetDeviceCaps(hScrDC, HORZRES); // 获得屏幕水平分辨率yScrn = GetDeviceCaps(hScrDC, VERTRES);if (nX < 0)nX = 0;if (nY < 0)nY = 0;if (nX2 > xScrn)nX2 = xScrn;if (nY2 > yScrn)nY2 = yScrn;nWidth = nX2 - nX;nHeight = nY2 - nY;hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);      // 创建一个与屏幕设备描述表兼容的位图hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);           // 把新位图选到内存设备描述表中BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);    // 把屏幕设备描述表拷贝到内存设备描述表中hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);         // 得到屏幕位图的句柄DeleteDC(hScrDC);DeleteDC(hMemDC);return hBitmap;
}/*lpFileName: 位图文件名
*/
BOOL SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{HDC hDC;                       // 设备描述表int iBits;                      // 当前显示分辨率下每个像素所占字节数WORD wBitCount;                 // 位图中每个像素所占字节数DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;    // 调色板大小,位图数据大小,位图文件大小,写入文件字节数BITMAP Bitmap;                   //位图属性结构BITMAPFILEHEADER bmfHdr;        // 位图文件头BITMAPINFOHEADER bi;            // 位图信息头LPBITMAPINFOHEADER lpbi;        // 指向位图信息头结构HANDLE fh, hDib;                // 定义文件,分配内存句柄HPALETTE hPal, hOldPal=NULL;  // 调色板句柄// 计算位图文件每个像素所占字节数hDC = CreateDC("DISPLAY", NULL, NULL, NULL);iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);DeleteDC(hDC);if (iBits <= 1)wBitCount = 1;else if (iBits <= 4)wBitCount = 4;else if (iBits <= 8)wBitCount = 8;else if (iBits <= 24)wBitCount = 24;elsewBitCount = 32;if (wBitCount <= 8)dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);       // 计算调色板大小// 设置位图信息头结构GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = Bitmap.bmWidth;bi.biHeight = Bitmap.bmHeight;bi.biPlanes = 1;bi.biBitCount = wBitCount;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));    // 为位图内容分配内存lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);*lpbi = bi;// 处理调色板hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);if (hPal){hDC = GetDC(NULL);hOldPal = SelectPalette(hDC, hPal, FALSE);RealizePalette(hDC);}// 获取该调色板下新的像素值GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);if (hOldPal)              // 恢复调色板{SelectPalette(hDC, hOldPal, TRUE);RealizePalette(hDC);ReleaseDC(NULL, hDC);}// 创建位图文件 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return FALSE;// 设置位图文件头bmfHdr.bfType = 0x4D42;        // 文件类型: "BM"dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; bmfHdr.bfSize = dwDIBSize;  // 位图文件大小bmfHdr.bfReserved1 = 0;bmfHdr.bfReserved2 = 0;bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); // 写入位图文件头WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);                  // 写入位图文件其余内容GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return TRUE;
}

VC屏幕截图,保存为Bmp文件相关推荐

  1. [Win] 利用Memory DC抽取EXE的图标并保存为BMP文件

    预告篇- 由于时间比较紧.下次等整理好再放上来吧. 大致过程就是 创建窗口句柄->得到HDC->创建MEMDC->再copy数据->最后显示或者保存为BMP文件, 转载于:ht ...

  2. 【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

    转自:https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍: DCMTK是目前最全面实现DICOM3.0标准的开源库,通过 ...

  3. 截取屏幕并保存为BMP文件

    CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...

  4. android 二进制流保存为bmp文件

    不同的图片读取像素可能不同,要根据自己需要的像素进行提取,因此函数 private byte[] addBMP_RGB_888(int[] b,int w, int h)需要更改.注意,调色表可有可无 ...

  5. VC屏幕截图并保存为bmp文件

    保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能 ) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how1614 ...

  6. 截取屏幕指定区域保存为BMP文件

    HBITMAP CopyScreenToBitmap(LPRECT lpRect) { //屏幕和内存设备描述表 HDC hSrcDC, hMemDC; //位图句柄 HBITMAP hBitmap, ...

  7. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

  8. C语言生成BMP文件

    C 语言生成BMP 文件 针对这个话题其实可以分解为两个议题,一个是 BMP 文件的格式,一个是 C语言如何操作文件. BMP 文件格式 BMP 是微软在 windows 系统中使用的一种位图图像格式 ...

  9. BMP文件解析及显示

    我们在LCD上显示内容的时候,经常会有显示bmp文件的需求,例如显示一个logo.菜单图标等.我们可以在应用程序中打开bmp文件,然后将它解析成rgb格式的数据写入frame buffer中就可以完成 ...

最新文章

  1. win8计算机上工具选项在哪,Win8.1在开始菜单中找不到“便笺”工具如何恢复
  2. 怎么解决深入学习PHP的瓶颈?
  3. 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
  4. sprint冲刺计划第三天团队任务
  5. 爱情三十一课,先信自己
  6. html中表格与字对齐,html – 中心与表格单元格对齐
  7. 4.2号 作业讲解
  8. php6.2手机端网站,网站开发-php开发手机论坛(6)-登陆注册(2)
  9. xcode 获取模拟器app沙盒路径_使用Xcode12进行App内购测试
  10. oppo9s刷机教程_OPPO R9s 目前最简单的刷Recovery ROOT 方法,强烈推荐
  11. c语言中shift的作用,Shift是什么意思?Shift键都有什么作用?
  12. 华为到底玩的哪些汽车技术?
  13. 美大学推开源赞助计划 DIY机器人你也办得到
  14. lg kv510 java_为妇女节献礼 精美天翼手机 LG KV510评测
  15. 手机电话号码吉凶查询原理及ASP算法源码 转
  16. mysql面试题:什么是存储过程?用什么来调用?
  17. 新手避坑,这几种类型的入门吉他,初学者千万不要买!【吉他选购指南】
  18. 广州招聘会12月一览表.
  19. UI设计师工作流程详解,让你充分了解UI设计师
  20. 本科毕业论文不会写怎么办?

热门文章

  1. 分享:wkhtmltoimage开源工具的基本应用
  2. 按任意的字段旋转的存储过程
  3. 请不要更多的基本情节
  4. Pytorch框架中SGD&Adam优化器以及BP反向传播入门思想及实现
  5. leetcode310. 最小高度树(bfs)
  6. leetcode96. 不同的二叉搜索树(动态规划)
  7. 顶尖科技棋牌游戏开发_如何接受顶尖科技公司的采访
  8. aws cognito_使用AWS Cognito的用户管理—(1/3)初始设置
  9. 异常检测机器学习_使用机器学习检测异常
  10. sqlserver 批量处理数据