## 5.4 使用stbimage解析图片 https://www.aiknowledge.cn/images/cpp-game-engine-book/.webp 这一节来实现图片文件加载与解压。 开源的图片解析库 目前各大游戏引擎常用的图片解析库是 ,支持几乎所有的图片格式,官网地址: https://www.aiknowledge.cn/images/cpp-game-engine-book/.webp 一个绝佳的选择就是 。 导入stb库 下载 源代码,放到项目的 目录下。 这样就可以在项目中使用了。 加载图片并解析 创建类 ,管理图片相关接口。 在使用 解析图片文件之前,先添加相关宏定义: 再导入头文件: 然后编写接口代码,加载图片文件: 然后在 中调用接口。
CLion项目文件位于 samples\texture\load_image
https://www.aiknowledge.cn/images/cpp-game-engine-book/.webp
这一节来实现图片文件加载与解压。
目前各大游戏引擎常用的图片解析库是 FreeImage,支持几乎所有的图片格式,官网地址:
https://freeimage.sourceforge.io/index.html
https://www.aiknowledge.cn/images/cpp-game-engine-book/.webp
一个绝佳的选择就是 stb_image。
std是一个单头文件开源库,每个头文件实现一种功能,官网:https://github.com/nothings/stb
下载stb源代码,放到项目的depends目录下。

这样就可以在项目中使用了。
创建类Texture2D,管理图片相关接口。
在使用 stb_image 解析图片文件之前,先添加相关宏定义:
#define STB_IMAGE_IMPLEMENTATION
再导入头文件:
#include "stb/stb_image.h"
然后编写接口代码,加载图片文件:
Texture2D* Texture2D::LoadFromFile(std::string& image_file_path) { Texture2D* texture2d=new Texture2D(); stbi_set_flip_vertically_on_load(true);//翻转图片,解析出来的图片数据从左下角开始,这是因为OpenGL的纹理坐标起始点为左下角。 int channels_in_file;//通道数 unsigned char* data = stbi_load(image_file_path.c_str(), &(texture2d->width_), &(texture2d->height_), &channels_in_file, 0); if (data!= nullptr) { //根据颜色通道数,判断颜色格式。 switch (channels_in_file) { case 1: { texture2d->gl_texture_format_ = GL_ALPHA; break; } case 3: { texture2d->gl_texture_format_ = GL_RGB; break; } case 4: { texture2d->gl_texture_format_ = GL_RGBA; break; } } } //释放图片文件内存 stbi_image_free(data); return texture2d; }
然后在main.cpp 中调用接口。
//创建Texture void CreateTexture(std::string image_file_path) { Texture2D* texture2d=Texture2D::LoadFromFile(image_file_path); } int main(void) { init_opengl(); CreateTexture(https://www.aiknowledge.cn/images/cpp-game-engine-book/red.webp); compile_shader(); ...... }
调用stbi_load解析图片成功后,返回图像RGB数据(data)、宽、高、通道数。
查看data内存,如下图:
可以看到都是重复的 ed 1c 24 ff,转换到十进制就是237 28 36 255,这正是上一节创建的红色图片的像素颜色值。

https://www.aiknowledge.cn/images/cpp-game-engine-book/这说明已经成功解析了`.webp。