将十六进制HTML-color转换为Amiga颜色注册十六进制(和返回)



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

例子:

  • 黄色- HTML十六进制#FFFF00
  • Yellow - 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。

用于直接访问硬件或图形。library -> setRGB4/loadRGB4你需要转换为16位字,其中15-12位不关心:xRGB(每个蚕食4位)。只需扔掉HTML十六进制值的每一位数字。

为图形。library (version>=39) -> setRGB32/loadRGB32你需要3x32位的MSB调整到左边(位31)。这意味着您将HTML值拆分为R, G和B(每个2位数字),并在右侧填充6个零。

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

直接硬件访问aa色寄存器,只需谷歌它。这太复杂了,因为只有32个12位的颜色寄存器和银行切换通过一个控制寄存器来选择银行和上下半部分。

关于Floris的回答,我在stackoverflow之外被引导到正确的轨道上。摘要和转换:

Amiga有一些不同的图形模式,特别是12位(称为OCS)和24位(称为AGA)等等。转换为AGA/24位不需要做任何事情。为了转换为OCS/12位,我们需要减少值。

一个快速的方法是为每个rgb组件削减4lsb,就像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组件执行此操作:

downsizecolor = colToDownSize * maxOfRangeToDownConvertTo/maxOfRangeToDownConvertFrom

maxOfRangeToDownConvertTo = 15(12位maxrange)

maxOfRangeToDownConvertFrom = 255(24位maxrange)

的例子对于RGB(200,143,96),第一个RGB组件(200)将被缩小为RGB-color 11*11=200*15/255*

从12位恢复到24位

upsizecolor = maxOfRangeToDownConvertFrom/maxOfRangeToDownConvertTo * colToUpSize

的例子187 = 255/15 * 11

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

注:EAB也有一些信息。谢谢大家的帮助!管理员们,尽管我把这个设定为正确的答案,但请随意给Floris分数,因为它引导了我正确的轨道,谢谢。

最新更新