图形CopyFromScreen方法如何复制到位图中?

3
private void startBot_Click(object sender, EventArgs e)
{
        Bitmap bmpScreenshot = Screenshot();
        this.BackgroundImage = bmpScreenshot;
}

private Bitmap Screenshot()
{

    // This is where we will store a snapshot of the screen
    Bitmap bmpScreenshot = 
        new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height);

    // Creates a graphic object so we can draw the screen in the bitmap (bmpScreenshot);
    Graphics g = Graphics.FromImage(bmpScreenshot);

    // Copy from screen into the bitmap we created
    g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);

    // Return the screenshot
    return bmpScreenshot;
}

我最近在尝试使用C#,正在跟随一些教程,但我不明白的是,如果我删除了Graphics g,为什么就不能将图像作为背景,但代码中从未给变量之间分配任何关系,除了Graphics g = Graphics.FromImage(bmpScreenshot),然后给g设置了一些参数,但是我们却return bmpScreenshot,这根本没有任何意义,我期望返回的应该是g


2
例如;CopyFromGraphics 方法的文档非常启发人心:http://msdn.microsoft.com/zh-cn/library/fw1kt6f9(v=vs.110).aspx - George Stocker
2个回答

8
在Windows中,可以虚拟显示图形的设备。在winapi中,这个概念被称为“设备上下文”,底层表示是一个“句柄”。Graphics类封装了该句柄,但它本身并不存储像素。请注意,Graphics.GetHdc()方法可以获取该句柄。
该类仅包含生成由该句柄表示的设备上输出图形的绘制方法。实际设备可以是屏幕、打印机、元文件或位图。在您自己的代码中,它有很大的优势,因为它可以用于产生您想要的任何输出。因此,将其打印与将其绘制到存储在文件中的位图上一样容易。
因此,通过调用Graphics.FromImage(),您将Graphics对象与位图相关联。它的所有绘制方法都会在位图中设置像素。像CopyFromScreen()一样,它只是将像素从视频适配器的帧缓冲区复制到设备上下文中,从而实际上在位图中设置像素。因此,该代码的预期返回值是实际位图。在此发生之前,应先处理好Graphics对象,因为它已不再有用。换句话说,需要释放底层句柄,以便操作系统释放用于表示设备上下文的内部资源。
那是代码片段中的错误。重复调用此方法会很容易导致程序崩溃,因为Windows拒绝创建更多设备上下文。而垃圾收集器无法及时跟上。应该改写如下:
  using (var g = Graphics.FromImage(bmpScreenshot)) {
      g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
      return bmpScreenshot;
  }

0
要理解的是,Graphics g = Graphics.FromImage(bmpScreenshot)会为传递作为参数的图像创建一个用于绘制的Graphics上下文(bmpScreenshot)。
因此,在创建图形内容之后:
Graphics g = Graphics.FromImage(bmpScreenshot) 当你从屏幕复制时:
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size); 这会操作Graphics g所持有引用的bmpScreenshot位图。
来自文档

image [in]:
Type: Image*

指向将与新Graphics对象关联的Image对象的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接