Sno*_*man 4 colors objective-c ios
我正在尝试使用此算法将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);
Run Code Online (Sandbox Code Playgroud)
输出:
r:2971.000000 g:2971.000000 b:2971.000000
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
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);
Run Code Online (Sandbox Code Playgroud)
输出:
r:1.000000 g:1.000000 b:1.000000
我做错了什么,或者这个算法搞砸了?
您可以使用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
}
Run Code Online (Sandbox Code Playgroud)
如果你关心的只是使用颜色,你可以跳过if并只使用它.
根据Apple的UIColor文档:
如果颜色位于兼容的颜色空间中,颜色将转换为RGB格式,其组件将返回到您的应用程序.如果颜色不在兼容的颜色空间中,则参数不变.
在这种情况下,兼容的色彩空间是RGB或HSB.
我不知道您的算法,但我应该使用以下算法:
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;
}
Run Code Online (Sandbox Code Playgroud)
我将其用于自己的项目中,但没有任何问题。:)
| 归档时间: |
|
| 查看次数: |
3916 次 |
| 最近记录: |