【问题标题】:C# How to send colorDialog value to a textBox in 5bitRGB?C#如何将colorDialog值发送到5bitRGB中的文本框?
【发布时间】:2017-08-29 01:00:45
【问题描述】:

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

“正常”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。

然后稍后通过 Hex 在 3 个字节的“槽”中更改这些值。

目前为止美得这么好,但 5bitRGB 只有 2 个字节的“槽”。

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

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

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

同时通过 Hex 改变 5bitRGB 颜色的插槽 它们只是 2 个字节的“槽”。

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

【问题讨论】:

    标签: c# hex rgb


    【解决方案1】:

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

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

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

    您需要将存储值右移为 5 位字段。您还可以将值左移以用作 8 位(字节)字段来设置 Color 属性 - 但请注意,这只是 5 位值的 8 位表示,并且从移到 5 时会损失分辨率-bits 将持续存在。您将不得不决定一个约定来处理分辨率的损失 - 什么都不做是一种选择。

    例如:

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

    【讨论】:

      猜你喜欢
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多