如何使用fromHdc方法制作位图图像



我想通过使用获取桌面窗口句柄的方式获取特定区域,如下图所示。

    [DllImport("user32.dll")]
    static extern IntPtr GetDesktopWindow();
    [DllImport("user32.dll")]
    static extern IntPtr GetDCEx(IntPtr hwnd, IntPtr hrgn, uint flags);
    [DllImport("user32.dll")]
    static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);
    public void ScreenShot()
    {
        try
        {
            IntPtr hwnd = GetDesktopWindow();
            IntPtr hdc = GetDCEx(hwnd, IntPtr.Zero, 1027);
            Point temp = new Point(40, 40);
            Graphics g = Graphics.FromHdc(hdc);
            Bitmap bitmap = new Bitmap(mPanel.Width, mPanel.Height, g);
            g.CopyFromScreen(PointToScreen(temp) , PointToScreen(PictureBox.Location) ,  PictureBox.Size);

}

这段代码实际上有效,但我想获得一个由 CopyFromScreen 过程制作的复制图像。我尝试使用像Graphics.FromImage(bitmap)这样的代码,但是我无法获得我想要的图像...我的意思是,复制图像。当我使用来自Hdc的图形对象时,我找不到获取位图图像的方法。我必须使用DC。有什么合适的方法吗??

你在这里走错了路,你不需要获取桌面句柄,CopyFromScreen 现在会将屏幕上的任何内容复制到目标图形,因此您需要从图像创建图形对象。下面的代码创建屏幕左上角的 500x500 图像。

public static void ScreenShot()
{
    var destBitmap = new Bitmap(500, 500);
    using (var destGraph = Graphics.FromImage(destBitmap))
    {
        destGraph.CopyFromScreen(new Point(), new Point(), destBitmap.Size);
    }
    destBitmap.Save(@"c:bla.png");
}

如果你真的有HDC,你需要使用gdi32的BitBlt:

[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

相关内容

  • 没有找到相关文章

最新更新