用 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; <p>string imagePath = "sample.png"; string tessDataPath = Path.Combine(AppContext.BaseDirectory, "tessdata");</p><p>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();</p><p>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 分块识别。
