簡體   English   中英

在C#中以10為基數到16位顏色

[英]Base 10 number to 16 bit colour in C#

我試圖將16位色深的每種可能的65,536種顏色表示為以10為基數的整數,但是遇到了麻煩。

本質上,我需要將基數10轉換為表示16位光譜中該顏色的Color對象。 我認為這里的基礎很重要,但是我無法決定要使用的基礎。

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用於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為紅色,這是兩種情況下最亮的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM