将十六进制HTML颜色转换为Amiga颜色寄存器十六进制(和后面)

时间:2013-04-01 21:20:33

标签: html assembly hex 68000 amiga

HTML十六进制颜色用6位数字写成(3个字节,一个所谓的A hex三元组)。 Amiga的颜色寄存器需要一个字(2个字节,16位)来定义颜色。

示例:

  • 黄色 - HTML十六进制#FFFF00
  • 黄色 - Amiga颜色寄存器$ 0FF0

必须有某种算法(或/和)一些工具,可以轻松地在HTML颜色和Amiga颜色注册表之间进行转换?或者?...请帮助:)

3 个答案:

答案 0 :(得分:5)

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

我希望这会有所帮助。

答案 1 :(得分:3)

这取决于您要使用的值,直接硬件访问或graphics.library。

直接硬件访问或graphics.library - &gt; setRGB4 / loadRGB4你需要转换为16位字,其中15-12位不关心:xRGB(每个半字节4位)。只需丢弃HTML十六进制值的每秒数字。

对于graphics.library(版本&gt; = 39) - &gt; setRGB32 / loadRGB32需要3x32位,MSB调整到左侧(第31位)。这意味着您获取HTML值并将其拆分为R,G和B(每个2个挖掘)并用六个零填充到右侧

HTML:#123456 setRGB32:#$ 12000000,#$ 34000000,#$ 56000000

对于直接硬件访问AA颜色寄存器,只需google它。它该死的很复杂,因为只有32个12位颜色寄存器和通过控制寄存器的存储区切换来选择存储体和下半部分/上半部分。

答案 2 :(得分:2)

大多数情况下,对于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颜色11 * 11 = 200 * 15/255 *

从12位恢复到24位

upSizedColor = maxOfRangeToDownConvertFrom / maxOfRangeToDownConvertTo * colToUpSize

实施例 187 = 255/15 * 11

有一些非常好的面向复古的解释herehere来做这些事情,加上他们有一个在线颜色位深度减少器。强烈推荐!

注意:EAB也有一些信息。谢谢大家的帮助!管理员,即使我把它设置为正确的答案,随时给予Floris积分,因为它带领我走上正轨,谢谢。