快速线性转换为 sRGB

fast Linear into sRGB

本文关键字:sRGB 转换 线性      更新时间:2023-10-16
这是

以这种方式使用查找表将颜色从 0.0 到 1.0 的线性空间转换为从 0 到 255 的 sRGB 空间的好方法?
例如,在 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) )];
}

是的,这对我来说看起来不错。事实上,您可能可以使用较小的表。

如果我觉得迂腐,我会说你从浮点数到 int 的转换总是使值稍微暗一些。您可以通过更改第 6 行来改进它:

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

或者更改第 16 行:

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

但不能两者兼而有之。任一修复都将舍入误差居中为零。但是,舍入误差仍然存在,而且它很小,不值得一提,所以我认为你的代码很好。