iOS 获取UIColor对象的lab字符串值。
2015-01-06 11:06
239 查看
- (NSString *)getCIELABString:(UIColor *)originColor {
// Method provided by the Colours class extension
NSDictionary *cieDict = [self
getCIE_LabArrayByColor:originColor ];
return [NSString
stringWithFormat:@"(%0.2f, %0.2f, %0.2f)",
[cieDict[@"CIE_L"]
floatValue],
[cieDict[@"CIE_A"]
floatValue],
[cieDict[@"CIE_B"]
floatValue]];
}
#pragma mark - LAB from Color
- (NSDictionary *)getCIE_LabArrayByColor:(UIColor *)originColor {
// Convert Color to XYZ format first
NSDictionary *rgba = [self
getRGBDictionaryByColor:originColor];
CGFloat R = [rgba[@"R"]
floatValue];
CGFloat G = [rgba[@"G"]
floatValue];
CGFloat B = [rgba[@"B"]
floatValue];
// Create deltaR block
void (^deltaRGB)(CGFloat *R);
deltaRGB = ^(CGFloat *r) {
*r = (*r >
0.04045) ? pow((*r +
0.055)/1.055,
2.40) : (*r/12.92);
};
deltaRGB(&R);
deltaRGB(&G);
deltaRGB(&B);
CGFloat X = R*41.24 + G*35.76 + B*18.05;
CGFloat Y = R*21.26 + G*71.52 + B*7.22;
CGFloat Z = R*1.93 + G*11.92 + B*95.05;
// Convert XYZ to L*a*b*
X = X/95.047;
Y = Y/100.000;
Z = Z/108.883;
// Create deltaF block
void (^deltaF)(CGFloat *f);
deltaF = ^(CGFloat *f){
*f = (*f >
pow((6.0/29.0),
3.0)) ? pow(*f,
1.0/3.0) : (1/3)*pow((29.0/6.0),
2.0) * *f + 4/29.0;
};
deltaF(&X);
deltaF(&Y);
deltaF(&Z);
NSNumber *L = @(116*Y -
16);
NSNumber *a = @(500 * (X - Y));
NSNumber *b = @(200 * (Y - Z));
return
@{@"CIE_L":L,
@"CIE_A":a,
@"CIE_B":b,
@"CIE_ALPHA":rgba[@"A"]};
}
/**
* 获取UIColor对象的RGB值。
*
* @return 包含rgb值的字典对象。
*/
- (NSDictionary *)getRGBDictionaryByColor:(UIColor *)originColor
{
CGFloat r=0,g=0,b=0,a=0;
if ([self respondsToSelector:@selector(getRed:green:blue:alpha:)])
{
[originColor getRed:&r green:&g blue:&b alpha:&a];
}
else {
const CGFloat *components = CGColorGetComponents(originColor.CGColor);
r = components[0];
g = components[1];
b = components[2];
a = components[3];
}
return @{@"R":@(r),
@"G":@(g),
@"B":@(b),
@"A":@(a)};
}
// Method provided by the Colours class extension
NSDictionary *cieDict = [self
getCIE_LabArrayByColor:originColor ];
return [NSString
stringWithFormat:@"(%0.2f, %0.2f, %0.2f)",
[cieDict[@"CIE_L"]
floatValue],
[cieDict[@"CIE_A"]
floatValue],
[cieDict[@"CIE_B"]
floatValue]];
}
#pragma mark - LAB from Color
- (NSDictionary *)getCIE_LabArrayByColor:(UIColor *)originColor {
// Convert Color to XYZ format first
NSDictionary *rgba = [self
getRGBDictionaryByColor:originColor];
CGFloat R = [rgba[@"R"]
floatValue];
CGFloat G = [rgba[@"G"]
floatValue];
CGFloat B = [rgba[@"B"]
floatValue];
// Create deltaR block
void (^deltaRGB)(CGFloat *R);
deltaRGB = ^(CGFloat *r) {
*r = (*r >
0.04045) ? pow((*r +
0.055)/1.055,
2.40) : (*r/12.92);
};
deltaRGB(&R);
deltaRGB(&G);
deltaRGB(&B);
CGFloat X = R*41.24 + G*35.76 + B*18.05;
CGFloat Y = R*21.26 + G*71.52 + B*7.22;
CGFloat Z = R*1.93 + G*11.92 + B*95.05;
// Convert XYZ to L*a*b*
X = X/95.047;
Y = Y/100.000;
Z = Z/108.883;
// Create deltaF block
void (^deltaF)(CGFloat *f);
deltaF = ^(CGFloat *f){
*f = (*f >
pow((6.0/29.0),
3.0)) ? pow(*f,
1.0/3.0) : (1/3)*pow((29.0/6.0),
2.0) * *f + 4/29.0;
};
deltaF(&X);
deltaF(&Y);
deltaF(&Z);
NSNumber *L = @(116*Y -
16);
NSNumber *a = @(500 * (X - Y));
NSNumber *b = @(200 * (Y - Z));
return
@{@"CIE_L":L,
@"CIE_A":a,
@"CIE_B":b,
@"CIE_ALPHA":rgba[@"A"]};
}
/**
* 获取UIColor对象的RGB值。
*
* @return 包含rgb值的字典对象。
*/
- (NSDictionary *)getRGBDictionaryByColor:(UIColor *)originColor
{
CGFloat r=0,g=0,b=0,a=0;
if ([self respondsToSelector:@selector(getRed:green:blue:alpha:)])
{
[originColor getRed:&r green:&g blue:&b alpha:&a];
}
else {
const CGFloat *components = CGColorGetComponents(originColor.CGColor);
r = components[0];
g = components[1];
b = components[2];
a = components[3];
}
return @{@"R":@(r),
@"G":@(g),
@"B":@(b),
@"A":@(a)};
}
相关文章推荐
- iOS 获取UIColor对象的HSB字符串值。
- iOS获取UIColor对象的RGB值
- iOS 获取图片某一点的颜色对象(UIColor*)。
- iOS获取UIColor对象的CMYK值
- iOS 获取图片某一点的颜色对象(UIColor*)。
- iOS 获取UIColor对象的rgb值。
- iOS 获取图片某一点的颜色对象UIColor
- iOS 将对象的属性和属性值拆分成key、value,通过字符串key来获取该属性的值
- ios开发——NSString如何从标准输入设备获取字符串
- iOS使用MD5 - 字符串加密至MD5&获取文件MD5
- 获取任意可序列化对象的Xml字符串,方便在日志中查看任一所感兴趣的对象。
- js动态获取当前系统时间+js字符串转换为date日期对象
- struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)
- iOS TableView didSelectRowAtIndexPath选中某Cell后获取其Cell实例对象
- JAVA之IO技术-获取指定目录下的文件夹和文件的File对象或是字符串名称。
- iOS UIColor 获取rgb 值
- iOS TableView didSelectRowAtIndexPath选中某Cell后获取其Cell实例对象
- iOS运行时获取对象的成员变量和成员方法
- javascript根据字符串创建Date对象,在ios和android中行为不一致
- IOS中RGB字符串转UICOLOR