AHK离线OCR脚本实战:拖拽截屏+文字识别全流程
2025.09.19 13:32浏览量:0简介:本文分享一款基于AutoHotkey(AHK)的离线OCR脚本,通过拖拽鼠标截屏实现快速文字识别,并将结果自动填充至编辑框。脚本无需联网,兼容Windows环境,适合隐私敏感或无网络场景使用。
一、AHK脚本的离线OCR核心价值
在隐私保护日益重要的今天,离线OCR工具成为开发者、企业用户及隐私敏感人群的刚需。传统OCR方案(如在线API调用)存在两大痛点:一是依赖网络,二是数据上传可能引发隐私泄露风险。而基于AutoHotkey的OCR脚本通过本地化处理,彻底规避了这些问题。
技术原理:
AHK脚本通过调用Windows系统内置的OCR引擎(Windows 10/11自带)或集成开源OCR库(如Tesseract),结合GDI+图像处理接口,实现“截屏→预处理→识别→输出”的全流程。其中,拖拽鼠标截屏功能通过Gui
和Gdip
库实现,用户只需按住鼠标左键框选区域,脚本即可自动捕获屏幕内容。
典型应用场景:
二、脚本实现:拖拽截屏与OCR识别的关键代码
1. 拖拽截屏功能实现
#NoEnv
#SingleInstance Force
SetBatchLines, -1
; 初始化GDI+
If !pToken := Gdip_Startup() {
MsgBox, GDI+ failed to start.
ExitApp
}
; 创建透明GUI用于截屏
Gui, +LastFound +OwnDialogs +AlwaysOnTop -Caption +ToolWindow +E0x08000000
hWnd := WinExist()
hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
hdc := CreateCompatibleDC()
obm := SelectObject(hdc, hbm)
pGraphics := Gdip_GraphicsFromHDC(hdc)
Gdip_SetSmoothingMode(pGraphics, 4)
; 鼠标拖拽事件
CoordMode, Mouse, Screen
Hotkey, ~LButton Up, ReleaseMouse
Return
LButton::
MouseGetPos, x1, y1
While GetKeyState("LButton", "P") {
MouseGetPos, x2, y2
; 绘制半透明矩形框
pBrush := Gdip_BrushCreateSolid(0x7F000000)
Gdip_FillRectangle(pGraphics, pBrush, Min(x1,x2), Min(y1,y2), Abs(x2-x1), Abs(y2-y1))
Gdip_DeleteBrush(pBrush)
UpdateLayeredWindow(hWnd, hdc, (A_ScreenWidth-Abs(x2-x1))//2, (A_ScreenHeight-Abs(y2-y1))//2, Abs(x2-x1), Abs(y2-y1))
}
Return
ReleaseMouse:
MouseGetPos, x2, y2
; 捕获截屏区域
left := Min(x1, x2)
top := Min(y1, y2)
width := Abs(x2 - x1)
height := Abs(y2 - y1)
pBitmap := Gdip_BitmapFromScreen(left "|" top "|" width "|" height)
; 保存为临时文件(后续OCR处理)
tempFile := A_Temp "\OCR_Capture.png"
Gdip_SaveBitmapToFile(pBitmap, tempFile)
Gdip_DisposeImage(pBitmap)
; 触发OCR识别
OCR_Text := RunOCR(tempFile)
; 填充到编辑框(示例:剪贴板)
Clipboard := OCR_Text
MsgBox, 识别结果已复制到剪贴板!
Return
; 清理资源
ExitApp:
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(pGraphics)
Gdip_Shutdown(pToken)
ExitApp
代码解析:
- 通过
Gdip
库实现高精度截屏,支持透明窗口和半透明矩形框绘制。 While
循环实时更新矩形框位置,提供视觉反馈。- 释放鼠标后,调用
RunOCR
函数处理图像(需后续实现)。
2. 离线OCR识别:调用Windows OCR引擎
Windows 10/11内置的OCR引擎可通过COM接口调用,无需额外依赖:
RunOCR(imagePath) {
try {
; 初始化COM
ocrEngine := ComObjCreate("Windows.Media.OCR.OCREngine")
decoder := ComObjCreate("Windows.Graphics.Imaging.BitmapDecoder")
stream := ComObjCreate("Windows.Storage.Streams.RandomAccessStreamReference")
; 加载图像(简化版,实际需处理文件流)
file := FileOpen(imagePath, "r")
data := file.Read()
file.Close()
; 调用OCR(伪代码,需补充COM参数)
ocrResult := ocrEngine.RecognizeAsync(data)
text := ocrResult.Text
return text
} catch e {
MsgBox, OCR失败: %e%
return ""
}
}
替代方案:
若系统不支持COM OCR,可集成Tesseract OCR(需下载tesseract.exe
并配置路径):
RunOCR(imagePath) {
tesseractPath := "C:\Program Files\Tesseract-OCR\tesseract.exe"
tempTxt := A_Temp "\OCR_Result.txt"
RunWait, %tesseractPath% "%imagePath%" "%tempTxt%" -l eng, , Hide
FileRead, text, %tempTxt%
FileDelete, %tempTxt%
return text
}
三、优化建议与实用技巧
识别精度提升:
- 预处理图像:二值化、降噪(通过Gdip调整对比度)。
- 指定语言包:Tesseract需下载对应语言数据(如
chi_sim
中文)。
输出目标扩展:
- 修改
Clipboard := OCR_Text
为ControlSetText, Edit1, %OCR_Text%, 目标窗口标题
,直接填充到指定编辑框。
- 修改
快捷键定制:
#F2:: ; Win+F2触发截屏OCR
Gosub, LButton
Return
错误处理:
- 添加文件存在性检查、OCR引擎版本验证。
- 使用
Try-Catch
捕获COM异常。
四、部署与扩展
编译为EXE:
使用Ahk2Exe
工具将脚本编译为独立程序,方便非开发者使用。多语言支持:
修改Tesseract参数-l eng+chi_sim
实现中英文混合识别。批量处理:
扩展脚本支持文件夹批量识别,输出为TXT或Excel。
五、总结与资源推荐
本文介绍的AHK离线OCR脚本通过拖拽截屏和本地化识别,兼顾了效率与隐私。对于开发者,可进一步集成至自动化流程;对于普通用户,编译后的EXE文件即开即用。
推荐工具:
- Tesseract OCR:https://github.com/tesseract-ocr/tesseract
- AHK GDIP库:https://www.autohotkey.com/boards/viewtopic.php?t=6517
- Windows OCR文档:https://learn.microsoft.com/en-us/windows/win32/api/windows.media.ocr/
通过灵活运用AHK与OCR技术,用户可轻松构建个性化的离线文字识别工具,满足从临时需求到企业级应用的多样化场景。
发表评论
登录后可评论,请前往 登录 或 注册