Когда я загружаю изображение как плавающее, используя STB_Image , значения кажутся отключенными. Я создал изображение, чтобы проверить его . (Используемый здесь код RGB [127, 255, 32])
Когда я загружаю это изображение как unsigned char
, используя stbi_load()
, я получаю правильные значения. Но когда я загружаю его как float
, используя 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]
Теоретически это должно вывести те же значения, нижнее значение - правильное, в обеих строках, но по какой-то причине это не так.
Теперь я могу, конечно, использовать значения без знака и написать себе функцию, которая преобразует все в правильные значения с плавающей точкой, но я чувствую, что должен быть способ сделать это, просто используя сам STB_Image.