如何在使用stb_image.h得到data后取出每个像素的RBGA值?

最近在写自己的渲染器,想使用学习opengl的时候使用的这个stb_image.h
首先。

int width, height, nrChannels;
unsigned char *data = stbi_load("container2.png", &width, &height, &nrChannels, 0);

这个函数首先接受一个图像文件的位置作为输入。接下来它需要三个int作为它的第二、第三和第四个参数,stb_image.h将会用图像的宽度、高度和颜色通道的个数填充这三个变量。我们之后生成纹理的时候会用到的图像的宽度和高度的

现在,我如何获得此图像某个像素的RGB?
stbi_load返回的data缓冲区将包含8bits * x * y * channelRequested或x * y * channelCount字节。

unsigned bytePerPixel = nrChannels;
for(int y=0;y<height;y++)
{
	for(int x=0;x<width;x++)
	{
		
unsigned char* pixelOffset = data + (x + y * width) * bytePerPixel;

unsigned char r = pixelOffset[0];
unsigned char g = pixelOffset[1];
unsigned char b = pixelOffset[2];
unsigned char a = nrChannels >= 4 ? pixelOffset[3] : 0xff;
     
    cout<<(int)r<<" "<<(int)g<<" "<<(int)b<<" "<<(int)a<<endl;
    }
}
stbi_image_free(data);
	return 0;
}

来吧! 试试看!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 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)` 来实现自动翻转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值