14.2.3 设计主应用程序

来源:互联网 发布:海川新盟软件下载 编辑:程序博客网 时间:2024/05/16 07:04

14.2.3 设计主应用程序

 

    到目前为止,我们只创建了颜色滤镜,但我们想要我们最终的应用程序,可以处理更一般的图形效果。颜色滤镜,比如,灰阶或亮度,把一个函数应用到每个像素,仅基于该像素的值。其他的效果可能更一般,可以用图像做任何事情,比如,几何变换或模糊。我们在后面将以模糊为例,只是为了说明它的可能性。当我们生成应用程序时,要考虑到这一目标。

    这个应用程序允许我们打开一个图像文件,从列表中选择一个效果,将其应用到这个图像上。我们将为每个效果创建顺序和并行版本,以便可以测量性能。运行效果后,应用程序自动显示应用效果要花多长时间。图 14.2 显示最终应用程序的屏幕截图。

image

图 14.2 完成的图像处理应用程序,对样本图像首先运行灰度,然后再变亮滤镜

 

    在 C# 中,我们可以用 Windows 窗体设计器,创建应用程序的用户界面。应用程序使用 ToolStrip 控件,创建有必要的命令的工具栏,并使用 ToolStripComboBox 控件创建可用的效果列表。打包在 TabControl 的 PictureBox 控件显示图像,所以,我们可以方便地在原始图像和处理过的版本之间切换。

    一旦我们在设计器中创建图形用户界面以后,就可以使用已经实现的滤镜。正如我们刚才所说的,应用程序有足够的灵活性,处理一般效果远超过刚才的滤镜,所以,让我们来看看如何在代码中表示想要的这些效果。

 

创建 F# 中的 Windows 应用程序

 

    不幸的是,在 Visual Studio 中支持的 F# 不包含 Windows 窗体设计器。我们已经看到,在 F# 中,手动创建简单的 图形用户界面,还是容易的,但是,对于这种类型的应用程序,能有一个设计器是有益的。幸运的是,F# 可以方便地引用 C# 库,反之亦然,所以,我们有几个选项可用。

    如果只需要创建窗体,可以创建一个 C# 类库项目,包含图形元素,比如,窗体和用户控件,然后,从 F# 应用程序中引用这个库,并从 F# 中使用图形用户界面组件。这是我们用来创建这个应用程序的 F# 版本的一种方法,所以,如果你下载了这个程序的源代码,你可以看到正是它如何工作的。

    在 C# 中实现用户交互,引用 F# 库,包含所有数据处理的代码,这是另一种方法。如果我们想要使用这种方法,需要在 F# 对象类型中,打包图形效果(如第 9 章中所述),把 F# 代码编译成库。C# 应用程序然后使用这个库中的类型,以运行图形效果。

 

引用效果

 

    颜色滤镜是一个函数,取一种颜色,并返回新的颜色。效果也是函数;然而,参数和结果的类型不同。效果可以处理整个图像,因此,它需要取整个图像作为输入。在 C# 的图形用户界面应用程序中,我们还需要保存效果的名字。后面,当我们讲座如何并行化处理过程时,需要给效果的并行版本,添加一个单独的项目。清单 14.13 显示打包到 EffectInfo 类型的所有这些信息。

 

Listing 14.13 Representation of graphical effect (C#)

 

class EffectInfo { 
  public Func<SimpleColor[,], SimpleColor[,]> Effect { get; set; } 
  public string Name { get; set; } 
}

 

    这个类很简单,只有两个属性。我们已经可能以最简单的方法创建,有可变属的属性。我们只会在图形用户界面内使用这种类型,因此,可能会让我们感觉有点不舒服,但也不用太担心。这个类的第一个属性是运行效果的函数,第二个属性是一个名字。这是类似于 F# 记录,包含一个函数和一个字符串;这就是我们将在这个应用程序的 F# 版本中使用的设计。接下来,我们要讨论如何可以创建 EffectInfo 实例,来表示我们以前实现的颜色滤镜。