开源一个AI写的截图+离线OCR识别小工具-SnipasteOcr

前言

中秋在家无事, 正好前段时间周杰大佬发布了新的OCR推理库 SimdPaddleOCR

以前经常使用Snipaste这个小工具作为离线截图工具.

但是在OCR已经发展的如此迅猛的如今.

它却始终没有支持截图+OCR识别

正好手头有个qwen3.8 27b本地模型,可以无限用.

就打算让大模型来帮我完成这个项目,最终耗时1天,完成了这个截图+离线OCR的工具.

代码采用C#开发,主要是采用了AOT进行裁剪和单个文件原生发布,不依赖.NET运行时

最终打包大小150MB(主要来源于OCR模型,因为考虑到精度),如果引用改为Tiny模型可以缩小到27MB

代码已经全部开源:l2999019/SnipasteOcr(欢迎大家Star)

正文

先介绍一下这个工具吧.(以下SnipasteOCR项目简介内容也由AI生成)

1.SnipasteOCR项目简介

仿 Snipaste 的截图 OCR 小工具:按热键框选屏幕区域,本地离线识别文字,支持部分选词、复制、保存。

基于 .NET 10 WinForms + NativeAOT,发布后是单个原生 exe,无需安装 .NET 运行时;OCR 引擎 SimdPaddleOCR 与中文识别模型全部内嵌,识别过程完全离线。

功能

  • F1 --- 截屏 OCR:框选区域后弹出结果窗口
  • F2 --- 截屏复制:框选区域直接以 PNG 复制到剪贴板
  • 支持鼠标右键托盘菜单触发,热键被占用时会提示
  • 识别结果窗口:
    • 按截图原始尺寸 1:1 显示,缩放时窗口跟随图片大小联动
    • 单击选中整个文本块,在文本块内按住拖动可部分选词(像选网页文字一样)
    • Ctrl+C 复制选中内容(整行或选中的字符范围),Ctrl+A 全选
    • Ctrl+滚轮 / + / - 缩放,0 适应窗口,Esc 关闭
    • 一键复制全部 / 保存截图为 PNG

系统要求

项目 要求
系统 Windows 10 1809+ / Windows 11 (x64)
CPU 需支持 AVX2(2011 年后的 Intel/AMD 桌面/移动 CPU 基本都支持)

AVX2 是 SimdPaddleOCR 在 NativeAOT 下启用 SIMD 内核的硬性要求,否则推理速度会差一个数量级,因此发布时固定编译为 AVX2 指令集。

快速开始(发布产物)

发布后的 SnipasteOcr.exe 单文件即可运行(根据选择模型不同,约27MB-156MB):

复制代码
SnipasteOcr.exe      # 启动后驻留系统托盘

启动后按 F1 框选区域,稍等识别完成即可在结果窗口中选择、复制文字。

从源码构建

需要 .NET 10 SDK。

复制代码
# 调试运行
dotnet build SnipasteOcr -c Debug

# AOT 发布 (win-x64 单文件原生 exe)
dotnet publish SnipasteOcr -c Release -r win-x64 --self-contained -p:PublishAot=true

产物位于 SnipasteOcr/bin/Release/net10.0-windows/win-x64/publish/,其中的语言资源目录(cs、de、zh-Hans 等)可删除,不影响运行。

项目结构

复制代码
SnipasteOcr/
├── Program.cs            # 入口: 手动消息循环 + 全局热键注册 (F1/F2)
├── SnipCoordinator.cs    # 截图流程调度
├── SnipOverlayForm.cs    # 全屏截图覆盖层: 框选、遮罩、尺寸提示
├── OcrService.cs         # OCR 引擎封装 (懒加载、独立线程推理)
├── OcrResultForm.cs      # 结果窗口: 框叠加、字符级拖选、缩放联动
├── TrayController.cs     # Win32 托盘图标
└── NativeMethods.cs      # Win32 P/Invoke

技术要点

  • NativeAOT + 裁剪: IsAotCompatible=true、IlcInstructionSet=avx2;OCR 引擎与模型通过程序集嵌入资源加载,需在 TrimmerRootAssembly 中显式保留,PublishAot 默认开启。
  • Per-Monitor DPI v2: 截图是物理像素,窗口客户区是逻辑像素,绘制/命中/字符定位三套坐标统一经 DPI 换算,保证 100% 缩放下像素对齐。
  • 字符级选词: PaddleOCR 只输出整行文本与整行检测框(四边形)。选词按字符宽度权重(汉字 1.0 / ASCII 0.6 / 空格 0.35)将字符投影到检测框主轴上,鼠标位置经投影反解出行内字符索引;复制内容直接按字符索引切原文,结果精确。
  • 推理不锁图: 识别前对位图做瞬时 LockBits 拷贝,推理在独立字节缓冲上进行,UI 线程可随时重绘。

已知限制

  • 中文识别为主(中文 V6 Medium 模型),英文等西文字符可用但非最优
  • 字符级选区按宽度比例估算,选区边缘与真实字符边界可能有 1~2 像素偏差(不影响复制内容)
  • 仅支持 x64 Windows;发布产物与编译机架构绑定,换架构需重新 publish

依赖

License

MIT,(依赖项目开源协议保持原协议)

2.识别效果

由于采用了相对精度最高的ChineseV6Medium模型,所以对于一些手写体的识别效果 也很好,如图:

结束语

最后,主要是想跟大家聊聊AI大模型.

这个项目其实我全程没怎么写代码,基本是完全采用Codex+本地qwen3.8 27b 模型进行的编写

当然,也不是完全能托管给AI,在一些WIN32的API接口映射调用方面,还是有所欠缺,容易参数和弄错函数(后面我自己补充上去的)

特别是在F1 F2注册热键的时候,AI反复纠结了很久 - - 始终没弄对, 我实在看不下去了...就给它指出了问题,才改对.

这是AI的回复..

其实在AI大模型发展迅速的今天,利用AI和让AI协助工作 已经是不可逆的大趋势,

而且AI确实可以帮助我们解决很多比较麻烦的事情.

但是AI的生成过程,其实,我觉得还是离不开人的引导.(特别是它在纠结住的时候)

还有AI的结果物,其实也很需要人去审核和判断.

就说到这,欢迎大家一起讨论和Star