【问题标题】:fast Linear into sRGB快速线性转换为 sRGB
【发布时间】:2014-12-14 07:26:15
【问题描述】:

以这种方式使用 Lookup table 将颜色从 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) )];
}

【问题讨论】:

  • 那么您是查找两个字节还是一个字节?
  • @2501 这不是重复的。链接的问题是请求线性到线性组件的转换。 sRGB 不是线性的。
  • 我正在更新一点代码。 ↑↑↑ ↑↑↑

标签: c++ srgb


【解决方案1】:

是的,我觉得这很好。事实上,您或许可以使用更小的表。

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

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

或通过更改第 16 行:

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

但不是两者兼而有之。任一修复都将舍入误差集中在零。但是,舍入误差还是存在的,而且小得不值一提,所以我觉得你的代码没问题。

【讨论】:

  • 实际上,舍入误差大到足以给出明显不同的结果。
猜你喜欢
  • 2016-04-01
  • 2020-08-09
  • 2016-06-27
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多