8 位色深有 256 种颜色。24 位色深有 16,777,216 种颜色。8 位空间中的每种颜色与 24 位空间中的颜色之间是否存在直接映射?我认为这个问题的答案是肯定的,但对这个答案的评论表明映射只是一个近似值。
我想做的是通过指定 24 位 RGB 值在 24 位颜色空间中创建一个 8 位颜色的调色板。我想我可以使用这个(显然是坏的)逻辑来做到这一点:
红色的 3 位 == 红色的 8 个唯一值,0-7
绿色的 3 位 == 绿色的 8 个唯一值,0-7
蓝色的 2 位 == 蓝色的 4 个唯一值,0-3
255/8 = 32 红色和绿色增量值
255/4 = 64 蓝色增量值
{
"Red": [0,31,63,95,127,159,191,223,255],
"Green": [0,31,63,95,127,159,191,223,255],
"Blue": [0,63,127,191, 255]
}
因此,对于 9 个红色值、9 个绿色值和 5 个蓝色值,我得到 405 种颜色,这是错误的。我知道我需要 8 个红色和绿色值以及 4 个蓝色值,所以我只是稍微调整了一下:
255/ 8 7 = 36.57142857142857 红色和绿色增量值
255/ 4 3 = 85 蓝色增量值
所以这适用于蓝色,但现在我的红色和绿色增量值不是整数。
一旦我弄清楚了映射,我将像这样循环遍历它:
for(r in rgbData.get("Red")) {
for(g in rgbData.get("Green")) {
for(b in rgbData.get("Blue")) {
colors.add("rgb ${r} ${g} ${b}")
}
}
}
这可能是一种完全不正确的方法来做我想做的事,只是想表明我已经尝试过一些东西:)
更新:
我尝试了@Marc B 建议的方法,但似乎不对。例如,我生成的地图中没有白色(255, 255, 255
使用 24 位 RGB)。使用他的方法这对我来说很有意义,因为224, 224, 192
可以看出最高的 RGB 值:
全红 == 111
111 >> 5 == 11100000
全绿 == 111
111 >> 5 == 11100000
全蓝 == 11
11 >> 6 == 11000000
11100000 11100000 11000000 == 224, 224, 192
224, 224, 192 !=白色
这是使用他的方法生成的地图:
{
"Red": [0,32,64,96,128,160,196,224],
"Green": [0,32,64,96,128,160,196,224],
"Blue": [0,64,128,192]
}
以及它生成的调色板:
更新 2:
在做了更多研究之后,我意识到当“X 颜色”(X 是一些数字,如 256、16,777,216 等)被提及时,这些颜色几乎可以是任何颜色。没有预定义的 256 色集是“该”256 色,尽管有(正如一些已经提到的)预定义的 256 色集是“该”256 色的特定实现。我还能够.gpl
在我的组织 wiki 上找到一个 GIMP 调色板文件,它指定了我关心的 256 种颜色,所以我可以从那里复制这些值。