共计 2096 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景
在自动化脚本开发中,经常需要从屏幕或图像中提取文本。传统方案如 Tesseract 虽然强大,但需要额外安装和配置,而 Windows 10/11 自带的 Windows.Media.Ocr API 提供了开箱即用的 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的格式兼容(如像素格式为Gray8或Bgra8)。
性能优化
1. 识别准确率提升
- 二值化预处理:在截图后对图像进行二值化处理,可以提高 OCR 的准确率。
- 区域裁剪:尽量只截取包含文本的区域,减少干扰。
2. 内存管理
- 及时释放
Bitmap和SoftwareBitmap资源,避免内存泄漏。 - 使用
Gdip_DisposeImage和DeleteObject清理 GDI+ 对象。
典型应用场景
1. 自动化测试中的文本验证
在 GUI 自动化测试中,可以用 OCR 验证界面上的文本是否符合预期,比如验证弹窗提示或按钮标签。
2. 游戏数据抓取
对于不支持文本直接读取的游戏,可以通过 OCR 抓取屏幕上的文本信息,比如任务描述或角色属性。
避坑指南
1. 高 DPI 屏幕适配
在高 DPI 屏幕上,截图坐标可能需要缩放。可以通过 A_ScreenDPI 获取当前屏幕的 DPI 设置,并调整截图区域。
2. 多语言混合识别的限制
Windows OCR 对混合语言的支持有限,如果文本中包含多种语言,可能会出现识别错误。建议在初始化时指定主要语言。
延伸阅读
实战挑战
- 尝试修改脚本,实现对特定窗口的文本抓取(如记事本)。
- 扩展脚本,将识别结果保存到文件。
- 结合图像预处理(如二值化),提升复杂背景下的识别准确率。
通过本文的示例和技巧,你可以快速上手 Windows 自带的 OCR 功能,并将其整合到你的 AutoHotkey 脚本中,实现高效的文本提取自动化。
正文完
发表至: 技术分享
近两天内
