Я конвертирую изображение RGB в формат EXR, используя OpenEXR, по следующему коду;
int w = 1024;
int h = 768;
Array2D<Rgba> p (h, w);
QString fileName = "Penguins.jpg";
QImage Image = QImage(fileName);QRgb c;
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
c = Image.pixel(x,y);
Rgba &p = px[y][x];
p.r = qRed(c)/255.0;
p.g = qGreen(c)/255.0;
p.b = qBlue(c)/255.0;
p.a = 1;
}
}
У меня вопрос, почему преобразованное изображение имеет другой цвет? Вы можете увидеть данное изображение и преобразованное (открытое в Adobe Photoshop) ниже;
Значения RGB, содержащиеся в большинстве распространенных форматов изображений, таких как JPEG, имеют гамма-коррекцию. Значения RGB в OpenEXR являются линейными. Вам нужно сделать преобразование для каждого пикселя, чтобы сделать его линейным.
Правильное преобразование в линейное будет формула sRGB. Однако для быстрого теста вы можете приблизить его, взяв мощность 2,2:
p.r = pow(qRed(c)/255.0, 2.2);
p.g = pow(qGreen(c)/255.0, 2.2);
p.b = pow(qBlue(c)/255.0, 2.2);
Других решений пока нет …