C#如何将colorDialog值发送到5bitRGB中的文本框?

问题描述:

所以我创建了一个PS2游戏的编辑器。 而这个游戏有两个“系统”的颜色。C#如何将colorDialog值发送到5bitRGB中的文本框?

“正常” RGB R:0〜255 G:0到255 B:0〜255

而或我认为是5bitRGB R:0〜31 G:0〜31 B:0 31.

又使在游戏中的颜色变化, 我所选择的值转换在 ColorDialog类在十六进制例如:R:255 G:176 B:15 以十六进制表示FFB00F。

然后稍后通过十六进制在3个字节的“插槽”中更改这些值。

目前为止美女很好,但5bitRGB只有2个字节的“插槽”。

示例:5bitRGB R:31 G:0 B:0在Hex 1F80中。

而这正是我不知道该怎么做的原因,因为我可以用十六进制的值将文本框中的值发送到正常的RGB 。

然后我通过十六进制将这些值textBox保存在3个字节的“槽”中。

同时通过十六进制颜色变化的5bitRGB插槽 它们只是2个字节的“插槽”。

所以我将不得不发送转换后的colorDialog值为5bitRGB 为2字节的textBox,这是真的吗?

因此,我将不得不转换的ColorDialog类值发送给5bitRGB为textBox中的2个字节,这是真的可能吗?

当然! 5位×3字段= 15位,2字节= 16位。你甚至可以留下余地,但不多。

听起来这只是一个处理每个领域的决议减少的问题。这可以通过逐位移位操作来将每个8位字段减少到5位字段。

您需要将存储的值右移5位字段。您也可以将该值左移,将其用作设置Color属性的8位(字节)字段 - 但请注意,这仅仅是5位值的8位表示形式,并且由于转换为5而导致分辨率损失位将继续存在。您将不得不决定一个约定来处理解决方案的损失 - 无所事事是一种选择。

例如:

// 8-bit color values 
byte rValue = 255; 
byte gValue = 127; 
byte bValue = 63; 

// set color 
pictureBox1.BackColor = Color.FromArgb(rValue, gValue, bValue); 

// 5-bit color values 
var rBits = new BitArray(5, false); 
var gBits = new BitArray(5, false); 
var bBits = new BitArray(5, false); 

// bit position comparison operator 
byte op = 0x80; 

// convert to 5-bit arrays 
for (int i = 0; i < 5; i++) 
{ 
    if (rValue > op) { rBits[i] = true; rValue -= op; } 
    if (gValue > op) { gBits[i] = true; gValue -= op; } 
    if (bValue > op) { bBits[i] = true; bValue -= op; } 
    op >>= 1; 
} 

byte rRetrieved = 0; 
byte gRetrieved = 0; 
byte bRetrieved = 0; 

// bit position comparison operator 
op = 0x80; 

// convert back to 8-bit bytes 
for (int i = 0; i < 5; i++) 
{ 
    if (rBits[i]) { rRetrieved += op; } 
    if (gBits[i]) { gRetrieved += op; } 
    if (bBits[i]) { bRetrieved += op; } 
    op >>= 1; 
} 

// set color - note loss of resolution due to shifting 
pictureBox1.BackColor = Color.FromArgb(rRetrieved, gRetrieved, bRetrieved);