这个截图工具更新迭代了三轮,竭尽全力只为增强其可拓展性。目前已经具备了不少较强的功能!
该工具只调用了pywin32; keyboard和pillow三个第三方库,绝对的轻量化!(很多实现都尽可能使用ctypes调用Windows操作系统的接口实现。因此局限性在于,它目前只适合Windows操作系统,兼容性不太强。。)
一、为了展示,先来看最具特色的两个功能:
1、OCR文字识别

在./src/Setting.json文件中,有关于OCR接口的配置。你可以十分方便的配置OCR的第三方接口,只需要保证它是以命令行的形式调用的即可。程序会尝试解析返回的结果并格式化输出到面板上。默认使用的是_internal/wcocr.exe, 它通过自行搜索微信安装目录,直接调用微信的文字识别功能(不需要打开微信)十分方便。
2、类图片编辑器的Canvas面板

鼠标中键滚动,可以像图片编辑器那样放大面板中的图片。无需担心图像放大到一定程度时导致放大速度降低,因为这个画布类经过优化,使用包括金字塔分层加载技术以及懒加载(只放大图片可见部分),O(1)级别的效率对视图中的图片进行放大!
二、基础功能
3、截图时的暗亮色比对+放大镜功能+鼠标提示信息

4、截图松手后可调整框选区域,键盘上下左右微调选区
5、基本的设置

三、代码设计思路
由于整个项目的代码量较大,此时不作具体展示,只是谈一些基本的设计思路:
1、确定基本类,包括:
①主界面UI类和主界面控制类;设置界面UI类和设置界面控制类;
在截图时,涉及到多个控件类,如全屏画布“ScreenshotCanvas”类; 放大镜“Magnifier”类; 鼠标指针信息“ScreenshotTip”类;可调整的选区边框“AdjustableRect”类;截图松手后底部控制栏“EditBar”类等等;
③额外功能类,如开始提到文字识别功能实现部分:“OCRUtils”类和能够高效放大图像的“CanvasImage”类;
2、确定事件绑定关系。事实上整个截图最关键就在按下截图键后的逻辑,如启动截图时,需要立即创建覆盖全局大小的Toplevel, 并在上面放置全局画布ScreenshotCanvas。同时,你需要根据用户是否按下鼠标决定放大镜和提示信息的出现与否;基于这个基本的逻辑线,再去慢慢完善各个(1)中提到的各个基本类;
3、可拓展性。在控件类中,有一些相似功能,如隐藏和显示,这时就需要统一接口。考虑让他们继承相同的父类,针对同一个“隐藏和显示”功能,各自做不同的实现,也就是“多态”了。同时,考虑对一些特殊的功能进行“插件化”;不过代码中其实也就“插件化”了一个OCR功能而已,让wcocr.exe作为一个单独的子程序在外部被调用,并且调用的逻辑写到配置文件Setting.json中,方便用户修改配置。
"ocr_config": {
"parser_keys": {
"text": "text",
"box": "box",
"rate": "rate"
},
"command": "_internal\\wcocr.exe --image_path=$image_path"
}
4、不足反思。
事实上,整个代码并不完全像我上面那样开始设计的。设计的起点实际上是从(2)开始。我先无脑设计了一个“超人类”,融合了大量UI元素和绑定逻辑,这也直接导致了我后面进行了两三轮的重构才将代码变得较为可读。事实上,个人写代码时,停下手认真思考如何设计真的很难,很容易上手就直接开始写,将什么所谓的设计模式抛诸脑后。引发的代价就是难以维护。这也启示我在起手做项目时,还是不得不先花上一些时间,先认真想一想如何设计!
四、项目地址
这里面还包含了打包好的可执行程序,最新版本仅9.5MB左右(没听错,用Python的Pyinstaller打包,仅仅9.5MB!)
https://github.com/Just-A-Freshman/LightScreenshot
浙公网安备 33010602011771号