c#实现winform屏幕截图并保存的示例

下面是 “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();
}

代码解释如下:

  1. 获取屏幕区域:首先需要获取当前屏幕的大小和位置,这里使用Screen类的GetBounds方法来获取。
  2. 创建一个位图对象:使用Bitmap类创建一个像素位图,大小为当前屏幕的大小。
  3. 创建Graphics对象:使用Graphics类创建一个位图绘制环境,以便进行图像绘制。
  4. 将屏幕绘制到位图上:使用Graphics类的CopyFromScreen方法,将屏幕的内容绘制到位图上。
  5. 根据用户指定的区域,截取矩形:通过Rectangle类创建一个用于截取矩形的对象,并调用Bitmap类的Clone方法进行截取。
  6. 保存为PNG格式文件:通过Bitmap类的Save方法将截图保存为PNG格式的文件。
  7. 显示到Picturebox控件:将截图显示到指定的Picturebox控件中。
  8. 释放资源:由于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;
}

代码解释如下:

  1. 获取指定窗口的句柄:使用FindWindow函数获取指定窗口的句柄,可以通过窗口标题或窗口类名来定位目标窗口。
  2. 获取窗口素材:使用Win32 API函数获取窗口的GDI设备环境句柄,然后使用CreateCompatibleDC函数创建一个设备上下文,再使用CreateCompatibleBitmap函数创建一个位图对象,并将其选入设备上下文中。接着使用BitBlt函数从源设备上下文复制图像到目标设备上下文中。
  3. 将截图保存为文件:使用Bitmap类的FromHbitmap方法将位图对象转换成Bitmap对象,并保存为图像文件。
  4. 释放资源:由于位图对象和设备上下文都是非托管资源,需要手动释放资源。

这个示例使用了Win32 API函数来捕获图像,由于使用非托管代码,需要开启Visual Studio的“允许不安全代码”选项。在业务开发中尽量少使用API,提高业务开发效率与清晰度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#实现winform屏幕截图并保存的示例 - Python技术站

(1)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C#实现倒计时关闭提示框功能

    下面是“C#实现倒计时关闭提示框功能”的完整攻略: 步骤一:创建提示框 在窗体上拖拽一个 Label 控件,设置样式和位置,并将其名称设为 tipsLabel。在窗体加载时使用以下代码显示提示框: tipsLabel.Visible = true; // 显示提示框 步骤二:实现倒计时 定义一个整型变量 countdownTime,并在窗体加载时初始化为需要…

    C# 2023年6月1日
    00
  • C# Stream.Read – 从流中读取数据

    C#的Stream.Read方法作用是从当前流中读取指定数量的字节并将其存储到缓冲区中。 该方法的使用方法如下: public virtual int Read( byte[] buffer, int offset, int count ) 参数说明: buffer:字节型数组,是用来缓存读出的数据的。 offset:整数类型,是buffer参数中的偏移量,…

    C# 2023年4月19日
    00
  • asp.net(c#)实现从sqlserver存取二进制图片的代码

    实现从SQL Server存取二进制图片需要经历以下步骤: 在SQL Server中创建表来存储图片数据。通常,您需要为每个图像分配两个列:一个用于存储二进制数据,另一个用于存储图像的MIME类型。例如: CREATE TABLE [dbo].[ImageTable]( [ID] INT PRIMARY KEY IDENTITY(1,1), [ImageDa…

    C# 2023年5月31日
    00
  • .net core版 文件上传/ 支持批量上传拖拽及预览功能(bootstrap fileinput上传文件)

    .NET Core版文件上传攻略 在.NET Core应用程序中,文件上传是一项常见的任务。本攻略将深入探讨如何使用Bootstrap FileInput插件实现文件上传,并提供两个示例说明。 安装Bootstrap FileInput插件 在.NET Core应用程序中,您需要安装Bootstrap FileInput插件。您可以使用NuGet包管理器或命…

    C# 2023年5月17日
    00
  • C#词法分析器之转换DFA详解

    C#词法分析器之转换DFA详解 什么是词法分析? 词法分析(Lexical Analysis)是编译器中的一个步骤,也称为扫描器(Scanner)。词法分析的主要任务是将程序中的代码转换成一个个Token(标记)。Token是指单词或符号等,是编译器中的最小单位。 词法分析器的输入是源代码,识别出其中的每个Token,每个Token包括 Token种类 和 …

    C# 2023年6月7日
    00
  • C# Linq的Select()方法 – 将序列中的每个元素投影到新形式中

    C# Linq中的Select()是一个用于在查询中选择特定数据,提取它们并创建新的数据结构的方法。该方法可以将集合、列表、数组等多种数据类型中的数据进行选择、投影、转换和过滤,在实际应用中非常实用。下面是详细讲解C#Linq的Select()的完整攻略: 一、Select()简介 Select()方法是Linq中最常用的方法之一,用于对序列中的每个元素应用…

    C# 2023年4月19日
    00
  • EF Core基础入门教程

    EF Core是一个轻量级、可扩展的ORM框架,提供了一种使用C#代码进行数据库访问和操作的方式。在本篇文章中,我们将介绍EF Core的基础入门教程。 安装EF Core 首先,下载并安装.NET Core SDK。然后,可以使用以下命令安装EF Core: dotnet add package Microsoft.EntityFrameworkCore …

    C# 2023年6月3日
    00
  • C# File.ReadAllBytes()方法: 读取指定文件的所有字节

    File.ReadAllBytes()的作用与使用方法 C#的 File.ReadAllBytes(string path) 方法可以从指定的文件中读取出所有字节,并返回一个字节数组。这个方法适用于任何类型的文件,无需事先知道文件的格式,只需要提供文件的路径即可。 语法示例 下面是使用 File.ReadAllBytes 方法的语法示例: byte[] fi…

    C# 2023年4月19日
    00
合作推广
合作推广
分享本页
返回顶部