下面是 “c#实现winform屏幕截图并保存的示例”的完整攻略。
1. 前置知识
在进行本次实验之前,请确保你已经掌握以下内容:
- C#语言基础知识
- Winform应用程序开发和控件使用
- .NET Framework中Graphics和Bitmap类的使用
2. 实现屏幕截图的代码
下面是一个简单的C#程序,利用Graphics和Bitmap类从当前屏幕中截取指定大小和位置的矩形,将截图保存为PNG格式的图片文件并显示到Picturebox控件中:
private void buttonSnapshot_Click(object sender, EventArgs e)
{
// 获取屏幕区域
Rectangle screenArea = Screen.GetBounds(this);
// 创建一个位图对象
Bitmap bmp = new Bitmap(screenArea.Width, screenArea.Height);
// 创建Graphics对象
Graphics g = Graphics.FromImage(bmp);
// 将屏幕绘制到位图上
g.CopyFromScreen(screenArea.Left, screenArea.Top, 0, 0, bmp.Size);
// 根据用户指定的区域,截取矩形
Rectangle rect = new Rectangle(100, 100, 200, 200);
Bitmap newBmp = bmp.Clone(rect, bmp.PixelFormat);
// 保存为PNG格式文件
newBmp.Save("myScreenshot.png", ImageFormat.Png);
// 将截图显示到Picturebox控件中
pictureBox.Image = newBmp;
// 释放资源
newBmp.Dispose();
g.Dispose();
bmp.Dispose();
}
代码解释如下:
- 获取屏幕区域:首先需要获取当前屏幕的大小和位置,这里使用Screen类的GetBounds方法来获取。
- 创建一个位图对象:使用Bitmap类创建一个像素位图,大小为当前屏幕的大小。
- 创建Graphics对象:使用Graphics类创建一个位图绘制环境,以便进行图像绘制。
- 将屏幕绘制到位图上:使用Graphics类的CopyFromScreen方法,将屏幕的内容绘制到位图上。
- 根据用户指定的区域,截取矩形:通过Rectangle类创建一个用于截取矩形的对象,并调用Bitmap类的Clone方法进行截取。
- 保存为PNG格式文件:通过Bitmap类的Save方法将截图保存为PNG格式的文件。
- 显示到Picturebox控件:将截图显示到指定的Picturebox控件中。
- 释放资源:由于Bitmap和Graphics类都是非托管资源,需要自己手动释放资源。
3. 屏幕截图的进阶示例
下面是一个更进阶的屏幕截图示例。这个示例使用了Win32 API函数来捕获窗口的图像,可以针对指定的窗口进行截取,而不是整个屏幕。示例代码如下:
[DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern bool ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("gdi32.dll")]
public static extern bool DeleteDC(IntPtr hdc);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr hgdiobj);
[DllImport("gdi32.dll")]
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);
private void buttonScreenshot_Click(object sender, EventArgs e)
{
// 获取指定窗口的句柄
IntPtr hwnd = FindWindow(null, "窗口标题");
// 获取窗口素材
IntPtr hdc = GetWindowDC(hwnd);
IntPtr hDest = CreateCompatibleDC(hdc);
IntPtr hBitmap = CreateCompatibleBitmap(hdc, 800, 600);
SelectObject(hDest, hBitmap);
BitBlt(hDest, 0, 0, 800, 600, hdc, 0, 0, 13369376);
Bitmap img = Image.FromHbitmap(hBitmap);
img.Save("myScreenshot.bmp", ImageFormat.Bmp);
// 释放资源
DeleteObject(hBitmap);
DeleteDC(hDest);
ReleaseDC(hwnd, hdc);
// 将截图显示到Picturebox控件中
pictureBox.Image = img;
}
代码解释如下:
- 获取指定窗口的句柄:使用FindWindow函数获取指定窗口的句柄,可以通过窗口标题或窗口类名来定位目标窗口。
- 获取窗口素材:使用Win32 API函数获取窗口的GDI设备环境句柄,然后使用CreateCompatibleDC函数创建一个设备上下文,再使用CreateCompatibleBitmap函数创建一个位图对象,并将其选入设备上下文中。接着使用BitBlt函数从源设备上下文复制图像到目标设备上下文中。
- 将截图保存为文件:使用Bitmap类的FromHbitmap方法将位图对象转换成Bitmap对象,并保存为图像文件。
- 释放资源:由于位图对象和设备上下文都是非托管资源,需要手动释放资源。
这个示例使用了Win32 API函数来捕获图像,由于使用非托管代码,需要开启Visual Studio的“允许不安全代码”选项。在业务开发中尽量少使用API,提高业务开发效率与清晰度。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#实现winform屏幕截图并保存的示例 - Python技术站