【问题标题】:Why do I need to multiply RGB values by 256 instead of 255 while converting from a 0.0-1.0 interval ?为什么在从 0.0-1.0 区间转换时需要将 RGB 值乘以 256 而不是 255?
【发布时间】:2013-04-15 16:44:18
【问题描述】:

我在这个问题上读到了一种舍入技术。 Converting color value from float 0..1 to byte 0..255

您有一个介于 0 到 1 之间的浮点数,并且您想将其映射到 0-255 的字节整数范围。因此,您将 0-1 数字乘以 255f,然后将该数字转换为一个字节。因为所有转换都只是浮动的小数部分,所以您需要一种方法来实现它,因此当它被降低时,它将获得所需的舍入结果。

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

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

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

【问题讨论】:

    标签: floating-point integer rounding


    【解决方案1】:

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

    这可以通过将间隔乘以稍小的除法数字并截断结果来轻松实现。这也是随机数生成器返回 >= 0 和

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

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

    【讨论】:

      【解决方案2】:

      简单地说,如果您用整数“0、1、2、3”表示颜色,您需要选择一些作为 0.5 的情况。如果你选择 1,你会得到 0.0、0.5、0.75、1.0。如果您选择 2,您将得到 0.0、0,25、0.5、1.0。没有办法使这些间隔相等,但整数颜色不能有小数。唯一的解决方案是完全消除 0.5 的情况并使用偶数间隔 0.333 0.666,但他们选择不这样做。所以颜色 127/255 当前计算为 0.5,而不是 0.498,因为它被视为 128/256。不幸的是,在分子和分母上加 1 会导致颜色 0 被解释为 1/256 而不是 0/255

      【讨论】:

      • 我的陈述是事实和主题。如果有人对答案有疑问,请尝试发表评论而不是投反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多