C# 如何将颜色对话框值发送到 5 位 RGB 中的文本框?



所以我正在创建一个PS2游戏的编辑器。 这个游戏有两个颜色的"系统"。

"正常"RGB R:0 到 255 G:0 到 255B:0 到 255。

或者我认为它是 5bitRGB R

:0 到 31 G:0 到 31 B:0 到 31。并使游戏中的颜色发生变化, 我必须在 十六进制中的 colorDialog 例如: R: 255 G: 176 B: 15 在十六进制中代表FFB00F。

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

到目前为止,美女一切顺利,但 5 位 RGB 只有 2 个字节的"插槽"。

示例:5 位RGB R:31 G:0 B:0,十六进制 1F80。

这就是我不知道该怎么做的地方,因为普通 RGB 的颜色 我可以将十六进制中的值发送到文本框。

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

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

所以我必须将转换后的 colorDialog 值发送到 5bitRGB 对于 2 个字节的文本框,这真的可能吗?

所以我必须将转换后的 colorDialog 值发送到 5 位 2 字节的文本框,这真的可能吗?

当然!5 位 x 3 字段 = 15 位,2 字节 = 16 位。 你甚至会有剩余的空间,但不多。

听起来这只是处理每个字段分辨率降低的问题。 这可以通过按位移位操作来完成,将每个 8 位字段减少到 5 位字段。

您需要将存储值作为 5 位字段右移。 还可以左移值以用作 8 位(字节)字段来设置 Color 属性 - 但请注意,这只是 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);

最新更新