如何使用 C# 加载/显示图像






4.22/5 (25投票s)
2003 年 2 月 24 日
6分钟阅读

745318

26435
本文将通过一个完整的图像查看器应用程序的代码,解释如何在 C# 中将图像加载/显示到窗体中。
涵盖的问题
本文解释如何
- 显示 .NET 框架支持的图像类型(JPG、JPEG、GIF、PNG、TIF 等)到窗体中。
此外,代码还涵盖了
- 访问注册表(创建、写入、检索注册表键值)。
- 使用 WinForm 控件,如状态栏 (StatusBar)、工具栏 (ToolBar)、主菜单 (MainMenu)、图像列表 (ImageList)、计时器 (Timer) 和打开文件对话框 (OpenFileDialog)。
- 处理命令行参数。
- 获取目录中的文件列表。
- 创建 Windows 应用程序安装项目
引言
您总是会因为各种原因需要访问图像。当您拥有 .NET Framework SDK 时,您无需购买其他应用程序来完成这项工作 - 为自己开发一个!借助功能强大的 .NET Framework,处理图像非常简单。本文仅重点介绍如何显示图像。代码本身包含了很多其他内容,包括一个安装程序,这些内容用于实现流行应用程序中的许多标准功能。它们都相当直接;因此您可以自行理解。
除了常规集合外,此应用程序还使用以下命名空间:
System.Drawing
- 用于显示图像System.Drawing.Drawing2D
- 用于显示图像Microsoft.Win32
- 用于访问注册表
代码解释
要加载图像(技术上称为“绘制”),您可以使用以下方法的 30 多个重载中的任意一个:System.Drawing.Graphics.DrawImage(...)
。
正如您所见,DrawImage()
是 Graphics
类的一个方法。因此,在直接使用 DrawImage()
之前,您需要创建一个 Graphics
对象。这个 Graphics
对象将是您要绘制图像的窗体。通常,您会在窗体的 Paint 事件处理程序中创建此对象。Paint 事件处理程序的示例如下:
private void MainForm_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
...
}
当有人调用窗体的 Paint 事件处理程序时,一些关于窗体图形的数据会传递给它。这些数据存储在 PaintEventArgs
对象中,在本例中,该对象为 e。此对象有一个 Graphics
属性 - 这正是我们想要的。您只需使用它来初始化您自己的 Graphics
对象,如下所示:Graphics g = e.Graphics;
现在您有了一个 Graphics
对象,就可以调用 DrawImage()
方法了。但是,参数呢?这正是我们要看的。我将在这里讨论的方法重载是:
public void DrawImage(
Image image,
RectangleF rect
);
此方法在指定位置并以指定大小(通过 RectangleF
对象 rect 隐式传递)绘制指定的 Image
对象(System.Drawing.Image
)。Image
对象包含要绘制的实际图像数据。经过一番思考,您很容易就会明白,使用 RectangleF
对象可以定义图像的大小和位置。
那么我们如何准备这些参数呢?
System.Drawing.Image
是一个抽象类,设计用作 System.Drawing.Bitmap
和 System.Drawing.Imaging.Metafile
的基类。我们感兴趣的是 System.Drawing.Bitmap
。我们使用 Bitmap
类创建一个 Image
对象,如下所示:
MyBitmap = new Bitmap(...);
Bitmap
构造函数有 12 个重载。我将在这里讨论的是:public Bitmap(
string filename
);
您只需要传递要加载的图像文件的路径。然后,您就拥有了一个初始化的 Image
对象。剩下的就是 RectangleF
对象,您可以根据需要进行初始化。完成后,调用 DrawImage()
方法,这样,您就完成了!
上面讨论的操作的示例代码列表
private void MainForm_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
...
...
Graphics g = e.Graphics;
MyBitmap = new Bitmap("c:\\image.bmp");
g.DrawImage( MyBitmap, new RectangleF(MyPoint.X, MyPoint.Y,
MyBitmap.Width*(fScale), MyBitmap.Height*(fScale)) );
...br> ...
}
附加功能的代码
本节讨论应用程序其余部分的实现方式。由于详尽的解释将超出本文的范围,我只会简要描述使用的区域。阅读代码,阅读此描述;您(希望)会理解。下面开始:
My Vars Declaration
(我的变量声明)区域声明了所有使用的变量。这些变量根据其功能进行细分。其中一些在声明时就已初始化为其默认值。
App Main Entry
(应用程序主入口)区域封装了应用程序的 Main
函数以及主窗体构造函数。当应用程序执行时,Main
函数确定是否存在命令行参数(要显示的文件的路径),并调用所需的重载主窗体构造函数,在必要时传递参数。然后,主窗体构造函数会将当前目录设置为参数所在的目录(如果存在)。它还会将 szRequestedFile
变量设置为参数值。
Main Form Load
(主窗体加载)区域包含主窗体加载函数,该函数调用 GetRegistrySettings
函数从当前用户的注册表中检索值,确保计时器未开启,初始化 FileTypes
ArrayList,通过调用 SetControlsToRegistrySettings
函数将所有窗体控件设置为注册表值,通过调用 ProcessDirectory
函数处理当前文件夹,并在正常模式或幻灯片放映模式下显示图像(如果需要)。
Main Form Paint Handler
(主窗体 Paint 事件处理程序)区域包含应用程序中最复杂且最常用的函数——Paint 函数。该函数首先将状态栏文本设置为 Working...
,然后初始化 Graphics
对象,检查“调整大小以适应”选项是 true 还是 false,确定图像显示的位置,绘制图像,最后将状态栏文本设置为 Ready
。
Main Form Paint Handler
(主窗体 Paint 事件处理程序)区域包含许多用于不同活动的函数。
GetRegistrySettings
从注册表中获取当前用户的注册表设置并初始化注册表变量。SetControlsToRegistrySettings
重置窗体控件,以将其设置为当前用户的设置。SetSize
根据当前图像的大小调整窗体大小。ProcessDirectory
查找当前文件夹中的所有图像并初始化FileArray
。GetFilePath
从FileArray
获取当前选定文件的路径。SetPicture
设置变量为选定文件的属性并调用 Paint 事件处理程序。
EventHandlers
(事件处理程序)区域包含菜单事件、工具栏事件、鼠标移动事件、窗体大小调整事件以及计时器已过事件的处理程序。这些事件中的每一个都会在适当的情况下调用 DoAction
函数来执行所需的功能。
DoAction
函数位于 Do Action Handler
(执行操作处理程序)区域。此函数包含此应用程序中可能调用的所有操作。开发此函数是为了减少为工具栏和主菜单重复编写代码。此外,这种模式降低了复杂性。
对于实验者:如果您想添加更多功能,请遵循以下简单步骤:
- 在
My Vars Declaration
(我的变量声明)区域,将所需变量添加到特定部分。这是为了使事情更有条理。 - 展开
Do Action Handler
(执行操作处理程序)区域。在现有 case 列表中,添加一个新的 case 来定义要执行的操作。 - 当发生需要执行新操作的事件时,调用
DoAction
并传入刚刚定义的动作名称。
结论
这是一个非常简单的应用程序,设计和架构都很简单。但它有效!这正是我们想要的。
编程愉快...