将颜色值从float 0..1转换为字节0..255[英] Converting color value from float 0..1 to byte 0..255

本文是小编为大家收集整理的关于将颜色值从float 0..1转换为字节0..255的处理方法,想解了将颜色值从float 0..1转换为字节0..255的问题怎么解决?将颜色值从float 0..1转换为字节0..255问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

将颜色值从浮点转换为字节的正确方法是什么?起初我认为b=f*255.0应该这样做,但是现在我想,在这种情况下,只有精确的1.0将转换为255,但是0.9999已经是0.9999,这可能不是我想要什么...

似乎b=f*256.0在b=f*256.0的情况下,在1.0的情况下,它会有不必要的情况.1.0.

最后我正在使用:

#define F2B(f) ((f) >= 1.0 ? 255 : (int)((f)*256.0))

推荐答案

1.0是唯一可能出错的情况,因此请单独处理该情况:

b = floor(f >= 1.0 ? 255 : f * 256.0)

另外,可能值得强迫F确实是0 <= f <= 1,以避免由于四舍五入错误而导致的不正确行为(例如F = 1.0000001).

f2 = max(0.0, min(1.0, f))
b = floor(f2 == 1.0 ? 255 : f2 * 256.0)

替代安全解决方案:

b = (f >= 1.0 ? 255 : (f <= 0.0 ? 0 : (int)floor(f * 256.0)))

b = max(0, min(255, (int)floor(f * 256.0)))

其他推荐答案

我一直做过round(f * 255.0).

不需要测试(1个特殊情况)和/或其他答案中的夹紧.出于您的目的,这是否是理想的答案取决于您的目标是要尽可能匹配输入值[我的公式],还是将每个组件分为256个相等的间隔[其他公式].

我公式的可能缺点是0和255间隔仅具有其他间隔的宽度的一半.多年来,我还没有看到任何视觉证据表明这是不好的.相反,我发现最好不要在输入非常接近它之前不要碰到这两个极端 - 但这是一个品味的问题.

可能的好处是,我相信R-G-B组分的相对值(稍微)更准确,对于更广泛的输入值.
尽管我还没有试图证明这一点,但这是我的直观意义,因为对于每个组件,我可以将最接近的整数获得. (例如,我相信,如果一种颜色具有g〜 = 2 x r,则该公式通常会更接近该比率;尽管差异很小,而且256公式还有许多其他颜色更好.因此可能是洗涤.)

实际上,基于256或255基于255的方法似乎可以提供良好的结果.


评估 255 vs 256的另一种方法是检查其他方向 -
从0..255字节转换为0.0..1.0 float.

将0..255整数值转换为范围0.0..1.0 is:

以相等间隔的值的公式
f = b / 255.0

朝这个方向发展,毫无疑问是使用255或256:上面的公式是 的公式,得出相同的结果.观察它使用255.

要了解两个方向上的255公式之间的关系,请考虑此图,如果您只有2位,则值整数值0..3:

使用3的图表,用于两个位,类似于255的8位.转换可以是从上到下,也可以从底部到顶部:

0 --|-- 1 --|-- 2 --|-- 3  
0 --|--1/3--|--2/3--|-- 1
   1/6     1/2     5/6

|是4个范围之间的边界.观察到内部,浮点值和整数值位于其范围的中点.观察到所有值之间所有值之间的间距在两个表示中都是恒定的.

如果您掌握了这些图,您将理解为什么我喜欢255基于256基于256的公式.


索赔:如果您使用/ 255.0在从字节上进行/ 255.0进行float,但是当到 float的字节,然后增加"平均往返"误差.详细信息如下.

这是通过从浮子开始,转到字节,然后返回浮点的最容易测量的.为了进行简单的分析,请使用2位" 0..3"图.

从大量的浮点值开始,从0.0到1.0均匀间隔. 往返将将所有这些值分组为4值.
该图具有6个半间隔长度:
0..1/6,1/6..1/3,..,5/6..1
对于每个范围,平均往返误差为范围的一半,因此1/12(最小误差为零,最大误差为1/6,均匀分布).
所有范围都会给出相同的错误; 1/12是往返时的总体平均误差.

如果您使用任何* 256或* 255.999公式,则往返结果的最多是相同的,但其中一些已移至相邻范围.
对另一个范围的任何变化都会增加误差;例如,如果以前单个浮点输入的误差略低于1/6,则返回相邻范围的中心会导致错误略微 比1/6多. .例如. 0.18以最佳公式=>字节1 => float 1/3〜 = 0.333,对于错误| 0.33-0.18| = 0.147;使用256公式=>字节0 => float 0,用于错误0.18,这是最佳错误0.147的增加.

使用* 4与/ 3的图表.转换是从一行到下一行.
请注意第一行的间距不均匀:0..3/8,3/8..5/8,5/8..1.这些距离为3/8、2/8、3/8. 注意最后一行的间隔边界与第一行不同.

   0------|--3/8--|--5/8--|------1
         1/4     1/2     3/4
=> 0------|-- 1 --|-- 2 --|------3  

=> 0----|---1/3---|---2/3---|----1
       1/6       1/2       5/6

避免这种增加错误的唯一方法是在从字节到浮动时使用一些不同的公式.如果您坚信其中一个256公式,那么我会留给您确定最佳逆公式.
(根据字节值,它应该返回变成字节值的浮点值的中点.除0至0,而3至1.或也许是0到1/8、3至7/8!在上面的图中,它应该将您从中线带回到顶线.)

但是,现在您将有一个难以被告的情况,即您所采用的比值相等值,并将其转换为非平等的浮点值.

如果您使用其他任何值,则这些是您的选择.

其他推荐答案

为什么不尝试

之类的东西
b=f*255.999

摆脱特殊情况f==1,但0.999仍然是255

本文地址:https://www.itbaoku.cn/post/359406.html