在前面的章节中,我们使用了图形库中的函数绘制出了各式各样的图形,并且尝试让它们动起来成为动画。另外,我们还在动画中加入了键盘交互功能。使其成为了一个有可玩性的小游戏。
但是,仅仅使用图形库中提供的函数进行绘图,其效果还难以达到一款实际的游戏的标准。要进一步改进图形的精美程度,可以将现有的图片素材,使用程序将其绘制到窗体上。这一节中,我们将讨论如何使用EasyX图形库操作图片。
1. 图片格式
图片是人对视觉感知的物质再现。图片可以由光学设备获取,如照相机。也可以人为创作,如手工绘画。图片可以保存在纸质介质、胶片等等对光信号敏感的介质上。随着数字采集技术和信号处理理论的发展,越来越多的图像以数字形式存储。因而,有些情况下“图片”一词实际上是指数字图像。对于数字图像而言,有多种不同的方法组织和保存图片。常见的文件格式有有bmp、gif、jpg、png等。
Easyx图形库可以支持以下几种图片格式:bmp、gif、jpg、png、tif、emf、wmf、ico。不在支持列表的文件格式无法被图形库读取。
2. IMAGE对象
受EasyX支持的图片格式可以被加载并存储在IMAGE对象当中。对象是一个C++中的概念,被用于面向对象风格的编程,它由C语言中的结构体升级而来。目前我们暂不考虑面向对象风格的编程模式,你暂时可以把对象看做一个结构体,这个结构体中的各个成员,保存了图片的各种信息。
你可以这样声明一个IMAGE对象,目前这个对象内部还没有存放任何图片信息。
IMAGE img;
3. 填充、显示IMAGE对象
现在,我们为刚刚声明的IMAGE对象填充图片信息。可以使用loadimage函数加载一个图片文件,如果加载成功,可以把这个图片的信息填充到IMAGE对象中。
loadimage函数
函数loadimage的函数原型如下:
// 从图片文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg,
LPCTSTR pImgFile,
int nWidth = 0,
int nHeight = 0,
bool bResize = false
);
各参数意义如下:
| 参数 | 类型 | 意义 |
|---|---|---|
| pDstImg | IMAGE对象指针 | 待填充的IMAGE对象指针 |
| pImgFile | LPCTSTR | 图片路径 |
| nWidth | int | 图片的拉伸宽度。加载图片后,会拉伸至该宽度。如果为 0,表示使用原图的宽度。 |
| nHeight | int | 图片的拉伸高度。加载图片后,会拉伸至该高度。如果为 0,表示使用原图的高度。 |
| bResize | bool | 是否调整 IMAGE 的大小以适应图片 |
第一个参数为待填充的IMAGE对象指针。
第二个参数的类型为LPCTSTR,你可能之前没有见过它。它是一个宏,用于适配多字节字符与宽字符。该宏根据不同的设置,代表着不同的字符指针。
- 多字节字符模式下,它是
const char *。 - 宽字符模式下,它是
const wchar_t *。
多字节字符是一种字符长度可变的模式:一个英文字符占用一个char,而中文字符将会占用两个char。
宽字符是一种字符长度恒定的模式:在windows系统下,不论英文还是中文字符,均占用2个字节。
目前我们并不想对字符模式展开讨论。暂时,我们使用较为熟悉的多字节字符,即LPCTSTR会被看做为const char *。在Visual Studio中,默认情况下,将使用宽字符模式。你可以通过以下的办法,将设置修改为多字节字符。
在【工程属性】选项卡中,将【配置属性】-【高级】-【字符集】调整为未设置即可。

传递给loadimage函数第二个参数的内容为图片文件的路径。正如寄出一个快递需要收件人的具体地址,程序中若需要加载图片,那么我们也需要提供该图片的“具体地址”。这个“具体地址”被称作文件路径(file
path)。
路径有两种写法:
- 绝对路径
- 相对路径
绝对路径想必大家已经非常熟悉了,它由盘符和所在文件夹及文件名组成。
例如:
F盘下,files文件夹下,picture文件夹下,文件名为bear.png的图片。
该文件的绝对路径为:
F:/files/pictures/bear.png
接下来,我们将介绍相对路径。
相对路径是关于两个路径的概念,它以一个文件夹的路径作为基准,根据路径位置的相对性,定义出另外一个路径。
应用相对路径时,常常还需要两个特殊的路径来辅助。
- 当前路径,当前正在操作的文件夹路径。用一个点表示
.。 - 父路径,当前路径的上一级文件夹路径。用两个点表示
..。
若以路径F:/files基准,根据相对路径./picture/bear.png,即可找到图片bear.png。其中,相对路径中的.,代表当前路径,即F:/files。因此,./picture/bear.png等价于F:/files拼接上/pictures/bear.png。
相对路径./picture/bear.png有时候还可以省略最前面的./写为picture/bear.png。
注意bear.png中的.不代表特殊意义,.必须单独存在才代表特殊意义,..同理。