得到的UIColor预设RGB值

我我的应用程序的RGB颜色值传递给服务器。 我的应用程序使用的UIColor预设值,如[的UIColor grayColor],[的UIColor redColor。 我知道,我可以使用下面的代码:

const CGFloat *c = CGColorGetComponents(color.CGColor)

但只对那些在RBG颜色空间的颜色,但是,[的UIColor grayColor]不是。

有没有什么办法让RGB值非RBG颜色?

谢谢!

--------------解决方案-------------

拥有的UIColor它给你RGB分量的方法( -getRed:green:blue:alpha:它在iOS 7或更高版本的伟大工程)。 在iOS 6和更早的版本,此方法将失败并返回NO如果颜色是不是在RGB色彩空间(因为它会替[UIColor grayColor]

对于iOS 6和更早的版本,我知道这样做的,在所有的色彩空间工作的唯一途径是建立在RGB色彩空间中的核芯显卡位图上下文,并吸引到它与你的颜色。 然后,您可以从生成位图读出RGB值。 请注意,这不会对某些颜色的工作,像图案的颜色(如[的UIColor groupTableViewBackgroundColor]),不具备合理的RGB值。

- (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char resultingPixel[4];
CGContextRef context = CGBitmapContextCreate(&resultingPixel,
1,
1,
8,
4,
rgbColorSpace,
kCGImageAlphaNoneSkipLast);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(rgbColorSpace);

for (int component = 0; component < 3; component++) {
components[component] = resultingPixel[component] / 255.0f;
}
}

您可以使用它是这样的:

CGFloat components[3];
[self getRGBComponents:components forColor:[UIColor grayColor]];
NSLog(@"%f %f %f", components[0], components[1], components[2]);

添加到杰西的答案,这里是如何保存阿尔法:

- (void)getRGBAComponents:(CGFloat [4])components forColor:(UIColor *)color {
CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char resultingPixel[4] = {0};
CGContextRef context = CGBitmapContextCreate(&resultingPixel,
1,
1,
8,
4,
rgbColorSpace,
kCGImageAlphaPremultipliedLast);
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, CGRectMake(0, 0, 1, 1));
CGContextRelease(context);
CGColorSpaceRelease(rgbColorSpace);

CGFloat a = resultingPixel[3] / 255.0;
CGFloat unpremultiply = (a != 0.0) ? 1.0 / a / 255.0 : 0.0;
for (int component = 0; component < 3; component++) {
components[component] = resultingPixel[component] * unpremultiply;
}
components[3] = a;
}

我只知道一个正确的方式做到这一点-这是调用CGGetColorComponents() 我已经尝试使用UIColor-getRed:green:blue:alpha ,但它并不适用于灰度颜色正常工作。 因此,这里是我做的:

首先,我有一个简单的struct ,让我轻松地操纵RGBA颜色。 这种结构是在做各种颜色操作的东西,如伽玛校正和色彩平均别处有用。

typedef struct
{
CGFloat r; // Red component (0 <= r <= 1)
CGFloat g; // Green component (0 <= g <= 1)
CGFloat b; // Blue component (0 <= b <= 1)
CGFloat a; // Alpha/opacity component (0 <= a <= 1)
}
RGBA;

然后,我有一个返回值的函数RGBA给定结构UIColor

RGBA RGBAFromUIColor(UIColor *color)
{
return RGBAFromCGColor(color.CGColor);
}

它传递UIColorCGColor到较低级别的功能做繁重。

RGBA RGBAFromCGColor(CGColorRef color)
{
RGBA rgba;

CGColorSpaceRef color_space = CGColorGetColorSpace(color);
CGColorSpaceModel color_space_model = CGColorSpaceGetModel(color_space);
const CGFloat *color_components = CGColorGetComponents(color);
int color_component_count = CGColorGetNumberOfComponents(color);

switch (color_space_model)
{
case kCGColorSpaceModelMonochrome:
{
assert(color_component_count == 2);
rgba = (RGBA)
{
.r = color_components[0],
.g = color_components[0],
.b = color_components[0],
.a = color_components[1]
};
break;
}

case kCGColorSpaceModelRGB:
{
assert(color_component_count == 4);
rgba = (RGBA)
{
.r = color_components[0],
.g = color_components[1],
.b = color_components[2],
.a = color_components[3]
};
break;
}

default:
{
NSLog(@"Unsupported color space model %i", color_space_model);
rgba = (RGBA) { 0, 0, 0, 0 };
break;
}
}

return rgba;
}

所以,这个伟大工程灰度的颜色(如UIColor.whiteColorUIColor.blackColorUIColor.grayColor等)以及任何红/绿/蓝/阿尔法颜色。 它不会与HSB色彩然而工作。

从我的回答Crossposted为“如何颜色从一个色彩空间转换到另一个?”。

为了确定不同的色彩空间就可以得到CGColorSpaceModel从颜色的CGColorSpaceRef

UIColor* color = some color;
CGColorSpaceRef colorSpace = CGColorGetColorSpace([color CGColor]);
CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace);

然后,你可以比较colorSpaceModel与定义的常量CoreGraphics/CGColorSpace.h 。 的UIColor的getRed:green:blue:alpha工程kCGColorSpaceModelRGB ,而getWhite:alpha工程kCGColorSpaceModelMonochrome

您可以通过使用这只是获取RGB值

UIColor *chooseColor = view.backgroundColor;
CGFloat red,green,blue,alpha;

[chooseColor getRed:&red green:&green blue:&blue alpha:&alpha];

感谢:-)

分类:iphone 时间:2015-03-15 人气:5
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.314 (s). 10 q(s)