stb_image.h
时间: 2023-07-26 13:06:56 浏览: 62
stb_image.h 是一个开源的 C/C++ 库,用于加载和解码多种格式的图像文件,包括 JPEG、PNG、BMP、GIF、HDR、TIFF 等等。它的特点是非常小巧(只有一个头文件),且能够快速地读取图片数据,因此广泛用于各种游戏、图形处理、计算机视觉等领域的开发中。stb_image.h 支持读取的图像数据可以直接用于 OpenGL、Vulkan、DirectX 等图形 API。
相关问题
stb_image.h读取图片
stb_image.h 是一个非常简单易用的开源图像解码库,它可以读取多种格式的图片文件,包括 PNG、JPEG、BMP、GIF、PSD 等等。
使用 stb_image.h 读取图片非常简单,只需要包含头文件即可:
```c++
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
```
然后调用 stbi_load 函数即可读取图片文件:
```c++
int width, height, channels;
unsigned char* image = stbi_load("test.png", &width, &height, &channels, STBI_RGB);
if (image != nullptr) {
// 使用 image 数据
stbi_image_free(image);
}
```
其中,第一个参数是图片文件的路径,第二个和第三个参数是指针,用来返回图片的宽度和高度,第四个参数是指针,用来返回图片的通道数。最后一个参数表示期望输出的颜色通道格式,可以是 STBI_grey、STBI_grey_alpha、STBI_RGB 或 STBI_RGBA。函数返回的是一个指向图片数据的 unsigned char 指针,如果读取失败则返回 nullptr。
需要注意的是,stbi_load 函数读取的数据是一个字节数组,每个像素的数据大小由通道数决定。例如,如果是 RGB 格式,则每个像素占用 3 个字节。因此,在使用 image 数据时,需要将其转换为正确的像素格式。
opengl使用stb_image.h读入材质
使用 stb_image.h 库读取材质可以让我们很方便地加载各种格式的图片,这里以 OpenGL 中的纹理为例进行说明。首先需要下载 stb_image.h 库,并将其添加到项目中。
使用 stb_image.h 加载纹理的一般步骤如下:
1. 使用 `glGenTextures` 函数生成一个纹理 ID。
2. 使用 `glBindTexture` 函数将纹理 ID 绑定到目标纹理类型上,例如 `GL_TEXTURE_2D`。
3. 使用 `stbi_load` 函数加载图片数据,并获取图片的宽度、高度和颜色通道数。
4. 使用 `glTexImage2D` 函数将图片数据传递给 OpenGL,生成纹理。
5. 使用 `glTexParameteri` 函数设置纹理的参数,例如过滤方式和环绕方式。
6. 释放图片数据。
加载纹理的代码示例如下:
```c++
// 读取图片
int width, height, nrChannels;
unsigned char *data = stbi_load("texture.jpg", &width, &height, &nrChannels, 0);
// 创建纹理对象
unsigned int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
// 设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 生成纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
// 释放图片数据
stbi_image_free(data);
```
注意:在使用 stb_image.h 加载纹理时,需要将图片的 y 轴翻转,否则加载出来的纹理会是倒置的。可以通过设置 `stbi_set_flip_vertically_on_load(true)` 来实现自动翻转。
阅读全文