RGB颜色从0-1到0-255转换 - 强度概率分布



我想知道,我是否(以及我所工作的互联网上的每个人(是否以错误的方式转换颜色。显然,当我想将颜色从0-255范围转换为0-1时,我只需将值除以255,对吗?当我想以另一种方式去时,我会乘以。

但这是正确的吗?想象一下,我的颜色是某些数学的结果(像双线性插值一样简单,或者是您可能想要的(或敢于(。那么,这可能不是最好的方法。从某个角度来看,从浮点转换时0-1到整数0-255,我想将间隔分为相同大小的256个块1比例尺(和圆,0和255的"块"或"垃圾箱"仅是其他大小的一半。即颜色强度的概率分布是不正确的。

我认为这在实践中通常不是一个问题。例如。在高端VFX中,始终使用浮点颜色(0-1加上超级布莱克斯/超白(,并将其转换为0-255,仅作为最后一步。不过,它仍然困扰着我。什么是正确的答案?

不一定是这种情况,让我们使用2位量化(4个级别(来可视化它:

如果我们除以4(相当于8位256(

0.00 to 0.24 = Black  
0.25 to 0.49 = Dark Gray  
0.50 to 0.74 = Light Gray  
0.75 to 0.99 = White  

您可以注意到垃圾箱是平均分离的(大小为0.25(,如果我们乘以256,一切都是正确的。除1.0外,它将映射到256。我们可以通过将值从0到255进行修复。

if (value > 255) {
    value = 255
}

但是,如果我们想简化计算并避免需要夹紧,我们可以除以3(相当于255,8位(

0.000 to 0.333 = Black  
0.334 to 0.666 = Dark Gray  
0.667 to 0.999 = Light Gray  
1.000 to 1.333 = White  

常见的误解是最后一个垃圾箱(纯白色(仅映射到1.0的奇异值,但事实并非如此,它延伸到:

4/3     = 1.33333 for 2 bits
256/255 = 1.00392 for 8 bits

用于数学计算,将1.0至1.00392视为纯白色,0至0.00392为纯黑色,所有垃圾箱的大小应相等(0.00392(。

注意:如果我们使用此表示形式,则使用Math.round(value * 255)是错误的!
它将导致显示错误的颜色,所有垃圾箱都会将其大小的左侧移动到左侧。
您应该使用Math.floor(value * 255),甚至应该直接铸造到INT (int)(value * 255)

但是,如果您希望这些值代表垃圾箱的中值,则可以使用Math.Round((。但是新垃圾箱将是:

-0.166 to 0.166 = Black  
 0.167 to 0.500 = Dark Gray  
 0.501 to 0.833 = Light Gray  
 0.834 to 1.166 = White  

只选择一个表示形式,然后坚持下去。如果您在整个代码中使用不同的表示形式,请确保进行适当的转换。

我建议使用中位垃圾箱,如果您执行正确且准确的科学计算(例如插值,聚类等(,否则将Float施放到INT中的速度更快,并且更适合于快速的图形操作。

要获得正确的结果,您必须将其乘以255。(999 ...(然后将其置于int,否则您将在1/的关键点上获得错误的值4 1/2和3/4等...-您不能包括减法器,因为这将导致x接近0值的负值。以前的答案只是恢复了最高值的恢复,然后将错误的结果取得到X = 1 ...

的结果错误结果

这是我发现正确工作的最简单答案...

信用:https://forum.arduino.cc/index.php?topic=78108.msg590057#mmsg590057

最新更新