如何在c中捕获具有正常纵横比的屏幕图片

本文关键字:常纵横 屏幕 | 更新日期: 2023-09-27 18:25:39

我有宽屏幕监视器,当我在c#中通过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;
    }

如何在c中捕获具有正常纵横比的屏幕图片

您需要裁剪部分屏幕。如果不裁剪,就无法将16:9转换为4:3。

-或-

将屏幕分辨率更改为4:3分辨率,以屏幕截图为例,把它换回来。

在桌面窗口句柄上调用GetWindowRect以获取大小。我不认为您使用的GetSystemMetric调用会考虑菜单栏之类的内容。