【问题标题】:Convert RGB to 8 bit将 RGB 转换为 8 位
【发布时间】:2019-05-23 20:13:28
【问题描述】:

所以,我正在使用 Javascript 创建一个图形化的 Bash PS1 生成器。用户可以从调色板(jscolor 库)中为他们想要的任何元素选择任何颜色。我得到的值是该颜色的 RGB 表示。我想将该值转换为 0-255 之间的数字,以便它可以在 Bash 中表示。

例子:

输入:#000000

输出:0

输入:#FFFFFF

输出:255

任何其他输入转换为最接近的 8 位表示

**我检查了这个post,但答案不是很有效(我得到输出 215 用于输入#FFFFFF)。

【问题讨论】:

  • 您将遇到的问题是您将“丢失”一些颜色,并且没有一个很好的方法可以均匀地“丢失”它们。如果您将每个 8 位颜色分量值压缩为 3 位,您仍然必须丢弃其中一个(红色、绿色或蓝色)以适合 8 位。如果将它们压缩为 2 位,则可以“保持”色彩平衡,但色彩分辨率会相当“颗粒感”。
  • @mojo 在你看来,我应该给用户有限的颜色选项(红色、绿色、蓝色、灰色等)吗?
  • 这取决于你想用这些颜色做什么。有几种处理颜色的方法。例如,GIF 使用 8 位值作为对 24 位颜色值的引用。任何 GIF 中只能有 256 种独特的颜色,但它们可以是 1600 万种 24 位颜色中的任何一种。
  • 我曾经写过一个function,它用于基于终端的光线追踪器,但在 Bash 中。我使用this Q&A 进行算法。

标签: bash algorithm colors rgb


【解决方案1】:

由于使用了调色板,您将获得 0xFFFFFF 的输出 215。

所谓的“网络安全”调色板包含 216 (6^3) 种颜色,由组件等级 (ir * 255/5, ig * 255/5, ib * 255/5) 形成,用于影响 ir,ig,ib = 0..5,以及 40 种附加颜色,如“金钱绿色”或“嫩鲑鱼”。

因此,此类调色板的索引 215 确实包含0xFFFFFF RGB。

【讨论】:

    【解决方案2】:

    这是一个(坏的)主意:

    let rgb24=0x99FFBB
    let r2="($rgb24 >> 16) >> 6"
    echo "$r2"
    let g2="(($rgb24 >> 8) % 256) >> 6"
    echo "$g2"
    let b2="($rgb24 % 256) >> 6"
    echo "$b2"
    
    let rgb8="($r2 << 4) + ($g2 << 2) + $b2"
    
    printf "%x\n" $rgb24
    printf "%x\n" $rgb8
    

    所以现在,每个颜色强度都有两个位:红色、绿色和蓝色。

    你如何展示这样的东西取决于你。最简单的做法是将每个分量颜色位移 6 位,然后重建原始的 24 位颜色值。每种颜色总共有四种不同的强度,或 64 种独特的颜色。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      相关资源
      最近更新 更多