当前位置: 首页 > news >正文

MFC 截取对话框生成图片、截取整个屏幕(可取黑白反色或者整体图片取反色)

HWND hwnd = ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc = ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));//截整个屏幕,用这句int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);int iWidth = rc.Width();int iHeight = rc.Height();int pointx = rcw.left;int pointy = rcw.top;CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap memBitmap, *oldBitmap;memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);oldBitmap = memDC.SelectObject(&memBitmap);memDC.BitBlt(0, 0, iWidth, iHeight, &dc, pointx, pointy, SRCCOPY);BITMAP bmp;memBitmap.GetBitmap(&bmp);FILE *fp = fopen("test22222.bmp", "wb");BITMAPINFOHEADER bih;memset(&bih, 0, sizeof(bih));bih.biBitCount = bmp.bmBitsPixel;bih.biCompression = BI_RGB;//表示不压缩bih.biHeight = bmp.bmHeight;bih.biPlanes = 1;//位平面数,必须为1bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;bih.biWidth = bmp.bmWidth;BITMAPFILEHEADER bfh;memset(&bfh, 0, sizeof(bfh));bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;bfh.bfType = (WORD)0x4d42;//必须表示"BM"fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);fwrite(&bih, 1, sizeof(bih), fp);byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);delete[] p;fclose(fp);memDC.SelectObject(oldBitmap);

取反色代码

HWND hwnd = ::GetDesktopWindow();//截整个屏幕,用从这往下4句HDC hdc = ::GetDC(hwnd);CDC dc;dc.Attach(hdc);CRect rc,rcw;GetWindowRect(&rcw);GetClientRect(&rc);//只截对话框,用这句//rc.SetRect(0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));//截整个屏幕,用这句int iBitPerPixel = dc.GetDeviceCaps(BITSPIXEL);int iWidth = rc.Width();int iHeight = rc.Height();int pointx = rcw.left;int pointy = rcw.top;CDC memDC;memDC.CreateCompatibleDC(&dc);memDC.SetROP2(R2_NOT);CBitmap memBitmap, *oldBitmap;memBitmap.CreateCompatibleBitmap(&dc, iWidth, iHeight);oldBitmap = memDC.SelectObject(&memBitmap);memDC.BitBlt(0,0 , iWidth, iHeight, &dc, pointx, pointy, SRCCOPY);BITMAP bmp;memBitmap.GetBitmap(&bmp);FILE *fp = fopen("Data\\test22222.bmp", "wb");BITMAPINFOHEADER bih;memset(&bih, 0, sizeof(bih));bih.biBitCount = bmp.bmBitsPixel;bih.biCompression = BI_RGB;//表示不压缩bih.biHeight = bmp.bmHeight;bih.biPlanes = 1;//位平面数,必须为1bih.biSize = sizeof(BITMAPINFOHEADER);bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;bih.biWidth = bmp.bmWidth;BITMAPFILEHEADER bfh;memset(&bfh, 0, sizeof(bfh));bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;bfh.bfType = (WORD)0x4d42;//必须表示"BM"fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);fwrite(&bih, 1, sizeof(bih), fp);byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];GetDIBits(memDC.m_hDC, (HBITMAP)memBitmap.m_hObject, 0, iHeight, p, (LPBITMAPINFO)&bih, DIB_RGB_COLORS);int pixels = bmp.bmWidth *bmp.bmHeight;//for (int i = 0; i < pixels; i++)// 整体取反色//{//	BYTE red = p[i * 4];//	BYTE green = p[i * 4 + 1];//	BYTE blue = p[i * 4 + 2];//	p[i * 4] = 255 - red;//	p[i * 4 + 1] = 255 - green;//	p[i * 4 + 2] = 255 - blue;//}// 黑取白for (int i = 0; i < pixels; i++){BYTE red = p[i * 4];BYTE green = p[i * 4 + 1];BYTE blue = p[i * 4 + 2];if (red == 0 && green == 0 && blue == 0) {p[i * 4] = 255 - red;p[i * 4 + 1] = 255 - green;p[i * 4 + 2] = 255 - blue;}}fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);delete[] p;fclose(fp);memDC.SelectObject(oldBitmap);

相关文章:

  • postcss安装和使用
  • Java基础【正则表达式】
  • 分类预测 | Matlab实现CNN-BiLSTM-Mutilhead-Attention卷积双向长短期记忆网络多头注意力机制多特征分类预测
  • 【LeetCode热题100】394. 字符串解码(栈)
  • 保障校园网络安全用堡垒机的几个原因分析
  • 武汉星起航:深化跨境电商理解,一站式服务助力合作伙伴稳健发展
  • Spark部署详细教程
  • python基于django的高校迎新系统 flask新生报到系统
  • c++ 堆栈内存、引用和指针 - 学习总结
  • 网络时间同步设备(时间同步系统)操作及应用方案
  • 用静态工厂方法代替构造器
  • 11.子串简写
  • 【行业颠覆者】桔数安康签约首发,开创养老服务新篇章!
  • 数字化接口、网络身份证实名认证接口、C#实名认证接口说明示例
  • 微服务篇-C 深入理解第一代微服务(SpringCloud)_VII 深入理解Swagger接口文档可视化管理工具
  • 《Java编程思想》读书笔记-对象导论
  • ES6系列(二)变量的解构赋值
  • github从入门到放弃(1)
  • Git同步原始仓库到Fork仓库中
  • iOS | NSProxy
  • Java比较器对数组,集合排序
  • JS实现简单的MVC模式开发小游戏
  • node 版本过低
  • Vue小说阅读器(仿追书神器)
  • webpack入门学习手记(二)
  • 创建一个Struts2项目maven 方式
  • 那些被忽略的 JavaScript 数组方法细节
  • 浅谈web中前端模板引擎的使用
  • 实战|智能家居行业移动应用性能分析
  • 在Unity中实现一个简单的消息管理器
  • raise 与 raise ... from 的区别
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​低代码平台的核心价值与优势
  • ​香农与信息论三大定律
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #laravel 通过手动安装依赖PHPExcel#
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax()
  • (02)vite环境变量配置
  • (安卓)跳转应用市场APP详情页的方式
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (转)c++ std::pair 与 std::make
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET成年了,然后呢?
  • @31省区市高考时间表来了,祝考试成功
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [AX]AX2012 AIF(四):文档服务应用实例