colors - 将 24 位颜色转换为 4 位 RGBI

标签 colors

我需要将 24 位颜色转换为 4 位 RGBI(1 位表示红、绿、蓝 + 强度)。

转换为 3 位 RGB 相当简单:如果大于 127,则设置颜色位,否则清除。但是,所有三个 channel 只有一个强度位,那么正确的设置方法是什么(如果有)?

首先我考虑将 8 位 channel 分为三个部分,如下所示:

  • 如果 0 <= color <= 85,则清除 rgbi-color 位
  • 如果 86 <= color <= 170,则设置 rgbi-color 位
  • 如果 171 <= color <= 255,则设置 rgbi 颜色位和强度

但后来我认为正确的方法可能是仅当三个 channel 中的两个大于 127 时才设置强度位。但在这种情况下,纯 R、G 或 B 将不会设置强度(例如,如果是 rbg(0,0,200)

非常感谢任何建议

最佳答案

找到最近的4-bit RGBI的简单方法颜色的近似是分别考虑强度位的两种可能性。也就是说,首先找到颜色最接近的 RGB0 和 RGB1 近似值(这很容易做到,只需在适当的点划分每个颜色轴即可),然后确定这些近似值中哪个更好。

下面是该算法的简单 C 语言伪代码描述:

// find the closest RGBx approximation of a 24-bit RGB color, for x = 0 or 1
function rgbx_approx(red, green, blue, x) {
    threshold = (x + 1) * 255 / 3;
    r = (red > threshold ? 1 : 0);
    g = (green > threshold ? 1 : 0);
    b = (blue > threshold ? 1 : 0);
    return (r, g, b);
}

// convert a 4-bit RGBI color back to 24-bit RGB
function rgbi_to_rgb24(r, g, b, i) {
   red = (2*r + i) * 255 / 3;
   green = (2*g + i) * 255 / 3;
   blue = (2*b + i) * 255 / 3;
   return (red, green, blue);
}

// return the (squared) Euclidean distance between two RGB colors
function color_distance(red_a, green_a, blue_a, red_b, green_b, blue_b) {
   d_red = red_a - red_b;
   d_green = green_a - green_b;
   d_blue = blue_a - blue_b;
   return (d_red * d_red) + (d_green * d_green) + (d_blue * d_blue);
}

// find the closest 4-bit RGBI approximation (by Euclidean distance) to a 24-bit RGB color
function rgbi_approx(red, green, blue) {
    // find best RGB0 and RGB1 approximations:
    (r0, g0, b0) = rgbx_approx(red, green, blue, 0);
    (r1, g1, b1) = rgbx_approx(red, green, blue, 1);

    // convert them back to 24-bit RGB:
    (red0, green0, blue0) = rgbi_to_rgb24(r0, g0, b0, 0);
    (red1, green1, blue1) = rgbi_to_rgb24(r1, g1, b1, 1);

    // return the color closer to the original:
    d0 = color_distance(red, green, blue, red0, green0, blue0);
    d1 = color_distance(red, green, blue, red1, green1, blue1);

    if (d0 <= d1) return (r0, g0, b0, 0);
    else return (r1, g1, b1, 1);
}

或者,您可以简单地使用任何通用的固定调色板颜色量化算法。如果您的实际调色板不是像上面的代码假设的那样是纯均匀间隔的 RGBI 调色板,而是类似的东西,这可能会产生更好的结果。 CGA tweaked RGBI palette .

关于colors - 将 24 位颜色转换为 4 位 RGBI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644778/

相关文章:

r - scale_fill_manual定义NA值的颜色

emacs - 如何在emacs中复制粘贴而没有源字体锁定?

android - 更改笔划颜色会更改以前的笔划颜色

r - 基本 R 图的颜色已更改 - 我可以恢复到旧调色板吗?

android - 上下文/覆盖主题颜色

jquery 颜色,RGB 到 HSL 并返回

c++ - 如何将彩色文本输出到 Linux 终端?

python - 使用字典有条件地格式化列(Pandas)

c# - 在 WPF 中将整数转换为颜色

colors - 如何使用 vba 在 Excel 2007 中找到条件格式单元格的填充颜色值?