AutoHotkey 实战:利用 Windows 自带光学字符识别(OCR)实现自动化文本提取

1次阅读
没有评论

共计 2096 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

技术背景

在自动化脚本开发中,经常需要从屏幕或图像中提取文本。传统方案如 Tesseract 虽然强大,但需要额外安装和配置,而 Windows 10/11 自带的 Windows.Media.Ocr API 提供了开箱即用的 OCR 功能,支持多种语言,无需额外部署,特别适合快速开发和轻量级应用。

AutoHotkey 实战:利用 Windows 自带光学字符识别 (OCR) 实现自动化文本提取

环境准备

  • Windows 版本:Windows 10 版本 1809 或更高,或 Windows 11
  • AutoHotkey 版本:AutoHotkey v2.0+
  • 语言支持:确保系统已安装所需语言的 OCR 语言包(如中文、英文等)

核心代码实现

1. 调用 Windows.Media.Ocr API

以下是一个完整的示例脚本,演示如何通过 COM 接口调用 Windows 自带的 OCR 功能:

#Requires AutoHotkey v2.0

; 初始化 COM 接口
ocrEngine := ComObject("Windows.Media.Ocr.OcrEngine")
ocrEngine := ocrEngine.TryCreateFromUserProfileLanguages()
if !ocrEngine
{
    MsgBox "无法初始化 OCR 引擎,请检查语言包是否安装。"
    ExitApp
}

; 截取屏幕区域(示例:左上角 100x100 像素)pBitmap := Gdip_BitmapFromScreen("0|0|100|100")
if !pBitmap
{
    MsgBox "截图失败"
    ExitApp
}

; 将 Bitmap 转换为 Windows.Media.Imaging.SoftwareBitmap
hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
softwareBitmap := ConvertHBitmapToSoftwareBitmap(hBitmap)

; 调用 OCR 识别
try
{ocrResult := ocrEngine.RecognizeAsync(softwareBitmap).GetResults()
    recognizedText := ocrResult.Text
    MsgBox "识别结果:" recognizedText
}
catch
{MsgBox "OCR 识别失败:" ErrorMessage}

; 清理资源
Gdip_DisposeImage(pBitmap)
DeleteObject(hBitmap)

2. Bitmap 转换关键代码

Windows.Media.Ocr 需要 SoftwareBitmap 作为输入,以下是转换函数:

ConvertHBitmapToSoftwareBitmap(hBitmap) {
    ; 通过 COM 接口创建 SoftwareBitmap
    bitmapDecoder := ComObject("Windows.Graphics.Imaging.BitmapDecoder")
    stream := ComObject("Windows.Storage.Streams.RandomAccessStreamReference")
    stream := stream.CreateFromFile(hBitmap)
    decoder := bitmapDecoder.CreateAsync(stream).GetResults()
    softwareBitmap := decoder.GetSoftwareBitmapAsync().GetResults()
    return softwareBitmap
}

3. 错误处理最佳实践

  • 使用 try/catch 捕获 OCR 识别过程中的异常。
  • 检查 ocrEngine 是否初始化成功。
  • 确保 SoftwareBitmap 的格式兼容(如像素格式为 Gray8Bgra8)。

性能优化

1. 识别准确率提升

  • 二值化预处理:在截图后对图像进行二值化处理,可以提高 OCR 的准确率。
  • 区域裁剪:尽量只截取包含文本的区域,减少干扰。

2. 内存管理

  • 及时释放 BitmapSoftwareBitmap 资源,避免内存泄漏。
  • 使用 Gdip_DisposeImageDeleteObject 清理 GDI+ 对象。

典型应用场景

1. 自动化测试中的文本验证

在 GUI 自动化测试中,可以用 OCR 验证界面上的文本是否符合预期,比如验证弹窗提示或按钮标签。

2. 游戏数据抓取

对于不支持文本直接读取的游戏,可以通过 OCR 抓取屏幕上的文本信息,比如任务描述或角色属性。

避坑指南

1. 高 DPI 屏幕适配

在高 DPI 屏幕上,截图坐标可能需要缩放。可以通过 A_ScreenDPI 获取当前屏幕的 DPI 设置,并调整截图区域。

2. 多语言混合识别的限制

Windows OCR 对混合语言的支持有限,如果文本中包含多种语言,可能会出现识别错误。建议在初始化时指定主要语言。

延伸阅读

实战挑战

  1. 尝试修改脚本,实现对特定窗口的文本抓取(如记事本)。
  2. 扩展脚本,将识别结果保存到文件。
  3. 结合图像预处理(如二值化),提升复杂背景下的识别准确率。

通过本文的示例和技巧,你可以快速上手 Windows 自带的 OCR 功能,并将其整合到你的 AutoHotkey 脚本中,实现高效的文本提取自动化。

正文完
 0
评论(没有评论)