4

このアルゴリズムを使用して HSB 値を RGB 値に変換しようとしていますが、正しい値が得られません。s を 29 に固定し、b を 100 に固定し、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

HSB を使用して構築された色の RGB コンポーネントを、UIKit を使用して直接かつ簡単に取得できます。

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 に答える