将十六进制 HTML 颜色转换为 Amiga colorregister hex(和返回)
Posted
技术标签:
【中文标题】将十六进制 HTML 颜色转换为 Amiga colorregister hex(和返回)【英文标题】:Converting hexadecimal HTML-color to Amiga colorregister hex (and back) 【发布时间】:2013-03-23 00:55:23 【问题描述】:html 十六进制颜色用 6 位数字(3 个字节,一个所谓的十六进制三元组)编写。 Amiga 的颜色寄存器接受一个定义颜色的字(2 字节,16 位)。
示例:
黄色 - HTML 十六进制 #FFFF00 黄色 - Amiga 颜色寄存器 $0FF0必须有某种算法(或/和)一些工具来以简单的方式在 HTML 颜色和 Amiga 颜色寄存器之间进行转换?或者?...请帮忙:)
【问题讨论】:
你想要像symbolengine.com/amiguideunsatisfactorysoftware.co.uk/index.php?pg=guideml这样的东西 不是 amiga 颜色 4bit-per-channel 所以 4bit alpha、4bit red、4bit green、4bit blue? 您的参考资料:IFF ILBM graphics format、HAM graphics mode。还要记住,不同的 Amiga 型号具有不同的图形功能,因此没有固定的 Amiga 颜色格式;希望我提供的链接会有所帮助,但理想情况下,您需要详细说明您的目标格式以获得更多帮助。 【参考方案1】:这取决于你想在哪里使用值,直接硬件访问或 graphics.library。
对于直接硬件访问或 graphics.library -> setRGB4/loadRGB4,您需要转换为 16 位字,其中不关心 15-12 位:xRGB(每个半字节 4 位)。只需丢弃 HTML 十六进制值的第二个数字即可。
对于 graphics.library(版本 >=39)-> setRGB32/loadRGB32,您需要 3x32 位,并将 MSB 调整到左侧(位 31)。这意味着您获取 HTML 值并将其拆分为 R、G 和 B(每个 2 位)并在 右边 用六个零填充它。
HTML:#123456 setRGB32: #$12000000, #$34000000, #$56000000
要直接通过硬件访问 AA 颜色寄存器,只需在 Google 上搜索即可。这该死的复杂,因为只有 32 个 12 位颜色寄存器,并且通过控制寄存器进行组切换来选择组和下/上半部分。
【讨论】:
【参考方案2】:主要是关于 Floris 的回答,我被引导在 *** 之外的正确轨道上。总结和转换:
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
有一些非常好的复古解释 here 和 here 来做这些事情,而且他们有一个在线颜色位深度减少器。强烈推荐!
注意:EAB 也有一些信息。感谢大家的帮助!管理员,即使我将此设置为正确答案,请随时给 Floris 积分,因为它引导了我正确的轨道,谢谢。
【讨论】:
感谢道具 - 不用担心“积分”。将最佳答案(对您有用的答案)标记为“正确”更为重要,因为这就是 SO 数据库随着时间的推移变得更有价值的方式。因此,将您的答案标记为最佳(带有复选标记)。很高兴我能够为您指明正确的方向! 谢谢,很快还会有更多68xxxx汇编器相关的问题:)【参考方案3】: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
我希望这会有所帮助。
【讨论】:
以上是关于将十六进制 HTML 颜色转换为 Amiga colorregister hex(和返回)的主要内容,如果未能解决你的问题,请参考以下文章