我正在尝试使用MODI来OCR窗口的程序.它适用于截图我使用win32 interop以编程方式抓取,如下所示:
public string SaveScreenShotToFile()
{
RECT rc;
GetWindowRect(_hWnd, out rc);
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;
Bitmap bmp = new Bitmap(width, height);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
PrintWindow(_hWnd, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
gfxBmp.Dispose();
string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
bmp.Save(fileName);
return fileName;
}
Run Code Online (Sandbox Code Playgroud)
然后将此图像保存到文件中并通过MODI运行,如下所示:
private string GetTextFromImage(string fileName)
{
MODI.Document doc = new MODI.DocumentClass();
doc.Create(fileName);
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
MODI.Image img = (MODI.Image)doc.Images[0];
MODI.Layout layout = img.Layout;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < layout.Words.Count; i++)
{
MODI.Word word = (MODI.Word)layout.Words[i];
sb.Append(word.Text);
sb.Append(" ");
}
if (sb.Length > 1)
sb.Length--;
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
这部分工作正常,但是,我不想OCR整个屏幕截图,只是它的一部分.我尝试以编程方式裁剪图像,如下所示:
private string SaveToCroppedImage(Bitmap original)
{
Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
result.Save(fileName, original.RawFormat);
return fileName;
}
Run Code Online (Sandbox Code Playgroud)
然后OCR这个较小的图像,但MODI抛出异常; 'OCR运行错误',错误代码为-959967087.
为什么MODI可以处理原始位图而不是从中获取的较小版本?
看起来好像答案是给MODI一个更大的画布.我还试图截取控件的屏幕截图并对其进行OCR并遇到同样的问题.最后,我拍摄了控件的图像,将图像复制到一个更大的位图中,并对更大的位图进行了OCR.
我发现的另一个问题是您的图像文件必须具有适当的扩展名.换句话说,.tmp不会削减它.
我一直在我的OCR方法中创建一个更大的源代码,它看起来像这样(我直接处理Image对象):
public static string ExtractText(this Image image)
{
var tmpFile = Path.GetTempFileName();
string text;
try
{
var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
var gfxResize = Graphics.FromImage(bmp);
gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
var doc = new MODI.Document();
doc.Create(tmpFile + ".bmp");
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
var img = (MODI.Image)doc.Images[0];
var layout = img.Layout;
text = layout.Text;
}
finally
{
File.Delete(tmpFile);
File.Delete(tmpFile + ".bmp");
}
return text;
}
Run Code Online (Sandbox Code Playgroud)
我不确定最小尺寸是什么,但似乎1024 x 768就可以了.