HTML 十六进制颜色用 6 位数字(3 个字节,一个所谓的十六进制三元组)编写。Amiga 的颜色寄存器采用定义颜色的字(2 个字节,16 位)。
例子:
- 黄色 - HTML 十六进制 #FFFF00
- 黄色 - Amiga 颜色寄存器 $0FF0
必须有某种算法(或/和)一些工具来以简单的方式在 HTML 颜色和 Amiga 颜色寄存器之间进行转换?或者?...请帮助:)
http://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_palettes#12-bit_RGB说 R、G 和 B 中的每一个只有 4 位。
换句话说 - 我怀疑如果你把每个 16 位十六进制对的上半部分串在一起,你就会得到 Amiga 颜色。
在您的示例中:
R = 0xFF
G = 0xFF
B = 0xF0
取上半部分(上面的粗体):
AmigaRGB = ((R & 0xF0) << 4) + (G & 0xF0) + ( B >> 4 )
这确实导致0x0FF0
往另一个方向发展:
R = AmigaRGB & (0x0F00) >> 4
G = AmigaRGB & (0x00F0)
B = AmigaRGB & (0x000F) << 4
如果你想变得花哨,你可以添加一些舍入、抖动等。
当然在 HTML 中使用的最终值是
HTML_RGB = R<<16 + G<<8 + B
我希望这有帮助。
这取决于你想在哪里使用该值,直接硬件访问或 graphics.library。
对于直接硬件访问或 graphics.library -> setRGB4/loadRGB4,您需要转换为 16 位字,其中不关心 15-12 位:xRGB(每个半字节 4 位)。只需丢弃 HTML 十六进制值的第二个数字。
对于 graphics.library (version >=39) -> setRGB32/loadRGB32 您需要 3x32 位,MSB 向左调整(位 31)。这意味着您获取 HTML 值并将其拆分为 R、G 和 B(每个 2 位)并在右侧填充六个零。
HTML: #123456 setRGB32: #$12000000, #$34000000, #$56000000
对于 AA 颜色寄存器的直接硬件访问,只需 google 即可。它该死的复杂,因为只有 32 个 12 位颜色寄存器和通过控制寄存器进行组切换来选择组和下/上半部分。
主要是关于 Floris 的回答,我被引导在 stackoverflow 之外的正确轨道上。总结和转换:
Amiga 有一些不同的图形模式,尤其是 12 位(称为 OCS)和 24 位(称为 AGA)等。要转换为 AGA/24 位,无需进行任何操作。为了转换为 OCS/12 位,我们需要减少值。
一种快速的方法是减少每个 RGB 分量的 4 LSB,就像 Floris 建议的那样,0RGB = #RRGGBB。
或另一种方式,更精确一点:
24 位 RGB 颜色分量值范围为 0-255(即 RGB(255,255,0))等。HTML-hex 也是 24 位的。12 位 RGB 颜色分量的值在 0-15 范围内。
要将 24 位 RGB 颜色转换为 12 位并只保留整数部分,请对每个 24 位 R、G 和 B 分量执行此操作:
downSizedColor = colToDownSize * maxOfRangeToDownConvertTo / maxOfRangeToDownConvertFrom
maxOfRangeToDownConvertTo = 15(12 位最大范围)
maxOfRangeToDownConvertFrom = 255(24 位最大范围)
RGB(200, 143, 96) 的示例,第一个 RGB 分量 (200) 将缩小 RGB-color 11 *11=200*15 / 255*
从 12 位恢复到 24 位
upSizedColor = maxOfRangeToDownConvertFrom / maxOfRangeToDownConvertTo * colToUpSize
示例 187=255/15*11
这里和 这里有一些非常好的面向复古的解释来做这些事情,而且他们有一个在线颜色位深度减少器。强烈推荐!
注意:EAB也有一些信息。感谢大家的帮助!管理员,即使我将其设置为正确答案,请随时给 Floris 积分,因为它引导我走上了正确的道路,谢谢。