как сделать снимок экрана с нормальным соотношением сторон в С#

у меня широкоэкранный монитор, и когда я делаю снимок экрана через win API в С#, захваченное изображение будет широким. но я хочу сделать нормальное изображение с соотношением сторон 1:1. я не хочу сначала делать снимок, а затем изменять его размер, потому что элементы на изображении будут искажены.

как я могу это сделать? Это возможно?

я использую этот код:

    public static Bitmap GetDesktopImage()
    {
        //In size variable we shall keep the size of the screen.

        SIZE size;


        IntPtr  hDC = PlatformInvokeUSER32.GetDC(PlatformInvokeUSER32.GetDesktopWindow()); 


        IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);


        do{
        size.cx = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CXSCREEN);

        size.cy = PlatformInvokeUSER32.GetSystemMetrics(PlatformInvokeUSER32.SM_CYSCREEN);



            m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

        } while (m_HBitmap == IntPtr.Zero);
        if (m_HBitmap!=IntPtr.Zero)
        {
            IntPtr hOld = (IntPtr) PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap);

            PlatformInvokeGDI32.BitBlt(hMemDC,0, 0,size.cx,size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
            PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
            PlatformInvokeGDI32.DeleteDC(hMemDC);
            PlatformInvokeUSER32.ReleaseDC(PlatformInvokeUSER32.GetDesktopWindow(), hDC);
            Bitmap res=System.Drawing.Image.FromHbitmap(m_HBitmap);
            PlatformInvokeGDI32.DeleteObject(m_HBitmap);
            return res;

        }

        return null;
    }

person Community    schedule 23.02.2012    source источник


Ответы (2)


вам нужно будет обрезать часть экрана. вы не можете преобразовать 16:9 в 4:3 без кадрирования.

-OR-

Измените разрешение экрана на разрешение 4:3, сделайте снимок экрана, верните его обратно.

person j_mcnally    schedule 23.02.2012
comment
изменение разрешения на 4:3 заняло бы много времени, не так ли? я хочу делать снимки экрана часто каждую секунду. - person ; 23.02.2012
comment
Да, менять разрешение — ужасная идея, поэтому вам следует обрезать изображение до формата 4:3. это единственный вариант, если вы хотите избежать масштабирования. - person j_mcnally; 24.02.2012

Вызовите GetWindowRect на дескрипторе окна рабочего стола, чтобы получить размер. Я не думаю, что вызов GetSystemMetric, который вы используете, учитывает строку меню и тому подобное.

person 500 - Internal Server Error    schedule 23.02.2012
comment
Я тестировал, занимает весь экран. - person ; 23.02.2012