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

本文关键字:16位 颜色 中以 | 更新日期: 2023-09-27 17:49:58

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

本质上,我需要将一个以10为基数的数字转换为一个颜色对象,在16位光谱中表示该颜色。我认为底色在这里很重要,但是我不能决定用哪个底色

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

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;

Color对象包含ARGB格式的颜色。A代表,现在不需要。其他是红色、绿色和蓝色的值。每个都是一个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,这是两种情况下最亮的值。