在计算机办公场景中,处理非电子表的统计表文件时,通常需要手动输入数字,用计算器计算,这种操作无需自己效劳,可以拍照上图,或者截图下来,用现有OCR功能识别图中的数字,最后自动完成计算,这些是可以交给计算机自动完成的,不知道网上有没有这样的程序,有条件的就自己动手来实现吧
- 接下来,软件开发用C#语言编写程序,打开Visual Studio开发工具,建一个WinForm项目,建桌面程序,要实现一下三个功能
- 桌面截图
- 数字识别
- 计算器
-
关于桌面截图的实现,请参考这个文章【截屏工具窗口简单实现原理,附详细代码】,截图工具的运行效果
-
关于数字识别,有很多现成的OCR插件,这里用的插件是NuGet程序包中的 Spire.OCR,但只能用在64位机系统环境上
💡 安装Spire.OCR注意事项
点安装后,还需要将其中packages\Spire.OCR.1.8.0\runtimes\win-x64\native
文件夹下所有文件复制到运行文件夹中(通常是Debug)
- 下面是调用图文识别方法的相关代码
/// <summary>
/// Spire.OCR
/// </summary>
/// <param name="imgFileName"></param>
/// <param name="result"></param>
/// <returns></returns>
private bool UseSpireOCR(String imgFileName, out string result)
{
//创建一个OcrScanner类的实例
OcrScanner scanner = new OcrScanner();
//调用OcrScanner.Scan(string fileName)方法扫描图片上的文字
scanner.Scan(imgFileName);
//识别结果
string text = scanner.Text.ToString();
//测试,保存识别文字到txt文件
//File.WriteAllText("output.txt", text);
//System.Diagnostics.Process.Start("output.txt");
if (!String.IsNullOrEmpty(text))
{
//使用这个 会多出提示 仅用于评估目的
int lastIndex = text.LastIndexOf("Evaluation Warning : The version can be used only for evaluation purpose...");
if (lastIndex == 0) text = "";
else if (lastIndex > 0) text = text.Substring(0, lastIndex);//去掉提示
result = text;
return true;
}
result = "";
return false;
}
- 关于计算器,这里实现就简单,基本是由用户选择如何计算,默认是将识别到所有数字相加,求其和,或者求其平均数,求和实现代码如下
//传入图片文件 fileName, 识别结果赋值到 result
if (UseSpireOCR(fileName, out result))
{
var reg = new Regex(@"\d+(.\d+)\s*");
MatchCollection mes = reg.Matches(result);
if (mes.Count>0)
{
var text = new StringBuilder();
foreach(Match m in mes)
{
if (text.Length > 0) text.Append("+" + m.Value.Trim());
else text.Append(m.Value.Trim());
}
textBox1.Text = text.ToString();
text.Clear();
return;
}
textBox1.Text = "";
result = "识别非数字\n" + result;
MessageBox.Show(result, "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
- 计算器的实现代码这里就不列举了,很简单的,请自己实现,界面布局大致如下图
💡 小提示
上面思路是将识别结果输出到文本编辑框中,用于计算器上显示的,其中的计算逻辑就是将用户输入框中的数字和运算符提取出来处理,然后参与运算,最后得出结果显示