Я использую функцию ниже, чтобы захватить изображение в другой форме.Захваченное изображение затем подается в приложение OCR, в данном случае это tesseract.Проблема, с которой я сталкиваюсь, заключается в том, что когда изображение копируется в растровое изображение, качество падает до 96 точек на дюйм, и я хочу оставить его на уровне от 1 до 1 или не менее 300 точек на дюйм, а также масштабировать его * 2, так как текст на изображениинемного маленькийЯ не писал функцию захвата, и мне интересно, есть ли у кого-нибудь какие-либо рекомендации относительно того, как я могу изменить его, чтобы повысить качество возвращаемого растрового изображения.
С тех пор я узнал, что значение по умолчанию для точек захвата изображений на самом деле составляет96 точек на дюйм, вы можете увеличить любой текст до 120 точек на дюйм, но это не очень помогает в этом случае.Единственный вариант - сделать снимок, а затем изменить его размер.До сих пор я нашел несколько способов сделать это, один из которых я изменил ниже, чтобы использовать stretchBlt, а другой - что я создаю еще одно большее растровое изображение, а затем помещаю его в бит на этом новом увеличенном растровом изображении, которое имеет более высокое значение dpi с таким же бикубическим масштабированием, установленным ввысоко.Пока что я могу получить правильный показатель OCR около 75 - 90%, что неплохо, но я не получил cookie.
public static Bitmap Capture(IntPtr hwnd, int x, int y, int width, int height)
{
//Size contains the size of the screen
SIZE size;
//hBitmap contains the handle to the bitmap
IntPtr hBitmap;
//Get handle to the desktop device context
IntPtr hDC = PlatformInvokeUSER32.GetDC(hwnd);
//Device context in memory for screen device context
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);
//Pass SM_CXSCREEN to GetSystemMetrics to get the X coordinates
//of the screen
size.cx = width;
//As above but get Y corrdinates of the screen
size.cy = height;
//Create a compatiable bitmap of the screen size using the
//screen device context
hBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);
//Cannot check of IntPtr is null so check against zero instead
if (hBitmap != IntPtr.Zero)
{
//Select the compatiable bitmap in the memeory and keep a
//refrence to the old bitmap
IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, hBitmap);
//Copy bitmap into the memory device context
bool b = PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, x, y, PlatformInvokeGDI32.SRCOPY);
//Select the old bitmap back to the memory device context
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
//Delete memory device context
PlatformInvokeGDI32.DeleteDC(hMemDC);
//Release the screen device context
PlatformInvokeUSER32.ReleaseDC(hwnd, hDC);
//Create image
Bitmap bmp = System.Drawing.Image.FromHbitmap(hBitmap);
//Release memory to avoid leaks
PlatformInvokeGDI32.DeleteObject(hBitmap);
//Run garbage collector manually
GC.Collect();
//Return the bitmap
return bmp;
}
else
{
return null;
}
}
#endregion
}
Спасибо R.