我是转换图像类型的新手。我想确定屏幕上每个像素的颜色。我可以从帧缓冲区中读取颜色,但是它们都在RGB565中。为了跟踪某种颜色,我想将RGB565转换为HSV,以便检查色相。
我已经尝试通过在线转换器将其从RGB565转换为RGB888。例如RGB565'08F5'到RGB888'081BAA'。然后从RGB888到HSL'233 91%35%'。但是,我无法在C代码中使用它。颜色为十六进制格式,每2个存储在一个寄存器中。我为每种颜色制作了一个由四个组成的char数组。
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吗?
答案 0 :(得分:0)
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°
通过移位>>
提取红色/绿色/蓝色分量,然后缩放到0.0-1.0。
所得的亮度是不完美的平均值,即最小和最大颜色分量值的平均值。
色相(colorness)是色环中被三个RGB颜色划分的角度。
饱和度(灰色趋势)由较小的增量确定。