I have a UILabel with black color;
i am writing the following code to get black color's components.
UIColor *aColor = [aLabel.textColor retain];
const CGFloat* components = CGColorGetComponents(aColor.CGColor);
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
but always this is giving Green color components instead of black color components;
Is any one have idea about this?
Am i passing different color space?
:-( Please help me.
The reason you are seeing what looks like
r=0
,g=1
,b=0
,a=0
is because you are misinterpreting the values in the returned array as being in anRGB
color model.UIColor
uses monochrome colorspace for greyscale colors like black in this case.What you are seeing is an array of
2
components from a monochrome color model. The first is gray level (0
for black) and the second is alpha (1
for opaque). The last two values your are looking at are off the end of the2
element array and happen to be0
in this case.You'll notice if color is black and you try
CGColorGetNumberOfComponents(color.CGColor)
, it returns2
. And if you tryCGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor))
, it returns0
which corresponds tokCGColorSpaceModelMonochrome
(see the enumCGColorSpaceModel
inCGColorSpace.h
)see CGColorSpace Reference
One way to get RGB for these is by drawing the color into a graphics context and reading the color back out. See my answer to this question for example code:
Get RGB value from UIColor presets
working exampel with UIColor:
CALayer * btnLayer = [myLittleButton layer];
[layer setBackgroundColor:<#(CGColorRef)#>]
becomes:[btnLayer setBorderColor:[[UIColor grayColor] CGColor]];
just make sure the buttons original colors doesnt cover the layer
I think this is a very nice way to get the rgb representation of any UIColor*, which already has a convenience method for retaining it´s components.
Most likely wrong colorspace. I guess the alpha component of the grayscale colorspace gets where you think the green component should be.
I use this function to create a string from UIColor, I only encounter RGB and Grayscale colorspaces, so I just interpret every color with less than 4 (R+G+B+A) components as grayscale.
of course this method is not save for all cases, you should adopt it to your requirements.