1

以这种方式使用查找表将颜色从 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) )];
}
4

1 回答 1

0

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

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

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

或通过更改第 16 行:

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

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

于 2016-11-29T01:00:06.457 回答