在C#项目中实现图片文件文字提取,最常用的是结合Tesseract OCR引擎完成,该引擎开源免费且支持多语言识别,能够满足大部分场景的文字提取需求。下面将从环境准备到完整实现逐步说明具体步骤。

环境准备
首先需要安装对应的NuGet包和语言数据文件,具体步骤如下:
- 在Visual Studio的NuGet包管理器中搜索并安装
Tesseract包,当前稳定版本为5.2.0 - 下载Tesseract的语言数据文件,中文识别需要下载
chi_sim.traineddata,英文识别需要eng.traineddata,文件可以从官方仓库获取 - 将下载的语言数据文件放到项目的
tessdata目录下,并设置文件属性为“始终复制”到输出目录
核心实现代码
以下是完整的图片文字提取示例代码,包含初始化引擎、加载图片、执行识别、获取结果的全流程:
using System;
using System.IO;
using Tesseract;
namespace OcrDemo
{
class Program
{
static void Main(string[] args)
{
// 图片文件路径
string imagePath = @"D:test_image.png";
// 语言数据目录,对应项目中的tessdata文件夹
string tessDataPath = @"./tessdata";
// 识别语言,chi_sim代表简体中文,eng代表英文,多个语言用+连接
string language = "chi_sim+eng";
try
{
// 初始化Tesseract引擎
using (var engine = new TesseractEngine(tessDataPath, language, EngineMode.Default))
{
// 加载图片文件
using (var img = Pix.LoadFromFile(imagePath))
{
// 执行OCR识别
using (var page = engine.Process(img))
{
// 获取识别的完整文本
string text = page.GetText();
Console.WriteLine("识别结果:");
Console.WriteLine(text);
// 获取识别的置信度
float confidence = page.GetMeanConfidence();
Console.WriteLine($"识别置信度:{confidence * 100:F2}%");
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"识别过程出现异常:{ex.Message}");
}
}
}
}
优化识别效果的方法
如果识别结果准确率不高,可以通过以下方式优化:
图片预处理
识别前对图片做二值化、降噪、旋转矫正等处理,能显著提升识别准确率。可以使用System.Drawing命名空间下的类实现简单预处理:
using System.Drawing;
using System.Drawing.Imaging;
public static Bitmap PreprocessImage(string imagePath)
{
using (var originalImg = new Bitmap(imagePath))
{
// 转为灰度图
var grayImg = new Bitmap(originalImg.Width, originalImg.Height);
for (int i = 0; i < originalImg.Width; i++)
{
for (int j = 0; j < originalImg.Height; j++)
{
Color color = originalImg.GetPixel(i, j);
int grayValue = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
grayImg.SetPixel(i, j, Color.FromArgb(grayValue, grayValue, grayValue));
}
}
// 二值化处理,阈值设为128
var binaryImg = new Bitmap(grayImg.Width, grayImg.Height);
for (int i = 0; i < grayImg.Width; i++)
{
for (int j = 0; j < grayImg.Height; j++)
{
Color color = grayImg.GetPixel(i, j);
if (color.R > 128)
{
binaryImg.SetPixel(i, j, Color.White);
}
else
{
binaryImg.SetPixel(i, j, Color.Black);
}
}
}
return binaryImg;
}
}
调整识别参数
可以在初始化引擎后设置页面分割模式,适配不同的图片场景:
// 设置为自动页面分割模式,适合多行文本的图片 engine.DefaultPageSegMode = PageSegMode.Auto; // 如果图片是单行的文本,可以设置为单行模式 // engine.DefaultPageSegMode = PageSegMode.SingleLine;
常见问题说明
- 如果运行时提示找不到语言数据文件,需要检查
tessdata目录是否正确,以及语言文件名是否和设置的语言参数匹配 - 识别速度较慢时,可以尝试仅加载需要的语言数据,减少引擎初始化的开销
- 处理高分辨率图片时,可以适当缩放图片尺寸,平衡识别速度和准确率