【问题标题】:Converting a Color to and from a 6-bit color将颜色与 6 位颜色相互转换
【发布时间】:2014-12-13 20:23:35
【问题描述】:

我正在尝试将一个字节(6 位 RGB)转换为适当的 System.Drawing.Color 结构。我的字节看起来像这样:

 UNUSED
---------------------------------
| 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
---------------------------------
          R1  R2  G1  G2  B1  B2

所以给出这个:

byte color = 51;

如何将其转换为可以传递给 Color.FromArgb 的最接近的颜色匹配?我知道这可能涉及一些数学公式,但我不知道它是什么。我也需要反过来。我需要将颜色转换为 6 位字节。请为我指明正确的方向。

【问题讨论】:

    标签: c# winforms colors


    【解决方案1】:

    您只需将 RGB 值乘以 64。

    int r = color >> 4;
    int g = (color >> 2) & 0x3;
    int b = color & 0x3;
    
    Color frameworkColor = Color.FromArgb(r * 64, g * 64, b * 64);
    

    同样,回到你的 6 位颜色:

    int r = frameworkColor.R / 64;
    int g = frameworkColor.G / 64;
    int b = frameworkColor.B / 64;
    
    int color = (r << 4) | (g << 2) | b;
    

    【讨论】:

    • 不是 64,而是乘以/除以 85 (255÷3),以便将 110011b 转换为 FF00FFh。
    • 我会乘以 85,但奇怪的是,除以 64。如果除以 85,那么只有 255 会映射到 3,而您可能希望其他字节(例如 254)也被映射到 3。
    • 这几乎可以工作,除非我有“00111111”,它被映射到浅灰色。我希望 00111111 映射到白色,因为所有位都打开了。
    • 这是因为你使用的是 64 而不是 85。3 * 64 只是 192 而不是 255,这会给你白色。将第一段代码中的 64 更改为 85,但保留第二段中的 64。它应该是你想要的。
    • @pbabcdefp -- 是的,解决了它。让我现在尝试返回另一种方式...从颜色到 6 位颜色。
    【解决方案2】:

    你会隔离组件:

    int r = color >> 4;
    int g = (color >> 2) & 3
    int b = color & 3;
    

    然后您可以通过乘以 85 将 0..3 值缩放到 0..255 范围:

    Color c = Color.FromArgb(255, r * 85, g * 85, b * 85);
    

    反之,除以 85 并将它们放在一个字节中:

    int r = c.R / 85;
    int g = c.G / 85;
    int b = c.B / 85;
    
    byte color = (byte)((r << 4) + (g << 2) + b);
    

    【讨论】:

      【解决方案3】:

      我会乘以 85 而不是 64,这样 00 映射到 0,而 11 映射到 255。

      Color.FromArgb(255, 85 * ((color >> 4) & 3), 85 * ((color >> 2) & 3), 85 * (color & 3))
      

      【讨论】:

      • 我将您的答案标记为正确答案,因为您的 85 东西运行良好。不过,我赞成 itsme86 的答案,因为他的公式的其余部分效果很好。我希望我可以将 2 个答案标记为正确,哈哈
      • 我也有这个问题。 “最佳”答案几乎总是两个或多个答案的组合,因此总是很难知道该怎么做。
      猜你喜欢
      • 2011-08-23
      • 2022-11-25
      • 2015-11-24
      • 2016-10-09
      • 1970-01-01
      • 2013-01-24
      • 2019-11-14
      • 2019-02-08
      • 2015-05-19
      相关资源
      最近更新 更多