Захват изображения в другой форме, как поддерживать dpi с помощью растровых изображений - PullRequest
3 голосов
/ 09 сентября 2010

Я использую функцию ниже, чтобы захватить изображение в другой форме.Захваченное изображение затем подается в приложение 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.

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Несмотря на то, что вы могли бы легко захватить большее растровое изображение, перетаскивая на большее целевое растровое изображение, вы не получили бы больше никакой детализации, так как у вас нет доступа к исходному изображению, из которого вы захватываете форму. отображение. Вы всегда будете ограничены разрешением экрана.

Чтобы уточнить (поскольку вы говорите, что вы новичок), если вы возьмете изображение размером 1200x1200 пикселей и нарисуете его в области размером 120x120 пикселей, затем захватите эту область и вернитесь к растровому изображению, которое также имеет размер 1200x1200 пикселей. , вы потеряете много деталей в процессе. Если у вас нет доступа к исходному изображению, вы не можете восстановить потерянные пиксели.

1 голос
/ 09 сентября 2010

Вместо использования BitBlt вы можете использовать StretchBlt .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...