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)
, then g
给出了一些参数,但是我们return bmpScreenshot
我希望这没有任何意义g
被退回?
可以显示图形的设备在 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)