private int SubStractPage()
{
Image image = CaptureScreen(976, 766, 0, 0, size2);
image.Save(@"C:\ImageTests\screen.jpg", ImageFormat.Jpeg);
using (Tesseract tesseract = new Tesseract(@"C:\langs", "eng", OcrEngineMode.TesseractLstmCombined))
{
tesseract.SetImage(new Image<Bgr, byte>(@"C:\ImageTests\screen.jpg"));
tesseract.Recognize();
string pages = tesseract.GetUTF8Text().Replace(" ", "");
if( pages.Length == 1 || pages.Length == 0)
{
MessageBox.Show(pages);
return 0;
}
else
{
if (pages.Length < 10)
{
MessageBox.Show(pages);
return Convert.ToInt32(pages[pages.Length - 1].ToString()) - 1;
}
else
{
MessageBox.Show(pages);
return Convert.ToInt32((pages[pages.Length - 2].ToString() + pages[pages.Length - 1].ToString())) - 1;
}
}
}
}
该方法获取屏幕截图,然后成功从 tesseract 变量的屏幕截图中检索文本。然后我只是在页面中输入没有空格的数字。然后我返回页码最后一位数字或页码最后两位数字的值。但最终,即使页面在返回之前不为 null,也会变为 Null 并引发错误。这和什么有关系呢?
首先,代码可以稍微简化,消除重复。
其次,要从数字符号中得到数字,只需从符号代码中减去符号代码即可
0。为了检查这是一个数字而不是字母或其他符号,有一种方法char.IsDigit。第三,为了避免与 present 混淆
Convert.ToInt32,它的行为根据传入数据类型的不同而不同,您可以使用int.Parse。要解析数字而不引发异常,可以使用int.TryParse.最后,为了获取最后的 2,有一个用于获取 substring 的字符串操作
Substring。这就是发生的事情:
就这样,现在无论该行是什么文本
pages,这段代码都不会落下。顺便说一句,使用三元运算符可以使代码更短。
对未来的暗示。为了防止应用程序在您预计可能出现错误时突然崩溃,请将代码包装在
try-catch.在某些情况下,调试会更容易。并且可以使用Debug.WriteLine命名空间将异常堆栈跟踪写入 Visual Studio 输出控制台System.Diagnistics。弹出一个窗口,切换到 studio,快速查看崩溃的行号,您可以继续调试应用程序而无需重新启动。