logo

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+图像处理接口,实现“截屏→预处理→识别→输出”的全流程。其中,拖拽鼠标截屏功能通过GuiGdip库实现,用户只需按住鼠标左键框选区域,脚本即可自动捕获屏幕内容。

典型应用场景

  • 快速提取PDF/图片中的文字(如扫描件、截图)
  • 离线环境下处理敏感文档(如合同、财务数据)
  • 开发者调试时提取日志或错误信息
  • 无网络环境下的临时文字识别需求

二、脚本实现:拖拽截屏与OCR识别的关键代码

1. 拖拽截屏功能实现

  1. #NoEnv
  2. #SingleInstance Force
  3. SetBatchLines, -1
  4. ; 初始化GDI+
  5. If !pToken := Gdip_Startup() {
  6. MsgBox, GDI+ failed to start.
  7. ExitApp
  8. }
  9. ; 创建透明GUI用于截屏
  10. Gui, +LastFound +OwnDialogs +AlwaysOnTop -Caption +ToolWindow +E0x08000000
  11. hWnd := WinExist()
  12. hbm := CreateDIBSection(A_ScreenWidth, A_ScreenHeight)
  13. hdc := CreateCompatibleDC()
  14. obm := SelectObject(hdc, hbm)
  15. pGraphics := Gdip_GraphicsFromHDC(hdc)
  16. Gdip_SetSmoothingMode(pGraphics, 4)
  17. ; 鼠标拖拽事件
  18. CoordMode, Mouse, Screen
  19. Hotkey, ~LButton Up, ReleaseMouse
  20. Return
  21. LButton::
  22. MouseGetPos, x1, y1
  23. While GetKeyState("LButton", "P") {
  24. MouseGetPos, x2, y2
  25. ; 绘制半透明矩形框
  26. pBrush := Gdip_BrushCreateSolid(0x7F000000)
  27. Gdip_FillRectangle(pGraphics, pBrush, Min(x1,x2), Min(y1,y2), Abs(x2-x1), Abs(y2-y1))
  28. Gdip_DeleteBrush(pBrush)
  29. UpdateLayeredWindow(hWnd, hdc, (A_ScreenWidth-Abs(x2-x1))//2, (A_ScreenHeight-Abs(y2-y1))//2, Abs(x2-x1), Abs(y2-y1))
  30. }
  31. Return
  32. ReleaseMouse:
  33. MouseGetPos, x2, y2
  34. ; 捕获截屏区域
  35. left := Min(x1, x2)
  36. top := Min(y1, y2)
  37. width := Abs(x2 - x1)
  38. height := Abs(y2 - y1)
  39. pBitmap := Gdip_BitmapFromScreen(left "|" top "|" width "|" height)
  40. ; 保存为临时文件(后续OCR处理)
  41. tempFile := A_Temp "\OCR_Capture.png"
  42. Gdip_SaveBitmapToFile(pBitmap, tempFile)
  43. Gdip_DisposeImage(pBitmap)
  44. ; 触发OCR识别
  45. OCR_Text := RunOCR(tempFile)
  46. ; 填充到编辑框(示例:剪贴板)
  47. Clipboard := OCR_Text
  48. MsgBox, 识别结果已复制到剪贴板!
  49. Return
  50. ; 清理资源
  51. ExitApp:
  52. SelectObject(hdc, obm)
  53. DeleteObject(hbm)
  54. DeleteDC(hdc)
  55. Gdip_DeleteGraphics(pGraphics)
  56. Gdip_Shutdown(pToken)
  57. ExitApp

代码解析

  • 通过Gdip库实现高精度截屏,支持透明窗口和半透明矩形框绘制。
  • While循环实时更新矩形框位置,提供视觉反馈。
  • 释放鼠标后,调用RunOCR函数处理图像(需后续实现)。

2. 离线OCR识别:调用Windows OCR引擎

Windows 10/11内置的OCR引擎可通过COM接口调用,无需额外依赖:

  1. RunOCR(imagePath) {
  2. try {
  3. ; 初始化COM
  4. ocrEngine := ComObjCreate("Windows.Media.OCR.OCREngine")
  5. decoder := ComObjCreate("Windows.Graphics.Imaging.BitmapDecoder")
  6. stream := ComObjCreate("Windows.Storage.Streams.RandomAccessStreamReference")
  7. ; 加载图像(简化版,实际需处理文件流)
  8. file := FileOpen(imagePath, "r")
  9. data := file.Read()
  10. file.Close()
  11. ; 调用OCR(伪代码,需补充COM参数)
  12. ocrResult := ocrEngine.RecognizeAsync(data)
  13. text := ocrResult.Text
  14. return text
  15. } catch e {
  16. MsgBox, OCR失败: %e%
  17. return ""
  18. }
  19. }

替代方案
若系统不支持COM OCR,可集成Tesseract OCR(需下载tesseract.exe并配置路径):

  1. RunOCR(imagePath) {
  2. tesseractPath := "C:\Program Files\Tesseract-OCR\tesseract.exe"
  3. tempTxt := A_Temp "\OCR_Result.txt"
  4. RunWait, %tesseractPath% "%imagePath%" "%tempTxt%" -l eng, , Hide
  5. FileRead, text, %tempTxt%
  6. FileDelete, %tempTxt%
  7. return text
  8. }

三、优化建议与实用技巧

  1. 识别精度提升

    • 预处理图像:二值化、降噪(通过Gdip调整对比度)。
    • 指定语言包:Tesseract需下载对应语言数据(如chi_sim中文)。
  2. 输出目标扩展

    • 修改Clipboard := OCR_TextControlSetText, Edit1, %OCR_Text%, 目标窗口标题,直接填充到指定编辑框。
  3. 快捷键定制

    1. #F2:: ; Win+F2触发截屏OCR
    2. Gosub, LButton
    3. Return
  4. 错误处理

    • 添加文件存在性检查、OCR引擎版本验证。
    • 使用Try-Catch捕获COM异常。

四、部署与扩展

  1. 编译为EXE
    使用Ahk2Exe工具将脚本编译为独立程序,方便非开发者使用。

  2. 多语言支持
    修改Tesseract参数-l eng+chi_sim实现中英文混合识别。

  3. 批量处理
    扩展脚本支持文件夹批量识别,输出为TXT或Excel。

五、总结与资源推荐

本文介绍的AHK离线OCR脚本通过拖拽截屏和本地化识别,兼顾了效率与隐私。对于开发者,可进一步集成至自动化流程;对于普通用户,编译后的EXE文件即开即用。

推荐工具

通过灵活运用AHK与OCR技术,用户可轻松构建个性化的离线文字识别工具,满足从临时需求到企业级应用的多样化场景。

相关文章推荐

发表评论