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 文件名拼写完全一致(区分大小写,无空格、无后缀错误)
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 分块识别。