前文《测试Ocr工具IronOCR(续2:编写圈选图片识别文本的程序)》实现了加载本地图片并圈选图片中的文字区域后调用IronOCR识别文本,同时《开源项目ShareX的源码学习(截屏及矩形区域选择功能)》中梳理了开源项目ShareX中截屏功能的实现思路及实现类。本文记录将ShareX项目中的截屏(主要是截屏和区域截图功能)集成到之前的圈选图片识别文本的程序,实现自动截屏并能圈选并识别截图中的文字。
ShareX开源项目中,ShareX项目中命名空间ShareX中的TaskSettings类用于定义截图前后及过程中的设置,本文直接使用默认设置即可,ScreenCaptureLib项目命名空间ShareX.ScreenCaptureLib中的Screenshot类支持全屏截图,而同命名空间内的RegionCaptureForm窗口类,支持以指定图片为画板,截取并返回画板中选中区域中的图片内容(类似于windows自带的截图功能)。只要使用上述3个类,即可在圈选图片识别文本的程序(后续简称ReadImageTextByIronOcr项目)中实现截图功能。
将ShareX项目的输出类型设置为类库,在ReadImageTextByIronOcr项目中添加对ShareX项目和ScreenCaptureLib项目的引用,然后添加如下代码:
Bitmap canvas;
TaskSettings taskSettings = new TaskSettings();
Screenshot screenshot = TaskHelpers.GetScreenshot(taskSettings);
screenshot.CaptureCursor = false;
//全屏截图,并将其作为后续区域选择的画板
canvas = screenshot.CaptureFullscreen();
//弹出区域选择窗口
using (RegionCaptureForm form = new RegionCaptureForm(RegionCaptureMode.Default, taskSettings.CaptureSettingsReference.SurfaceOptions, canvas))
{
form.ShowDialog();
Bitmap result = form.GetResultImage();
if (result != null)
{
if (m_image != null)
{
m_image.Dispose();
}
m_image = result;
this.pnlImage.Refresh();
UpdateScrollSize();
}
}
编译ReadImageTextByIronOcr项目,报如下的错误信息。百度错误信息,原因大致是ShareX是.net framework4.8编写的,采用了 WinRT技术,但是ReadImageTextByIronOcr项目是.net6编写的,但 .NET 5 或更高版本未内置对 WinRT 的支持。尝试了参考文献1中给出的解决方式,但是没有解决问题。
采用了最笨的解决方法,重新用.net framework4.8编写的ReadImageTextByIronOcr项目(编写过程中才发现.net 6的winform项目中窗口设计器中的控件无法直接复制、粘贴到.net framework4.8的winform窗口设计器中),再编译即可正常编辑运行。
最后是程序运行截图,分别是程序主界面、截图界面、截图后的文字识别界面。
参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/core/tools/sdk-errors/netsdk1149