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
被归还?
可以显示图形的设备在 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
位图。
从文档中:
图片 [在]:
类型:图像*指向将与新图形对象关联的图像对象的指针。