VC屏幕截图,保存为Bmp文件
新建一个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文件相关推荐
- [Win] 利用Memory DC抽取EXE的图标并保存为BMP文件
预告篇- 由于时间比较紧.下次等整理好再放上来吧. 大致过程就是 创建窗口句柄->得到HDC->创建MEMDC->再copy数据->最后显示或者保存为BMP文件, 转载于:ht ...
- 【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
转自:https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍: DCMTK是目前最全面实现DICOM3.0标准的开源库,通过 ...
- 截取屏幕并保存为BMP文件
CDC *pDC;//屏幕DCpDC = CDC::FromHandle( ::GetDC(NULL) );//获取当前整个屏幕DCint BitPerPixel = pDC->GetDevic ...
- android 二进制流保存为bmp文件
不同的图片读取像素可能不同,要根据自己需要的像素进行提取,因此函数 private byte[] addBMP_RGB_888(int[] b,int w, int h)需要更改.注意,调色表可有可无 ...
- VC屏幕截图并保存为bmp文件
保存抓图的简单实现 实现类似的抓屏功能(简单的截图功能 ) 其实只要两个函数就行了,以下从网上摘抄的一段代码的改写, 算是原创吧 (http://www.wenyiwen.cn/a24/how1614 ...
- 截取屏幕指定区域保存为BMP文件
HBITMAP CopyScreenToBitmap(LPRECT lpRect) { //屏幕和内存设备描述表 HDC hSrcDC, hMemDC; //位图句柄 HBITMAP hBitmap, ...
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...
- C语言生成BMP文件
C 语言生成BMP 文件 针对这个话题其实可以分解为两个议题,一个是 BMP 文件的格式,一个是 C语言如何操作文件. BMP 文件格式 BMP 是微软在 windows 系统中使用的一种位图图像格式 ...
- BMP文件解析及显示
我们在LCD上显示内容的时候,经常会有显示bmp文件的需求,例如显示一个logo.菜单图标等.我们可以在应用程序中打开bmp文件,然后将它解析成rgb格式的数据写入frame buffer中就可以完成 ...
最新文章
- win8计算机上工具选项在哪,Win8.1在开始菜单中找不到“便笺”工具如何恢复
- 怎么解决深入学习PHP的瓶颈?
- 为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
- sprint冲刺计划第三天团队任务
- 爱情三十一课,先信自己
- html中表格与字对齐,html – 中心与表格单元格对齐
- 4.2号 作业讲解
- php6.2手机端网站,网站开发-php开发手机论坛(6)-登陆注册(2)
- xcode 获取模拟器app沙盒路径_使用Xcode12进行App内购测试
- oppo9s刷机教程_OPPO R9s 目前最简单的刷Recovery ROOT 方法,强烈推荐
- c语言中shift的作用,Shift是什么意思?Shift键都有什么作用?
- 华为到底玩的哪些汽车技术?
- 美大学推开源赞助计划 DIY机器人你也办得到
- lg kv510 java_为妇女节献礼 精美天翼手机 LG KV510评测
- 手机电话号码吉凶查询原理及ASP算法源码 转
- mysql面试题:什么是存储过程?用什么来调用?
- 新手避坑,这几种类型的入门吉他,初学者千万不要买!【吉他选购指南】
- 广州招聘会12月一览表.
- UI设计师工作流程详解,让你充分了解UI设计师
- 本科毕业论文不会写怎么办?