微信公众号“dotnet跨平台”中的文章《一个基于.Net开发的Windows截屏录制工具》介绍了基于.net framework4.8开发的支持屏幕截图、录屏等功能的开源项目ShareX,其主界面如下图所示,其GitHub地址和官网见参考文献2-3。
  针对IronOCR,之前的文章实现了从本地加载图片从圈选带文字的区域后调用IronOCR识别文字,为了进一步拓展IronOCR的应用,本文学习ShareX开源项目中截图功能的实现方式,然后尝试将截图功能移植到圈选图片识别文本的程序内,最终实现能动态截图并从截图中圈选文字进行识别。

  ShareX支持以下几种截图方式,其中全屏功能是指自动截取主屏幕桌面区域的截图(可以配置是否隐藏ShareX窗口、隐藏屏幕虚拟区域等),窗口功能是指截取屏幕中的指定进程的窗口截图(ShareX程序通过调用Windows系统的EnumWindows函数枚举屏幕中的顶层窗口,并动态生成窗口菜单的子菜单)、显示器功能是指多屏情况下截取指定屏幕的截图、矩形区域功能类似于windows自带的截图工具。本文中主要梳理并学习全屏及矩形区域功能的实现方式。

  抽象类CaptureBase用于定义截图操作的基本属性和基本功能,其共有七个子类,其中CaptureFullscreen类用于全屏截图,CaptureRegion类用于区域截图。

  ShareX主窗口菜单中的全屏菜单的响应函数仅包括一句代码,如下所示。但其内部逻辑是调用System.Windows.Forms.Screen 类获取显示器的工作区( 工作区是显示器的桌面区域,不包括任务栏、停靠窗口和停靠工具栏)。然后创建Screenshot类,设置该类中与截图相关的属性,主要包括CaptureCursor(截图上显示鼠标指针)、CaptureClientArea(截图时排除标题栏与边框)、RemoveOutsideScreenArea(移除屏幕中的虚拟区域)、CaptureShadow (截图窗口带阴影)、AutoHideTaskbar(截图时,如果窗口与任务栏重叠,则隐藏任务栏)等,最后调用Screenshot类中的CaptureFullscreen函数获取屏幕截图。

  CaptureFullscreen().Capture(true);

  CaptureFullscreen函数中主要使用以下windows函数获取屏幕截图,这些函数的作用就是将屏幕内容绘制到指定的图片中。

序号 函数名称 说明
1 GetDesktopWindow 返回桌面窗口的句柄
2 GetWindowDC 返回指定窗口的设备环境
3 CreateCompatibleDC 创建与指定设备兼容的内存设备上下文环境
4 CreateCompatibleBitmap 创建与指定的设备环境相关的设备兼容的位图
5 SelectObject 选择一对象到指定的设备上下文环境中
6 BitBlt 从原设备中复制位图到目标设备,在ShareX项目中主要用于将屏幕内容绘制到指定图片中
7 DrawIconEx 绘制图标或鼠标指针
8 DeleteDC 删除指定的设备上下文环境
9 ReleaseDC 释放设备上下文环境
10 DeleteObject 删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源

  矩形区域截图功能基于全屏截图。矩形区域截图时,首先创建Screenshot对象获取全屏截图,并以此为画板,调用RegionCaptureForm窗口实现矩形截图,最后调用RegionCaptureForm. GetResultImage函数获取矩形区域截图的图形数据。
  详细的代码实现后续还会继续深入学习,后面准备尝试是否能将截图功能移植到圈选图片识别文本的程序内。

参考文献:
[1]http://news.sohu.com/a/620562619_121124363
[2]https://getsharex.com/
[3]https://github.com/ShareX/ShareX

