在C ++中从RGB转换为HDR图像格式(EXR格式)

时间:2014-03-07 16:53:52

标签: c++ image qt image-processing openexr

我正在使用openexr通过以下代码将RGB图像转换为EXR格式;

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中打开); Given Image .jpg Converted Image .exr

1 个答案:

答案 0 :(得分:1)

大多数常见图像格式(如JPEG)中包含的RGB值都经过伽马校正。 OpenEXR中的RGB值是线性的。您需要对每个像素进行转换以使其成为线性。

正确的线性转换是sRGB formula。但是,对于快速测试,您可以通过获取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);