gpt4 book ai didi

c - 快速、优化和准确的 RGB <-> C 语言中的 HSB 转换代码

转载 作者:行者123 更新时间:2023-12-04 10:31:56 24 4
gpt4 key购买 nike

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

当然,我已经在 Google 上进行了广泛的搜索,但速度在这里是最重要的,我正在寻找任何关于可靠、快速、可靠代码的具体建议。

最佳答案

这是标准 C 中的简单实现。

这是 - 没有进一步的上下文 - 尽可能好。也许您想进一步了解

  • 如何存储 RGB 样本(以 !? 开头的位/像素)
  • 你如何存储你的像素数据(你想有效地转换更大的缓冲区,如果是的话,组织是什么)
  • 您希望如何表示输出(我暂时假设为 float )

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

总而言之,当使用优化编译时,这不会太糟糕:

#include <stdio.h>
#include <math.h>

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;
}

关于c - 快速、优化和准确的 RGB <-> C 语言中的 HSB 转换代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com