在前面的章节中,我们使用了图形库中的函数绘制出了各式各样的图形,并且尝试让它们动起来成为动画。另外,我们还在动画中加入了键盘交互功能。使其成为了一个有可玩性的小游戏。
但是,仅仅使用图形库中提供的函数进行绘图,其效果还难以达到一款实际的游戏的标准。要进一步改进图形的精美程度,可以将现有的图片素材,使用程序将其绘制到窗体上。这一节中,我们将讨论如何使用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
中的.
不代表特殊意义,.
必须单独存在才代表特殊意义,..
同理。