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);