Graphics CopyFromScreen 方法如何复制到位图中

本文关键字:复制 位图 CopyFromScreen 方法 何复制 Graphics | 更新日期: 2023-09-27 18:30:40

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被归还?

Graphics CopyFromScreen 方法如何复制到位图中

可以显示图形的设备在 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;
  }

要理解的是,Graphics g = Graphics.FromImage(bmpScreenshot)创建了一个图形上下文,用于绘制作为参数传递的图像(bmpScreenshot)。

因此,在创建图形内容后:
Graphics g = Graphics.FromImage(bmpScreenshot)

从屏幕复制时:
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);

这将操作Graphics g包含引用的bmpScreenshot位图。

从文档中:

图片 [在]:
类型:图像*

指向将与新图形对象关联的图像对象的指针。