C#中基数为10到16位的颜色

时间:2014-03-12 21:53:42

标签: c# math colors base

我试图将16位颜色深度的每种可能的65,536种颜色表示为基数10整数,但我遇到了麻烦。

基本上我需要将基数为10的数字转换为表示16位频谱中该颜色的Color对象。我认为这里的基础非常重要,但我无法决定去哪个基地。

2 个答案:

答案 0 :(得分:2)

16位色彩空间使用5位用于红色通道,6位用于绿色,5用于蓝色通道。您可以使用按位运算提取每个通道的值。

int color = /* your 16 bit value here */

int red = color & 31;
int green = (color >> 5) & 63;
int blue = color >> 11;

要转换回来,请使用

int color = red | green << 5 | blue << 11;

答案 1 :(得分:1)

Color对象包含ARGB中的颜色。 A代表Alpha,你现在不需要。其他是红色,绿色和蓝色的值。它们中的每一个都是8位值。 ARG和B一起形成32位颜色。

16位颜色开始时很奇怪,因为红色和蓝色有5位而绿色有6位。

要将这些转换为8位,您可以对它们进行位移(或将它们相乘)。

int input = Your16BitColorValue;
var color = new Color;

color.R = input & 0x1F; /* Isolate 5 least significant bits */
color.G = (input & 0x7E0) >> 5; /* Isolate 6 middle bits and shift them 5 right */
color.B = (input & 0xF800) >> 11; /* Isolate left 5 bits and shift them right */

这非常准确。例如,对于绿色,一个6位数字,最高值(所有6位设置)为63.设置的位的下半部分为7(最大值的1/9)。当您将这两个位置转换为8位数时,您得到28,这也是255的1/9。如果您尝试其他几个示例,您会发现每个示例都非常接近。最大的舍入误差,你会发现在频谱的最后。例如63,这是16位中最亮的绿色,将导致252,几乎 32位中最亮的绿色,但不完全是。

要解决这个问题,您可以使用一个因子,如下所示:

Value32 = Value16 * 255 / Max16Value

其中Max16Value为31(红色和蓝色)或63(绿色)。例如:

Color.B = ((input >> 11) & 0x1F) * 255 / 31;

这样,输入中的红色31实际上会在32位颜色中产生255的红色,这是两种情况下最亮的值。