快速线性转换为 sRGB
fast Linear into sRGB
这是
以这种方式使用查找表将颜色从 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 )];
但不能两者兼而有之。任一修复都将舍入误差居中为零。但是,舍入误差仍然存在,而且它很小,不值得一提,所以我认为你的代码很好。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 快速线性转换为 sRGB
- 生成用于sRGB到CIELAB色彩空间转换的3DLUT(.3dl文件)