前言
中秋在家无事, 正好前段时间周杰大佬发布了新的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
依赖
- Sdcb.SimdPaddleOCR 1.4.2 --- 纯 C# 的 PaddleOCR 推理引擎
- Sdcb.SimdPaddleOCR.Models.ChineseV6Medium 1.0.0 --- 中文 det+rec+cls 模型与字典(嵌入资源)
License
MIT,(依赖项目开源协议保持原协议)
2.识别效果
由于采用了相对精度最高的ChineseV6Medium模型,所以对于一些手写体的识别效果 也很好,如图:


结束语
最后,主要是想跟大家聊聊AI大模型.
这个项目其实我全程没怎么写代码,基本是完全采用Codex+本地qwen3.8 27b 模型进行的编写
当然,也不是完全能托管给AI,在一些WIN32的API接口映射调用方面,还是有所欠缺,容易参数和弄错函数(后面我自己补充上去的)
特别是在F1 F2注册热键的时候,AI反复纠结了很久 - - 始终没弄对, 我实在看不下去了...就给它指出了问题,才改对.
这是AI的回复..

其实在AI大模型发展迅速的今天,利用AI和让AI协助工作 已经是不可逆的大趋势,
而且AI确实可以帮助我们解决很多比较麻烦的事情.
但是AI的生成过程,其实,我觉得还是离不开人的引导.(特别是它在纠结住的时候)
还有AI的结果物,其实也很需要人去审核和判断.
就说到这,欢迎大家一起讨论和Star