Tesseract命令行可识别TIFF,.NET C#程序识别乱码如何解决?
.NET程序中Tesseract识别TIFF乱码的修复方案
核心问题排查与修改步骤
1. 修正tessdata路径引用错误
你的代码中计算了Assembly路径但未实际使用,而是用了相对路径./tessdata,这可能导致程序在不同运行目录下找不到训练数据,引发识别异常。替换路径初始化逻辑:
// 使用程序运行的根目录拼接tessdata路径,确保路径正确 var tessDataPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "tessdata"); using (var ocr = new TesseractEngine(tessDataPath, "eng", EngineMode.Default))
2. 避免Bitmap加载导致的图像失真
System.Drawing.Image.FromFile加载TIFF时可能自动转换图像格式(比如调整位深、压缩方式),丢失Tesseract需要的原始图像信息。改用Tesseract原生的Pix.LoadFromFile直接读取文件:
// 移除Bitmap加载代码,直接用Pix读取TIFF文件 using (var img = Pix.LoadFromFile(file)) { using (var page = ocr.Process(img)) { ocrtext = page.GetText(); result = ocrtext.TrimStart('\n'); using (StreamWriter sw = new StreamWriter(outfileab + ".txt", false, Encoding.UTF8)) { sw.Write("aa:" + result); } } }
3. 明确StreamWriter的编码格式
默认StreamWriter使用无BOM的UTF-8编码,部分文本查看工具会识别为GBK等编码导致乱码,显式指定UTF-8编码(带BOM):
using (StreamWriter sw = new StreamWriter(outfileab + ".txt", false, Encoding.UTF8)) { sw.Write("aa:" + result); }
4. 匹配Tesseract原生库的平台位数
Tesseract的原生库分32位和64位,若项目平台目标不匹配会导致识别异常:
- 打开Visual Studio项目属性 → 生成选项卡
- 将“平台目标”设置为
x64或x86,与你安装的Tesseract 5.4.0版本位数一致(命令行能运行的版本位数) - 取消勾选“首选32位”选项
5. 验证字符白名单配置(可选)
如果你的目标文本包含白名单外的字符,会被过滤导致输出异常,若不需要限制识别范围可注释该行:
// 若无需限制识别字符,注释此行 // ocr.SetVariable("tessedit_char_whitelist", "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ");
内容的提问来源于stack exchange,提问作者Al G
相关产品推荐
相关产品推荐

