java获取屏幕信息 java获取屏幕文字_javaweb 获取选中超链接的文字


在使用 Mac 的过程中,我们经常遇到的一个麻烦就是,无法复制屏幕上显示的文字。有很多种场景会导致这种情形,例如

  • 这段文字上包含超链接,每次试图复制时都会在新标签页中打开超链接
  • 这段文字是网页或应用程序中的表单里的一个选择栏,每次点击时都会弹出所有可选择的项目
  • 网页受到保护或者应用程序里不让选中这段文字
  • 这段文字在应用程序的菜单栏中
  • 这段文字并不是文本,而是一张图片

还有很多种场景会导致我们无法复制屏幕上显示的文字,而解决这个麻烦的一个有效方法就是 OCR (Optical Character Recognition,光学字符识别)。想必各位对 OCR 并不陌生,最近几年 OCR 的技术越来越成熟,相关的软件越来越多。简单的说 OCR 就是检查图片中的字符,并将其翻译成计算机文字。在自动化软件 Keyboard Maestro 9 中,自带了 OCR 方法,我们可以通过 Keyboard Maestro 做一个自动化动作,实现在 Mac 上随时提取屏幕上的文字。


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_02

通过 OCR 识别中文


除了识别中英文以外,另一个比较重要的工作就是解析屏幕上的二维码,这同样可以通过 Keyboard Maestro 实现。


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_03


我将这个自动化脚本放在了 GitHub 上,各位可以直接下载使用。提取屏幕上的文字

准备工作

  • 安装 Keyboard Maestro 9

使用指南

  • 下载 macro,并导入到 Keyboard Maestro 中,且激活这个 macro
  • 将系统的「将所选区域的图片拷贝到剪贴板」功能快捷键设置为 ⌥Option + ⌘Command + Space
  • 通过快捷键 (我设置的是 F9) 触发该 macro,根据语言选择「中文识别」或「英文识别」,此时调用系统截图工具,对需要识别的文本进行截图
  • 截图完成后,Keyboard Maestro 会对截取的内容进行 OCR,并将结果拷贝至剪贴板,同时发送通知

原理解析

Step 1-调用系统剪贴板

通过 Keyboard Maestro 的「Simulate keystroke」方法可以模拟按下「将所选区域的图片拷贝到剪贴板」,此时调用系统截图功能


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_04

调用系统剪贴板

Step 2-等待截图完成

在 Keyboard Maestro 中,「Simulate keystroke」方法在按下快捷键后就已经完成,此时它会继续执行剩下的动作,但此时我们的截图操作还没有完成,所以我们需要让 Keyboard Maestro 等待我们截图完成以后再进行接下来的操作。

这里有一个很有用的技巧,那就是通过 Keyboard Maestro 的「Pause Until」方法,即一直等待,直至达到某个条件。

我们在截图时需要进行的操作时,按下触控板,然后滑动,再松开。我们可以通过这个方式让 Keyboard Maestro 等待我们截图操作完成。

  1. 暂停 macro,直至鼠标左键按下,此时我们开始选择截图区域
  2. 暂停 macro,直至鼠标左键松开,此时我们已经完成截图区域的选择,系统也完成了截图操作
  3. 等待 0.5 秒,保证截图的内容在剪贴板中


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_05

等待截图完成

Step 3-OCR 系统剪贴板

通过 Keyboard Maestro 的「OCR System Clipboard」方法可以对剪贴板中的内容进行 OCR,可以根据具体的内容选择识别的语言。我们将识别后的内容依然存入剪贴板。


java获取屏幕信息 java获取屏幕文字_无法解析导入mybean_06

OCR 系统剪贴板

Step 4-过滤多余空格

通过 Keyboard Maestro 的 OCR 方法识别出来的文本偶尔两端会有多余的空格,这时可以通过 Keyboard Maestro 的「Filter」方法对其进行过滤,仍然将过滤后的文本存入剪贴板。


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_07

过滤多余空格

Step 5-发送通知

因为 OCR 文本并不具备 100% 的准确度,这是由两方面决定的,一方面是我们截图时是否将待识别文本截的仔细,另一方面则是程序本身并不保证 100% 准确度。于是,我们在识别完成后发送了一个系统通知,这样我们就能方便的知道识别后的文本是什么。


java获取屏幕信息 java获取屏幕文字_无法解析导入mybean_08

发送通知

解析屏幕上的二维码

准备工作

  • 安装 Keyboard Maestro 9
  • 通过 Homebrew 安装命令行工具 zbar: brew install zbar

使用指南

  • 下载 macro,并导入到 Keyboard Maestro 中,且激活这个 macro
  • 将系统的「将所选区域的图片拷贝到剪贴板」功能快捷键设置为 ⌥Option + ⌘Command + Space
  • 通过快捷键 (我设置的是 F9) 触发该 macro,根据语言选择「二维码识别」,此时调用系统截图工具,对需要解析的二维码进行截图,可以将截图区域设置的大一些,这样能够保证截图包括了整个二维码的全部信息
  • 截图完成后,Keyboard Maestro 会对截取的内容进行二维码解析,并将结果拷贝至剪贴板,同时发送通知

原理解析

这个 macro 中有很多的步骤跟「提取屏幕上的文字」相同,相同的部分不再赘述,仅对其中不同的地方加以解析。

Step 1-调用系统剪贴板

Step 2-等待截图完成

Step 3-将截图存储成文件

通过 Keyboard Maestro 的「Write System Clipboard to File」方法可以将截图保存成文件,同时暂停 macro 0.5 秒保证截图保存完成。


java获取屏幕信息 java获取屏幕文字_无法解析导入mybean_09

将截图存储成文件

Step 4-解析二维码

通过命令行工具 zbarimg 来解析二维码,解析后的内容开头是 QR-Code:,使用 sed 命令来提取这部分内容之后的元素,这才是二维码解析后的内容,并将这内容存储到系统剪贴板。


java获取屏幕信息 java获取屏幕文字_java获取屏幕信息_10

解析二维码

Step 5-删除文件及发送通知

在二维码解析完成后,通过 Keyboard Maestro 的「Delete File」方法删除截图,同时发送通知,这时就可以在通知中看到二维码的识别结果。


java获取屏幕信息 java获取屏幕文字_javaweb 获取选中超链接的文字_11

删除文件及发送通知

小结

通过 Keyboard Maestro 和 OCR 能够提取屏幕上的任何文字,通过 Keyboard Maestro 和 zbar 能够识别屏幕上的二维码,自动化操作给我们的工作带来了很大的便利。我们还可以用这一套流程做很多其他的事情,例如截取一个公式,并将其识别为 LaTeX 代码等等。这篇 Keyboard Maestro 的技巧虽然比较简单,但也希望能给各位更多的启发,用自动化来提高生产力。