4

我正在尝试使用此算法将 HSB 值转换为 RGB 值,但我没有得到正确的值。我有 29 的固定 s,100 的固定 b,并且正在为 h 值生成 0-360 之间的随机整数,并将它们输入函数以获取 RGB:

在此处输入图像描述

float h = (arc4random() % 360);
float s = 29;
float b = 100;
HSL2RGB(h, s, b, &red, &green, &blue);
NSLog(@"r:%f g:%f b:%f", red, green, blue);

输出:

r:2971.000000 g:2971.000000 b:2971.000000

我也试过这个:

float h = (arc4random() % 360)/1000.0;
float s = 0.29;
float b = 1.0;
HSL2RGB(h, s, b, &red, &green, &blue);
NSLog(@"r:%f g:%f b:%f", red, green, blue);

输出:

r:1.000000 g:1.000000 b:1.000000

我做错了什么,还是这个算法搞砸了?

4

2 回答 2

9

您可以使用 UIKit 直接轻松地获取使用 HSB 构造的颜色的 RGB 分量。

UIColor *color = [UIColor colorWithHue: hue saturation: saturation
                            brightness: brightness alpha: alpha];
if ( [color getRed: &red green: &green blue: &blue alpha: &alpha] ) {
    // color converted
}

如果您只关心使用颜色,则可以跳过if并直接使用它。

根据 Apple 的UIColor 文档

如果颜色在兼容的颜色空间中,则颜色将转换为 RGB 格式,并将其组件返回给您的应用程序。如果颜色不在兼容的颜色空间中,则参数不变。

在这种情况下,兼容的色彩空间是 RGB 或 HSB。

于 2012-07-28T21:43:52.710 回答
6

我不知道你的算法,但我应该你使用这个算法:

typedef struct
{
    double r;       // percent [0 - 1]
    double g;       // percent [0 - 1]
    double b;       // percent [0 - 1]
    double a;       // percent [0 - 1]
} RGBA;

typedef struct
{
    double h;       // angle in degrees [0 - 360]
    double s;       // percent [0 - 1]
    double v;       // percent [0 - 1]
} HSV;

- (RGBA)RGBfromHSV:(HSV)value
{
    double      hh, p, q, t, ff;
    long        i;
    RGBA        out;
    out.a       = 1;

    if (value.s <= 0.0) // < is bogus, just shuts up warnings
    {       
        if (isnan(value.h)) // value.h == NAN
        {   
            out.r = value.v;
            out.g = value.v;
            out.b = value.v;
            return out;
        }

        // error - should never happen
        out.r = 0.0;
        out.g = 0.0;
        out.b = 0.0;
        return out;
    }

    hh = value.h;
    if(hh >= 360.0) hh = 0.0;
    hh /= 60.0;
    i = (long)hh;
    ff = hh - i;
    p = value.v * (1.0 - value.s);
    q = value.v * (1.0 - (value.s * ff));
    t = value.v * (1.0 - (value.s * (1.0 - ff)));

    switch(i)
    {
        case 0:
            out.r = value.v;
            out.g = t;
            out.b = p;
            break;
        case 1:
            out.r = q;
            out.g = value.v;
            out.b = p;
            break;
        case 2:
            out.r = p;
            out.g = value.v;
            out.b = t;
            break;

        case 3:
            out.r = p;
            out.g = q;
            out.b = value.v;
            break;
        case 4:
            out.r = t;
            out.g = p;
            out.b = value.v;
            break;
        case 5:
        default:
            out.r = value.v;
            out.g = p;
            out.b = q;
            break;
    }
    return out;     
}

我将它用于我的项目中,我对此没有任何问题。:)

于 2012-07-28T21:26:32.533 回答