19.图片

  • 学习人数 15K+
  • 适合有C语言基础人群学习
avatar
林耿亮

你好编程主讲老师

在前面的章节中,我们使用了图形库中的函数绘制出了各式各样的图形,并且尝试让它们动起来成为动画。另外,我们还在动画中加入了键盘交互功能。使其成为了一个有可玩性的小游戏。

但是,仅仅使用图形库中提供的函数进行绘图,其效果还难以达到一款实际的游戏的标准。要进一步改进图形的精美程度,可以将现有的图片素材,使用程序将其绘制到窗体上。这一节中,我们将讨论如何使用EasyX图形库操作图片。

1. 图片格式

图片是人对视觉感知的物质再现。图片可以由光学设备获取,如照相机。也可以人为创作,如手工绘画。图片可以保存在纸质介质、胶片等等对光信号敏感的介质上。随着数字采集技术和信号处理理论的发展,越来越多的图像以数字形式存储。因而,有些情况下“图片”一词实际上是指数字图像。对于数字图像而言,有多种不同的方法组织和保存图片。常见的文件格式有有bmpgifjpgpng等。

Easyx图形库可以支持以下几种图片格式:bmpgifjpgpngtifemfwmfico。不在支持列表的文件格式无法被图形库读取。

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,你可能之前没有见过它。它是一个宏,用于适配多字节字符宽字符。该宏根据不同的设置,代表着不同的字符指针。

  1. 多字节字符模式下,它是const char *
  2. 宽字符模式下,它是const wchar_t *

多字节字符是一种字符长度可变的模式:一个英文字符占用一个char,而中文字符将会占用两个char

宽字符是一种字符长度恒定的模式:在windows系统下,不论英文还是中文字符,均占用2个字节。

目前我们并不想对字符模式展开讨论。暂时,我们使用较为熟悉的多字节字符,即LPCTSTR会被看做为const char *。在Visual Studio中,默认情况下,将使用宽字符模式。你可以通过以下的办法,将设置修改为多字节字符

在【工程属性】选项卡中,将【配置属性】-【高级】-【字符集】调整为未设置即可。

字符集

传递给loadimage函数第二个参数的内容为图片文件的路径。正如寄出一个快递需要收件人的具体地址,程序中若需要加载图片,那么我们也需要提供该图片的“具体地址”。这个“具体地址”被称作文件路径(file path)。

路径有两种写法:

  1. 绝对路径
  2. 相对路径

绝对路径想必大家已经非常熟悉了,它由盘符所在文件夹文件名组成。

例如:

F盘下,files文件夹下,picture文件夹下,文件名为bear.png的图片。

该文件的绝对路径为:

F:/files/pictures/bear.png

接下来,我们将介绍相对路径。

相对路径是关于两个路径的概念,它以一个文件夹的路径作为基准,根据路径位置的相对性,定义出另外一个路径。

应用相对路径时,常常还需要两个特殊的路径来辅助。

  1. 当前路径,当前正在操作的文件夹路径。用一个点表示.
  2. 父路径,当前路径的上一级文件夹路径。用两个点表示..

若以路径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中的.不代表特殊意义,.必须单独存在才代表特殊意义,..同理。