以这种方式使用查找表将颜色从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) )];
}发布于 2016-11-29 01:00:06
是的,我觉得挺好的。实际上,您可能可以使用一个较小的表。
如果我觉得有点迂腐,我会说,从浮点到int的转换总是会使值稍微变暗一些。您可以通过更改第6行来改进这一点:
float Lin = (i+0.5) / (float) (table.length-1);或通过更改第16行:
return 255 & table[(int)( Linear*(table.length-1) + 0.5 )];但不是两者都是。要么将舍入错误的中心设置为零。但是,舍入错误仍然存在,而且它非常小,不值得提及,所以我认为您的代码很好。
https://stackoverflow.com/questions/27467254
复制相似问题