65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.22/5 (25投票s)

2003 年 2 月 24 日

6分钟阅读

viewsIcon

745318

downloadIcon

26435

本文将通过一个完整的图像查看器应用程序的代码,解释如何在 C# 中将图像加载/显示到窗体中。

Sample Image - maximum width is 600 pixels

涵盖的问题

本文解释如何

  • 显示 .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.BitmapSystem.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
  • GetFilePathFileArray 获取当前选定文件的路径。
  • SetPicture 设置变量为选定文件的属性并调用 Paint 事件处理程序。

EventHandlers(事件处理程序)区域包含菜单事件、工具栏事件、鼠标移动事件、窗体大小调整事件以及计时器已过事件的处理程序。这些事件中的每一个都会在适当的情况下调用 DoAction 函数来执行所需的功能。

DoAction 函数位于 Do Action Handler(执行操作处理程序)区域。此函数包含此应用程序中可能调用的所有操作。开发此函数是为了减少为工具栏和主菜单重复编写代码。此外,这种模式降低了复杂性。

对于实验者:如果您想添加更多功能,请遵循以下简单步骤:

  • My Vars Declaration(我的变量声明)区域,将所需变量添加到特定部分。这是为了使事情更有条理。
  • 展开 Do Action Handler(执行操作处理程序)区域。在现有 case 列表中,添加一个新的 case 来定义要执行的操作。
  • 当发生需要执行新操作的事件时,调用 DoAction 并传入刚刚定义的动作名称。

结论

这是一个非常简单的应用程序,设计和架构都很简单。但它有效!这正是我们想要的。

编程愉快...

© . All rights reserved.