【问题标题】:5 Bit RGB (0, 31, 0) to 16 Bit RGB (0, 255, 0)5 位 RGB (0, 31, 0) 至 16 位 RGB (0, 255, 0)
【发布时间】:2011-07-09 16:53:30
【问题描述】:

所以我一直在开始 DS 编程,我注意到要绘制一个像素,颜色必须是 RGB(0, 31, 0)。有什么办法可以将其更改为 RGB(0, 255, 0) 之类的东西?

【问题讨论】:

标签: c rgb pixel nintendo-ds libnds


【解决方案1】:

如果你有一个绿色值g 的范围为 0-255,你可以使用g*31/255 将其转换为 NintendoDS 的 0-31 范围。如果你问我们是否真的可以做一些事情让你的 NintendoDS 为每个频道显示 0-255 的范围,答案是否定的,但是你可以使用抖动(搜索引擎)。

【讨论】:

  • 为什么需要地板?它们是整数
  • 不要忘记,因为零是一个可接受的值,所以有 256 和 32 个离散级别,所以你应该乘以 32 和 256,而不是 31 和 255。你可以想到转换只涉及五个最高有效位。
  • 嗯,实际上我之所以这样做 *31/255 是为了除以先前的最大值并乘以新的最大值;那应该是正确的。 (以相反的顺序,以便整数算术保持更准确)。
  • @Dave:有很多不同的值,但这些是值而不是索引。您确实想乘以 31 并除以 255。31 代表 DS 的最大值,而 255 是 OP 想要表示的方式。您可以将其视为缩小到范围 [0,1],然后再进行备份。
  • 是的,+1 eznme。想了想,还是做对了,把黑色当作特例,然后映射剩下的31个。
【解决方案2】:

5 bit rgb : 31 = 8 bit rgb : 255

所以8 bit rgb = (5 bit rgb * 255 / 31)

例子:

5 bit RGB = 12,3,21

8 bit R = (12 * 255) / 31 = 99
      G = (3 * 255) / 31  = 25
      B = (21 * 255) / 31 = 172

PS:我想你的意思是“5 位 RGB 到 8 位 RGB”在你的标题中。

【讨论】:

  • 不要忘记,因为零是一个可接受的值,所以有 256 和 32 个离散级别,所以你应该乘以 256 和 32,而不是 255 和 31。你可以想到转换只涉及五个最高有效位。
  • @Dave:我不明白。 (0*255)/31 = 0(正确)和 (31*255)/31 = 255(也正确)
  • 想一想,你的方式最适合颜色映射,所以为你和eznme +1。我的理论涉及 32 和 256 个离散级别(确实存在),因此每个级别与下一个级别正好是 8 个级别。但这意味着我的理论将失去 0 的黑度,因此不是一个好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
相关资源
最近更新 更多