C中快速,优化和准确的RGB HSB转换代码

我正在寻找在纯C中快速,准确地实现RGB到HSB和HSB到RGB。请注意,我特别寻找色调,饱和度,亮度而不是 HSL(亮度)。

当然,我已经广泛搜索了这一点,但速度在这里至关重要,我正在寻找有关可靠,快速,可靠代码的任何具体建议。

首先

HSB和HLS被开发用于指定用户必须以数字方式指定颜色的年龄中的数字色调,饱和度和亮度(或色调,亮度和饱和度)。 HSB和HLS的常用配方在颜色视觉特性方面存在差异。 既然用户可以直观地选择颜色,或选择与其他媒体相关的颜色(如PANTONE),或者使用基于感知的系统,如L * u * v *和L * a * b *,则应放弃HSB和HLS [来源] ]

在这里查看opensource Java实现

Boost库(我知道,它是C ++) 似乎一次包含转换为HSB但现在我只能找到亮度转换( 这里 )

这是标准C中的直接实现。

这是 – 没有进一步的背景 – 尽可能好。 也许你想要更多地了解一下

  • 如何存储RGB样本(比特/像素开始!?)
  • 如何存储像素数据(您是否希望有效地转换较大的缓冲区,如果是,那么组织是什么)
  • 你想如何表示输出(我现在假设浮动)

我可以想出一个进一步优化的版本(也许可以很好地利用SSE4指令…)

所有这一切,当使用优化编译时,这不会太糟糕:

#include  #include  typedef struct RGB_t { unsigned char red, green, blue; } RGB; typedef struct HSB_t { float hue, saturation, brightness; } HSB; /* * Returns the hue, saturation, and brightness of the color. */ void RgbToHsb(struct RGB_t rgb, struct HSB_t* outHsb) { // TODO check arguments float r = rgb.red / 255.0f; float g = rgb.green / 255.0f; float b = rgb.blue / 255.0f; float max = fmaxf(fmaxf(r, g), b); float min = fminf(fminf(r, g), b); float delta = max - min; if (delta != 0) { float hue; if (r == max) { hue = (g - b) / delta; } else { if (g == max) { hue = 2 + (b - r) / delta; } else { hue = 4 + (r - g) / delta; } } hue *= 60; if (hue < 0) hue += 360; outHsb->hue = hue; } else { outHsb->hue = 0; } outHsb->saturation = max == 0 ? 0 : (max - min) / max; outHsb->brightness = max; } 

典型用法和测试:

 int main() { struct RGB_t rgb = { 132, 34, 255 }; struct HSB_t hsb; RgbToHsb(rgb, &hsb); printf("RGB(%u,%u,%u) -> HSB(%f,%f,%f)\n", rgb.red, rgb.green, rgb.blue, hsb.hue, hsb.saturation, hsb.brightness); // prints: RGB(132,34,255) -> HSB(266.606354,0.866667,1.000000) return 0; } 

我建议使用查找表来存储HSB和RGB值。 首先将RGB值(可能是每个组件8位)转换为16位值(每个组件5位)。 HSB值,也是16位值,可以以相同的方式转换,这里,色调分量应该使用比饱和度和亮度更多的比特,每个分量可能是8比特,饱和度和亮度各4比特。 当然,从HSB转换为RGB时,反之亦然。