1

我在这个问题上读到了一种舍入技术。 将颜色值从浮点 0..1 转换为字节 0..255

您在 0 到 1 的范围内有一个浮点数,并且您希望将其映射到 0-255 的字节整数范围。因此,您将 0-1 数字乘以 255f,然后将该数字转换为一个字节。因为所有转换都只是浮动的小数部分,所以您需要一种方法来实现它,因此当它被限制时,它将达到所需的舍入结果。

我的想法是在将其转换为字节之前添加 0.5f。

但是,我在链接的那个页面上注意到了一些我不理解的新内容。相反,他将 0-1 映射到 256,这会以某种方式实现四舍五入的结果。

我测试了值以查看它是否有效并且看起来确实有效。我只是不明白为什么。有人可以给我一个证明吗?

4

2 回答 2

4

这是Fencepost 错误的一个特例。在您只有两种颜色(黑色和白色)的情况下,您可以看到最简单的解释。因此很容易看出您必须将区间 0-1 除以2

这可以通过将间隔乘以稍小的除法数并截断结果来轻松实现。这也是随机数生成器返回值 >= 0 且 < 1.0 以轻松获得等概率值的原因。

所以在这个例子中你得到了正确的结果,value = floorf(1.9999*x)。

问题是,虽然颜色索引以数字 1 结尾,但实际上有两种颜色(0 和 1),因此间隔必须除以 2。因此,对于 256 种颜色 (0-255),您需要除以数字 256。人们可能会注意到 0 也是一个有效值,并且必须正确映射。

于 2013-04-15T17:08:03.743 回答
2

Simply put, if your were representing colors with the integers "0, 1, 2, 3", you'd need to pick something to be your 0.5 case. If you pick the 1, you'd get 0.0, 0.5, 0.75, 1.0. If you pick the 2 you'd get 0.0, 0,25, 0.5, 1.0. There's no way to make those intervals equal, but integer colors can't have a decimal. The only solution would be to have eliminated the 0.5 case entirely and used even intervals, 0.333 0.666, but they chose not to do that. So color 127/255 currently evaluates to 0.5, instead of 0.498, because it's taken as 128/256. Unfortunately, adding 1 to the numerator and denominator would cause color 0 to be interpreted as 1/256 instead of 0/255

于 2014-09-05T12:26:01.343 回答