快速线性转换为sRGB

时间:2014-12-14 07:26:15

标签: c++ srgb

使用查找表以这种方式将色彩从线性空间从0.0转换为1.0到sRGB空间从0到255是很好的方法吗?
例如,在 Java

byte[] table;
void initializeTable()
{
    table = new byte[65536];
    for(int i = 0; i < table.length; i++){
         float Lin = i / (float) (table.length-1);
         if(Lin<=0.0031308f)
            table[i] = (byte)(255*(Lin*12.92f));
         else
            table[i] = (byte)(255*(  (1+0.055f)*Math.pow(Lin,1/2.4f)-0.055f)  );
    }
}

int sRGB(float Linear/*in range 0..1*/) // Will return  0..255 integer sRGB
{
    return 255 & table[(int)( Linear*(table.length-1) )];
}

1 个答案:

答案 0 :(得分:0)

是的,这看起来很好。实际上,您可以使用较小的表格。

如果我感到迂腐,我会说你从float到int的转换总是会使值变得更暗。您可以通过更改第6行来改进它:

float Lin = (i+0.5) / (float) (table.length-1);

或改变第16行:

return 255 & table[(int)( Linear*(table.length-1) + 0.5 )];

但不是两者兼而有之。要么将舍入误差中心固定为零。但是,舍入错误仍然存​​在,并且它非常小,不值得一提,所以我认为你的代码很好。