SDL(简单直接媒体层) - 渲染其他图像格式
外观
渲染其他图像格式需要使用另一个 SDL 库:SDL_image
。但是,渲染不同图像格式的过程与渲染BMP 图像非常相似。在本节中,我们将演示如何将 PNG 文件渲染到窗口上。
您可以在此GitLab 存储库中下载本节的源代码。所有源代码都存储在此组中。
我们将以以下方式在 wikibook.h
中导入 SDL_image
库
#ifdef _WIN32
#include <SDL/SDL.h> /* Windows-specific SDL2 library */
#include <SDL_image.h>
#else
#include <SDL2/SDL.h> /* macOS- and GNU/Linux-specific */
#include <SDL2/SDL_image.h>
#endif
在初始化 SDL 子系统之后,我们需要使用 IMG_Init
初始化图像子系统。给定参数 int flags
,它在成功时返回 flags
。
我们想要渲染 PNG 文件,所以我们想要使用标志 IMG_INIT_PNG
。还有其他标志,例如 IMG_INIT_JPG
(有关更多信息,请查看 IMG_Init
)。要初始化多个标志,请使用 |
OR 运算符,例如
const int FLAGS = IMG_INIT_PNG | IMG_INIT_JPG;
您还需要使用 IMG_Quit
关闭子系统。
/* Initialise SDL_image */
const int FLAGS = IMG_INIT_PNG;
if (IMG_Init(FLAGS) != FLAGS) {
fprintf(stderr, "SDL_image failed to initialise: %s\n", IMG_GetError());
return -1;
}
/* Automatically execute IMG_Quit at exit */
atexit(IMG_Quit);
由于我们使用的是 SDL_image
,因此我们必须使用 IMG_GetError
代替 SDL_GetError
。
加载图像非常简单,只需在 SDL_Surface
上使用 IMG_Load
函数即可。与 IMG_Init
一样,我们必须使用 IMG_GetError
。
wb->image = IMG_Load(WB_IMAGE_PATH);
if (wb->image == NULL) {
fprintf(stderr, "WikiBook failed to load image: %s\n", IMG_GetError());
return -1;
}
请记住,要确保图像的文件路径是正确的,即 WB_IMAGE_PATH
!我们正在渲染 PNG 图像!