将十六进制HTML颜色转换为Amiga的颜色寄存器十六进制数(以及相反操作)

4

HTML十六进制颜色使用6个数字(3个字节,也称为十六进制三元组)表示。Amiga的颜色寄存器使用一个单词(2个字节,16位)来定义颜色。

例如:

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

是否有某种算法和/或工具可以轻松地在HTML颜色和Amiga颜色寄存器之间进行转换?或者还有其他方法吗?...请帮忙:)


你想要类似于http://www.symbolengine.com/amiguide/这样的东西吗? http://www.unsatisfactorysoftware.co.uk/index.php?pg=guideml - Ritesh Kumar Gupta
Amiga的颜色不是每通道4位吗?也就是4位alpha、4位红色、4位绿色和4位蓝色? - Marc B
1
为您提供参考资料:IFF ILBM图形格式HAM图形模式。请注意,不同的Amiga型号具有不同的图形功能,因此没有固定的Amiga颜色格式;希望我提供的链接能够帮助您,但最好您需要更多的解释来获取更多的帮助。 - Spudley
3个回答

6

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

我希望这能有所帮助。

我在想,关于最后一条语句,移位运算符的优先级是否比加法运算符低呢? 请参见:https://en.cppreference.com/w/c/language/operator_precedence - user20554888
@buckRabbit 感谢你指出了这一点。我本来并没有打算将其作为可执行语句,但现在我添加了括号以使其更加明确无误。 - Floris

3

这取决于您要在哪里使用值,是直接硬件访问还是图形库。

对于直接硬件访问或使用 graphics.library -> setRGB4/loadRGB4,您需要将其转换为16位字,其中第15-12位是不关心的:xRGB(每个半字节4位)。只需丢弃 HTML 十六进制值的每个第二个数字即可。

对于 graphics.library(版本>=39) -> setRGB32/loadRGB32,您需要 3x32 位,并将 MSB 左移(位 31)。这意味着您需要将 HTML 值拆分为 R、G 和 B(每个2位),并向右填充6个零。

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

对于直接访问 AA 颜色寄存器的硬件访问,只需搜索一下。它非常复杂,因为只有32个12位颜色寄存器,并且需要通过控制寄存器进行银行切换以选择银行和下/上半部分。


2
大多数涉及Floris答案的问题,我被引导到了Stack Overflow之外的正确轨道。总结和转换:
Amiga有一些不同的图形模式,特别是12位(称为OCS)和24位(称为AGA)等。要转换为AGA / 24位,无需进行任何操作。要转换为OCS / 12位,我们需要减少值。
一种快速的方法是将每个RGB组件的4个LSB切掉,就像Floris建议的那样,因此0RGB =#RRGGBB。
或者另一种方式,精度更高:
24位RGB颜色分量值范围从0-255(即RGB(255,255,0))等。 HTML十六进制也是24位。 12位RGB颜色分量的值在0-15范围内。
将24位RGB颜色转换为12位并仅保留整数部分,请为每个24位R、G和B分量执行以下操作:
downSizedColor = colToDownSize * maxOfRangeToDownConvertTo / maxOfRangeToDownConvertFrom
maxOfRangeToDownConvertTo = 15(12位maxrange)

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积分,因为它让我走上了正确的轨道,谢谢。


1
感谢您的赞誉,不用担心"分数"的问题。更重要的是,将最佳答案(对您有效的答案)标记为“正确”,因为这是 Stack Overflow 数据库随着时间变得更有价值的方式。所以请将您的答案标记为最佳答案(打上勾)。很高兴我能帮您指明正确的方向! - Floris
谢谢,很快还会有更多与68xxxx汇编相关的问题 :) - Beamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接