UIColor CMYK and Lab values

A simple question, most likely a difficult answer:

How can I get the CMYK and Lab values ​​from the UIColor object (from which I know the RGB values, if that helps)?

I found this in regards to getting CMYK values, but I can't get any exact values, even though it's all over the place, I heard it's not a great snippet.

CGFloat rgbComponents[4];
    [color getRed:&rgbComponents[0] green:&rgbComponents[1] blue:&rgbComponents[2] alpha:&rgbComponents[3]];

    CGFloat k = MIN(1-rgbComponents[0], MIN(1-rgbComponents[1], 1-rgbComponents[2]));
    CGFloat c = (1-rgbComponents[0]-k)/(1-k);
    CGFloat m = (1-rgbComponents[1]-k)/(1-k);
    CGFloat y = (1-rgbComponents[2]-k)/(1-k);

      

+3


source to share


2 answers


For ICC-based color conversion, you can use the Small Color Management System . (I just added all the .c and .h files from the download archive to the iOS Xcode project. It compiled and ran the following code without issue.)

Note: RGB and CMYK are device-specific color spaces, Lab is device-independent color space. Therefore, to convert from RGB to Lab, you need to select a device independent (or "calibrated") RGB color space to convert, such as sRGB.

The small CMS comes with built-in profiles for sRGB and Lab color spaces. The conversion from sRGB to Lab looks like this:

Create a color transform:

cmsHPROFILE rgbProfile = cmsCreate_sRGBProfile();
cmsHPROFILE labProfile = cmsCreateLab4Profile(NULL);
cmsHTRANSFORM xform = cmsCreateTransform(rgbProfile, TYPE_RGB_FLT, labProfile,
                                         TYPE_Lab_FLT,
                                         INTENT_PERCEPTUAL, 0);
cmsCloseProfile(labProfile);
cmsCloseProfile(rgbProfile);

      

Color conversion:

float rgbValues[3];
// fill rgbValues array with input values ...
float labValues[3];
cmsDoTransform(xform, rgbValues, labValues, 1);
// labValues array contains output values.

      



Utilizing color conversion:

cmsDeleteTransform(xform);

      

Of course, the transform will only be created once and will be used for all color transformations.

You can also use Little CMS to convert RGB to CMYK, but you must provide an ICC profile, for example. one of Adobe's free download page ICC file downloads for Mac OS .

Sample code for converting RGB to CMYK:

float rgb[3]; // fill with input values (range 0.0 .. 1.0)
float cmyk[4]; // output values (range 0.0 .. 100.0)

cmsHPROFILE rgbProfile = cmsCreate_sRGBProfile();

// The CMYK profile is a resource in the application bundle:
NSString *cmykProfilePath = [[NSBundle mainBundle] pathForResource:@"YourCMYKProfile.icc" ofType:nil];
cmsHPROFILE cmykProfile = cmsOpenProfileFromFile([cmykProfilePath fileSystemRepresentation], "r");

cmsHTRANSFORM xform = cmsCreateTransform(rgbProfile, TYPE_RGB_FLT, cmykProfile,
                                         TYPE_CMYK_FLT,
                                         INTENT_PERCEPTUAL, 0);

cmsCloseProfile(cmykProfile);
cmsCloseProfile(rgbProfile);

cmsDoTransform(xform, rgb, cmyk, 1);

cmsDeleteTransform(xform);

      

+5


source


To get LAB values, you need to convert RGB values ​​to XYZ values, which can then be converted to RGB values.



- (NSMutableArray *) convertRGBtoLABwithColor: (UIColor *)color



////make variables to get rgb values
CGFloat red3;
CGFloat green3;
CGFloat blue3;
//get rgb of color
[color getRed:&red3 green:&green3 blue:&blue3 alpha:nil];

float red2 = (float)red3*255;
float blue2 = (float)blue3*255;
float green2 = (float)green3*255;

//first convert RGB to XYZ

// same values, from 0 to 1
red2 = red2/255;
green2 = green2/255;
blue2 = blue2/255;

// adjusting values
if(red2 > 0.04045)
{
    red2 = (red2 + 0.055)/1.055;
    red2 = pow(red2,2.4);
} else {
    red2 = red2/12.92;
}

if(green2 > 0.04045)
{
    green2 = (green2 + 0.055)/1.055;
    green2 = pow(green2,2.4);
} else {
    green2 = green2/12.92;
}

if(blue2 > 0.04045)
{
    blue2 = (blue2 + 0.055)/1.055;
    blue2 = pow(blue2,2.4);
} else {
    blue2 = blue2/12.92;
}

red2 *= 100;
green2 *= 100;
blue2 *= 100;

//make x, y and z variables
float x;
float y;
float z;

// applying the matrix to finally have XYZ
x = (red2 * 0.4124) + (green2 * 0.3576) + (blue2 * 0.1805);
y = (red2 * 0.2126) + (green2 * 0.7152) + (blue2 * 0.0722);
z = (red2 * 0.0193) + (green2 * 0.1192) + (blue2 * 0.9505);

//then convert XYZ to LAB

x = x/95.047;
y = y/100;
z = z/108.883;

// adjusting the values
if(x > 0.008856)
{
    x = powf(x,(1.0/3.0));
} else {
    x = ((7.787 * x) + (16/116));
}

if(y > 0.008856)
{
    y = pow(y,(1.0/3.0));
} else {
    y = ((7.787 * y) + (16/116));
}

if(z > 0.008856)
{
    z = pow(z,(1.0/3.0));
} else {
    z = ((7.787 * z) + (16/116));
}

//make L, A and B variables
float l;
float a;
float b;

//finally have your l, a, b variables!!!!
l = ((116 * y) - 16);
a = 500 * (x - y);
b = 200 * (y - z);

NSNumber *lNumber = [NSNumber numberWithFloat:l];
NSNumber *aNumber = [NSNumber numberWithFloat:a];
NSNumber *bNumber = [NSNumber numberWithFloat:b];

//add them to an array to return.
NSMutableArray *labArray = [[NSMutableArray alloc] init];
[labArray addObject:lNumber];
[labArray addObject:aNumber];
[labArray addObject:bNumber];

return labArray;
}

      

+2


source







All Articles