我正在尝试使用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;
}
然后将此图像保存到文件中并通过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();
}
这部分工作正常,但是,我不想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;
}
然后OCR这个较小的图像,但MODI抛出异常; 'OCR运行错误',错误代码为-959967087。
为什么MODI可以处理原始位图,但不能处理从它获取的较小版本?
答案 0 :(得分:7)
看起来好像答案是给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;
}
我不确定最小尺寸是多少,但似乎1024 x 768就可以了。
答案 1 :(得分:3)
是的,这个帖子中的帖子帮助我开始工作,这里我要添加:
试图下载图片(小图片),然后是ocr ...
- 处理图像时,似乎它们的大小必须是2的幂! (能够ocr图像:512x512,128x128,256x64 ..其他尺寸大多失败(如1103x334))
透明背景也造成了麻烦。在使用powerof2边界,白色背景创建新的tif时,我获得了最佳效果,将下载的图像粘贴到其中,保存。
缩放图像对我来说没有成功,因为OCR得到了错误的结果,特别是对于“ü”这样的“德国”字符
最后我还使用了:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH,false,false);
使用办公室2003年的modi
问候
womd
答案 2 :(得分:1)
modi ocr和我一起工作。 尝试将图像保存在“tif”中。
抱歉,我的英文不好答案 3 :(得分:1)
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
这意味着我不希望它检测方向而不修复任何偏斜。现在,该命令适用于所有图像,包括2400x2496 tiff。
但是图像应该是.tif。
希望这能帮助面临同样问题的人们。
答案 4 :(得分:0)
我遇到了与某些图像相同的问题“OCR运行问题”。我重新缩放了图像(在我的情况下缩小了50%),即缩小了尺寸和瞧!它有效!
答案 5 :(得分:0)
使用
时遇到了同样的问题doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
在一个2400x2496的tiff文件上。将其大小调整为50%(缩小大小)修复了问题并且该方法不再抛出异常,但是,它错误地识别文本,如检测“relerence”而不是“reference”或“712017”而不是“712517” 。我一直在尝试不同的图像大小,但它们都有相同的问题,直到我将命令改为
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
这意味着我不希望它检测方向而不是修复任何偏斜。现在,该命令适用于所有图像,包括2400x2496 tiff。
希望这可以帮助面临同样问题的人
答案 6 :(得分:0)
解决了我的情况是使用照片编辑器(Paint.NET)并最多使用锐化效果。
我也用过: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH,false,false);