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

  微信公众号“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函数获取屏幕截图,这些函数的作用就是将屏幕内容绘制到指定的图片中。

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值