Tesseract(推荐tesseractdotnet库)是C#中离线、免费、多语言OCR的最佳选择,需正确配置tessdata路径及chi_sim.traineddata文件,配合图像预处理可提升印刷体识别精度。

用 Tesseract 是最直接的方案
在 C# 中做 OCR,Tesseract(通过封装库 Tesseract.NET 或官方推荐的 tesseractdotnet)是目前最成熟、免费、支持多语言且能离线运行的选择。它不依赖网络,识别精度对印刷体足够可靠,适合桌面应用或后台服务。
注意:不要用已停止维护的 Tesseract.NET(旧版 NuGet 包 ID 为 Tesseract),它不支持 .NET 6+,且缺乏 ARM64 和中文优化。应改用 tesseractdotnet(GitHub 仓库名:charlesw/tesseract)。
- 安装命令:
dotnet add package tesseractdotnet
- 需额外下载对应语言数据文件(如
chi_sim.traineddata),放在项目输出目录(如./tessdata/)并确保路径可读 - 初始化时必须显式指定
tessdata路径,否则默认找不到中文模型
using Tesseract; 的最小可用示例
以下代码能在 .NET 6+ 控制台中跑通,识别一张含简体中文的 PNG 图片:
using Tesseract;string imagePath = "sample.png"; string tessDataPath = Path.Combine(AppContext.BaseDirectory, "tessdata");
using var engine = new TesseractEngine(tessDataPath, "chi_sim", EngineMode.Default); using var img = Pix.LoadFromFile(imagePath); using var page = engine.Process(img); string text = page.GetText();
Console.WriteLine(text);
关键点:
-
tessDataPath必须是包含tessdata文件夹的**父目录**,不是tessdata本身 -
"chi_sim"是简体中文模型名,不是"chi"或"chinese";繁体用"chi_tra" -
Pix是 Tesseract 自带图像容器,不接受Bitmap或Image,需用Pix.LoadFromFile或Pix.LoadFromMemory
常见错误:Unable to load language 'chi_sim'
这个错误几乎总是路径或文件问题,和模型本身无关:
- 检查
tessdata文件夹是否真的复制到了输出目录(bin/Debug/net6.0/tessdata/) - 确认
chi_sim.traineddata文件名拼写完全一致(区分大小写,无空格、无后缀错误) - 若用 Visual Studio,右键该文件 → 属性 → “复制到输出目录” 设为“始终复制”
- Linux/macOS 下注意文件权限,
tessdata目录需有读取权限
识别效果差?先调图,别急着换库
OCR 效果高度依赖输入图像质量。Tesseract 对模糊、低对比、倾斜、小字号、手写体基本无解,但对干净扫描件或截图效果很好。提升识别率的实操建议:
- 预处理优先用
Pix自带方法:img.Deskew()(自动纠偏)、img.BinarizeOtsu()(二值化) - 避免用
Bitmap做缩放再转Pix—— 插值会引入锯齿,改用Pix.Scale() - 小文字区域可裁剪后单独识别:
page.GetSegmentedRegions(PageIteratorLevel.Block)配合Pix.Clone() - 不推荐强行用
engine.SetVariable("tessedit_char_whitelist", "0123456789")限制字符集,易漏字;应优先优化图像
复杂场景(如表格、多栏、带格式 PDF)需要额外布局分析,Tesseract 本身不擅长,得接 pdf2image + OpenCV 定位 ROI,再送入 Tesseract 分块识别。