开源项目ShareX的源码学习(截屏及矩形区域选择功能)相关推荐

  1. 基于STC51:四轴飞控开源项目原理图与源码(入门级DIY)

    目录 前言(作者:宏晶科技) 一.飞控配件 二.接线 三.原理图 四.调试 五.程序 六.完整工程.原理图文件获取 前言(作者:宏晶科技) 本飞控仅仅是姿态飞行控制,没有GPS.电子罗盘.气压高度计. ...

  2. 企业级低代码平台,接私活必备的Java开源项目(附源码)

    项目介绍 Jeecg-Boot 是一款基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design.强大的代码生成器 ...

  3. IEC61499开源项目FORTE部分源码分析

    一.IEC 61499简介 IEC 61499 作为工业自动化领域分布式控制系统级建模语言的标准,其第一(体系结构).二(软件工具要求).四(兼容文件的规则)部分的第一版于 2005 年正式发布,并在 ...

  4. 谷歌开源项目Chromium的源码获取与项目构建(Win7+vs10/vs13)

    从12年那会儿开始获取源码和构建chromium项目都是按照那时候的官方要求用win7+vs2010,相对来说也比较简单,按照步骤来也很快能编译出来. 1.官网的编译配置介绍:http://www.c ...

  5. android移动日记代码,Android开源项目-小熊日记源码

    前言 一直是接着别人的代码来做App的,所以没有完整的开发App体验,总感觉有所缺少.于是,就利用业余时间亲自操刀开始了我的第一次开源项目.本文将讲述开源项目的整个开发过程. 项目初衷 开始这个项目的 ...

  6. 开源 redis 客户端 redigo 源码学习

    redigo 介绍 Go语言实现的开源 redis 客户端. 特性 提供类似 print 函数风格(Print-like)的 API,支持所有的 redis 命令: 支持流水线事务(pipelined ...

  7. 23 个机器学习开源项目,附源码

    本文为你介绍23种机器学习项目创意,以获取有关该增长技术的真实经验. 我们都知道,教科书上所学与实际操作还是有出入的,那关于机器学习有什么好的项目可以实操吗? 这篇教程中,涵盖面向初学者,中级专家和专 ...

  8. 20个vue开源项目免费模板源码

    点击查看原文链接

  9. 【开源项目】X-TRACK源码分析

    文章目录 X-TRACK阅读笔记 整体架构 PageManager 问题 页面的分析 StatusBar Startup页面 Dilaplate页面 页面的布局 动画的设置 LiveMap页面 Sys ...

  10. 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵

    这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...

最新文章

  1. 2022QS世界大学排名:清北跻身世界前20
  2. intimidated
  3. 22.循环控制.rs
  4. mybatis学习笔记-02-第一个mybatis程序
  5. JQuery Datatables单元格内显示数据太长,截取部分显示功能
  6. [0002] Hadoop HDFS cmd常用命令练手
  7. 省、省、省!!!企业如何搭建易用性网络
  8. Spark+Python+Pycharm在Windows下的配置
  9. 用电脑更新手机ios系统_macOS 11正式版:大更新!苹果把iOS风格搬到了电脑上
  10. iOS开源项目周报1229
  11. 39基础数据结构:动态数组
  12. mschart控件_使用MSChart控件绘制图表。
  13. lazysnapping
  14. 8、实战项目-性能优化实战
  15. HDU2066---------Dijkstra算法代码
  16. 宿舍管理系统之登录功能
  17. STAMP: Short-Term Attention:Memory Priority Model for Session-based Recommendation简介
  18. 华为相册的神仙功能,真的超好用!
  19. arp攻击与欺骗有什么区别_什么是欺骗(攻击)?
  20. 企业上云之服务器硬件篇(五)

热门文章

  1. 架构设计:负载均衡层设计方案(2)——Nginx安装
  2. Arthas,一个JAVA项目分析/诊断工具在mac上的试用记录(命令详细示例)
  3. 虾米是怎样炼成的(转收藏)
  4. DLUTOJ 1158艾尔大停电(二分答案+预处理DP)
  5. 计算机停电组态丢失,DCS正确停电和上电的步骤
  6. 使用 U 盘装个 winXP 原版镜像玩红警
  7. 【python】高效找因数算法,竞赛题因数算法优化。
  8. 专家:人工智能20年内取代日本近半职业
  9. B站韩顺平java学习笔记(十一)-- 异常章节
  10. Java 多线程6——计时器Timer的使用 + 详细代码模拟实现 + 代码优化