【问题标题】:How to convert RGB565 to HSL Color in C如何在 C 中将 RGB565 转换为 HSL 颜色
【发布时间】:2019-06-24 11:14:34
【问题描述】:

我是转换图像类型的新手。我想确定屏幕上每个像素的颜色。我可以从帧缓冲区中读取颜色,但它们都是 RGB565。为了跟踪某种颜色,我想将 RGB565 转换为 HSV,以便检查色调。

我已经尝试通过在线转换器将其从 RGB565 转换为 RGB888。例如 RGB565 '08F5' 到 RGB888 '081BAA'。然后从 RGB888 到 HSL '233 91% 35%'。但是,我无法使用 c 代码进行此操作。颜色采用 HEX 格式,每 2 存储在一个寄存器中。我为每种颜色制作了一个由四个组成的字符数组。

int colorcodes = IORD_ALTERA_AVALON_PIO_DATA(0x08000000 + 123204);
char colorcodesInHex[9];
snprintf(colorcodesInHex, 9, "%08x\n", colorcodes);

char firstColor[4];
char secondColor[4];

for(int i = 0; i <= 7; i++)
{
    if(i <= 3)
    {
        firstColor[i] = colorcodesInHex[i];
    }
    else if (i >= 4 && i <= 7)
    {
        secondColor[i - 4] = colorcodesInHex[i];
    }
}

有人知道如何将 RGB565 转换为 RGB888,然后在 C 中转换为 HSL?

【问题讨论】:

  • 小毛病:颜色存储在各种整数位中。它们不是十六进制的,“十六进制”是表示为文本的数字的属性,而不是存储在计算机内存中的数字(当然,除非您将其存储为文本字符串)。
  • 你有什么问题?提取 R、G 和 B 值 ?知道如何重新调整这些值?如何根据重新缩放的值计算 H、S 和 L?
  • 嗯,实际上我对以上所有问题都感到困惑。但是以二进制形式提取 R、G 和 B 确实有效。然而,将它们重新缩放到 RGB888,然后再缩放到 HSL 对我来说是一个很大的谜团。我确实在网上找到了一些如何做到这一点的例子,但它们都不是 C 语言。
  • 那么请显示您正在工作的代码部分(提取 R、G 和 B 值),以及您尝试的不工作部分。

标签: c rgb 16-bit hsl 24-bit


【解决方案1】:
  int rgb565 = ...; // 16 bit value with rrrrrggggggbbbbb

  double r = ((rgb565 >> 11) & 0x1F) / 31.0; // red   0.0 .. 1.0
  double g = ((rgb565 >> 5) & 0x3F) / 63.0;  // green 0.0 .. 1.0
  double b = (rgb565 & 0x1F) / 31.0;         // blue  0.0 .. 1.0

  double cmax = max(r, max(g, b));
  double cmin = min(r, min(g, b));
  double delta = cmax - cmin;

  // hue (in °)
  double h_degrees = delta == 0.0 ? 0.0
                     : cmax == r ? 60 * (((g - b) / delta) % 6)
                     : cmax == g ? 60 * (((b - r) / delta + 2)
                     : /* cmax == b ? */ 60 * (((r - g) / delta + 4);

  // saturation
  double s = delta == 0.0 ? 0.0 : delta / (1.0 - abs(cmax + cmin - 1));

  // lightness
  double l = (cmax + cmin)/2;

RGB565 是红绿蓝 16 包装。以上是RGB565到HSL的转换。

色调为 0° 到 360°

  • red/green/blue 分量通过位移&gt;&gt; 提取,然后缩放到 0.0 - 1.0。

  • 得到的亮度是一个不完美的平均值,即最小和最大颜色分量值的平均值。

  • 色调(色度)是色环中的一个角度,分为三种 RGB 颜色。

  • 饱和度、灰度趋势由较小的 delta 决定。

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    相关资源
    最近更新 更多