GDI图形编程(12)

 

如果您想修改该图形文件,只需要用图像编辑器从Resources目录中打开它,修改后进行保存即可。每次编译时Visual Studio都会自动选择该文件的最新版本。

将图形嵌入后,我们需要知道如何通过代码来读取它。这是通过Assembly.GetManifest-

ResourceStream函数来实现的。我们只需要将包含了图形文件程序集的路径作为一个字符串传递给该函数即可。该路径包含了几个元素,元素之间用句点分隔:

● 程序集的名称;

● Solution Explorer窗口中包含了资源文件的目录的名称(子目录用句点来分隔,而不是DOS路径格式中的反斜杠)。这个元素只有在需要时才出现;

● 资源文件的文件名。

所有这些元素都是区分大小写的。

可以用下面的代码来编程检索程序集的名称:

String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;

通过代码来查找程序集的名称意味着,当您决定修改程序集的名称后,代码仍然可以继续正常工作。因此我推荐您使用这种方法。一旦使用了这个方法,我们会将重点放到目录及文件名上,这样才能得到完整的资源名称。然后将资源名称传递到GetManifestResourceStream函数中,就能以Stream的方式获得图形资源,Bitmap对象的一个构造函数能够识别Stream对象。将所有这些操作组合到一起,我们就得到程序清单3-9。

程序清单3-9  从一个嵌入资源中载入位图图像

// Declare the Bitmap object that we are going to create

Bitmap myBitmap;

private void InitializeBitmap()

{

// Get the assembly name

String AssemblyName = Assembly.GetExecutingAssembly().GetName().Name;

// Add the resource path and name

String ResourceName = AssemblyName + ".Resources.Rocket.png";

// Generate the resource bitmap -- this will contain our spaceship image

using (System.IO.Stream str =

Assembly.GetExecutingAssembly().GetManifestResourceStream

(Resor-uceName))

{

myBitmap = new Bitmap(str);

}

}

如果指定的资源名称不正确,则GetManifestResourceStream函数也不会抛出异常,而是返回null。当您在实例化一个Bitmap对象时如果碰到一个NullReferenceException异常,那么最大的可能就是由于资源名称不正确所造成的。为了能够对这种情形做出有用的响应,最好是将该操作放在一个try/catch代码块中。这样在捕获了一个NullReferenceException异常后,您可以提供一条更加有用的错误消息。以后当您不知道项目为何不启动时这样做能减少很多令人头疼的问题。

2. 从文件中读取图形

在一些情况下,您还是会希望将图形存放在单独的文件中。例如,允许用户选择文件夹来存放不同的图形,或者允许用户提供自己的图形。要将图像从一个文件加载到一个Bitmap对象中,只需要在实例化对象时提供该文件的文件名即可:

myBitmap = new Bitmap("Graphics.png");

如果指定的图像文件不存在,那么系统会抛出一个FileNotFoundException异常。

3. 关于图形文件格式的一个注意事项

在对用于游戏中的图形文件进行保存时,可以对图形文件的格式进行选择。有些格式明显要比其他格式好,下面对它们做个总结:

● BMP(Bitmap,位图)文件使用了一个简单的内部结构,因此用图形库可以非常容易地与它进行交互。其原因之一是该格式没有应用任何压缩。所以,BMP文件的体积可能会比其他图形格式文件大很多。没有什么原因需要必须使用BMP文件,所以尽量避免使用它们。

● GIF(Graphics Interchange Format,图形交换格式)文件已经成为了一个使用很广泛的图形格式,而不只是被Web所采用。它可以存储最多256色的图片并且对内容进行了压缩以减小文件的大小。它采用了无损压缩的方式,所以图片质量不会下降。在GIF文件中可以存储简单的动画,但在.NET CF中该功能会被忽略,因此没有为我们提供什么优势。它是合适的图形存储格式,不过在压缩率方面,PNG文件更为强大。

● PNG(Portable Network Graphics,便捷网络图像)文件是最近才开发的文件格式,.NET CF支持该文件格式。它可以用24位真彩色来保存图像,并且还支持alpha(透明度)信息。与GIF文件一样,它也采用的是无损压缩,但文件要小于GIF格式的文件。对于非照片图像,我推荐采用这种文件格式。

JPG(JPEG的缩写,Joint Photographic Experts Group开发了这种格式)文件使Web发生了变革,并且在很多其他领域也成为成熟的技术,例如数码相机。这个格式强大的压缩能力可以使图像文件比未压缩时小很多,远远超过了GIF和PNG能提供的压缩率。然而问题在于,JPG使用的是有损压缩技术:对图像进行解压缩后,就不能精确地恢复成原始图像。压缩后的JPG图像的打开速度快但图形会失真,对于那些包含了高对比度色彩区域的图像来说最为明显。例如那些在电脑游戏中常常出现的图片。JPG文件对减小照片图像的文件大小很有帮助,但不太适合手绘的游戏图片。即使对于照片图形,要注意不要把图像压缩到失真的地步。

读书导航