当我使用STB_Image将图像加载为浮点数时,这些值似乎已关闭。我创建了一个图像来测试它。(这里使用的 RGB 代码是 [127, 255, 32])
当我加载这个图像时,unsigned char
我stbi_load()
得到了正确的值。但是当我将它加载为float
using时,stbi_loadf()
我得到了对我来说没有意义的错误值。
这是我用于测试的代码:
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include <sstream>
#include <iomanip>
#include <iostream>
#include <string>
struct ColorF {
float r;
float g;
float b;
float a;
std::string toString() {
std::stringstream stream;
stream << std::fixed << std::setprecision(2) << "[" << this->r << ", " << this->g << ", " << this->b << ", " << this->a << "]";
return stream.str();
}
};
struct ColorUC {
unsigned char r;
unsigned char g;
unsigned char b;
unsigned char a;
std::string toString() {
std::stringstream stream;
stream << "[" << (float) this->r / 255.0f << ", " << (float) this->g / 255.0f << ", " << (float) this->b / 255.0f << ", " << (float) this->a / 255.0f << "]";
return stream.str();
}
};
int main() {
int width, height, channels;
float* image = stbi_loadf("test.png", &width, &height, &channels, STBI_rgb_alpha);
// print content of first pixel of the image
std::cout << ((ColorF*) image)->toString() << std::endl;
unsigned char* jpeg = stbi_load("test.png", &width, &height, &channels, STBI_rgb_alpha);
// print content of first pixel of the image
std::cout << ((ColorUC*) jpeg)->toString() << std::endl;
stbi_image_free(image);
stbi_image_free(jpeg);
return 0;
}
我得到的测试输出是这样的:
[0.22, 1.00, 0.01, 1.00]
[0.50, 1.00, 0.13, 1.00]
从理论上讲,这应该在两行上打印出相同的值,底部的值是正确的值,但由于某种原因它没有。
现在我当然可以使用 unsigned char 值并为自己编写一个将所有内容转换为正确浮点值的函数,但我觉得应该有一种方法可以只使用 STB_Image 本身来做到这一点。