【问题标题】:UIColor CMYK and Lab ValuesUIColor CMYK 和 Lab 值
【发布时间】:2013-02-16 17:16:08
【问题描述】:

简单的问题,很可能是复杂的答案:

如何从 UIColor 对象获取 CMYK 和 Lab 值(如果有帮助,我知道 RGB 值)?

我发现了有关获取 CMYK 值的信息,但我无法从中获得任何准确的值,尽管它无处不在,但我听说这不是一个很好的 sn-p。

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);

【问题讨论】:

  • 参见stackoverflow.com/questions/4858131/… 它适用于 Java,但适用于基础知识。
  • 我还认为基于 ICC 的颜色转换是正确的做法。但 ColorSync API 在 iOS 上不可用(并且从 OS X 10.6 起已弃用)。
  • @Josh Kahane:您粘贴的颜色转换公式可以在网上找到。然而,由于颜色转换远不是一个可以在单个公式中捕获的简单系统,因此公式的结果将很差且无用。无法使用颜色配置文件。
  • @JoshKahane:我的回答有帮助吗?您需要更多信息吗?
  • 抱歉@MartinR 我忙于其他工作,完全忘记了这一点。我会在今天晚些时候尝试您的解决方案,并尽快回复您的结果。

标签: objective-c rgb uicolor cmyk lab-color-space


【解决方案1】:

对于基于 ICC 的颜色转换,您可以使用Little Color Management System。 (我刚刚将下载存档中的所有 .c 和 .h 文件添加到 iOS Xcode 项目中。它编译并运行以下代码没有问题。)

备注:RGB和CMYK是设备依赖色彩空间,Lab是设备独立色彩空间。因此,要将 RGB 转换为 Lab,您必须为转换选择与设备无关(或“校准”)的 RGB 颜色空间,例如 sRGB。

Little CMS 带有用于 sRGB 和 Lab 色彩空间的内置配置文件。从 sRGB 到 Lab 的转换如下所示:

创建颜色转换:

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);

转换颜色:

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

处理颜色转换:

cmsDeleteTransform(xform);

当然,转换只会创建一次并用于所有颜色转换。

对于 RGB 到 CMYK 的转换,您也可以使用 Little CMS,但您必须提供 ICC 配置文件,例如一个来自免费的 Adob​​e 下载页面 ICC profile downloads for Mac OS

RGB 到 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);

【讨论】:

  • 只是好奇,iOS 是否使用 sRGB 作为显示色彩空间?
  • @guitarflow:我不知道(我什至不知道它是否记录在案)。我在代码中以 sRGB 为例,因为它被广泛使用。但我会编辑我的答案以使其更清楚。
  • 嗯,好的。谢谢。我假设 UIScreen 还附加了一个可以查询的颜色空间。好像不是。所以你必须假设一个色彩空间。我猜 sRGB 会是一个很好的假设。
  • @JoshKahane:我将 lcms 中的以下文件添加到 Xcode 项目中:include 目录中的 lcms2.h 和 lcms2_plugin.h,src 目录中的所有 .c 和 .h 文件。这就是图书馆所需要的一切。在您的代码中,您只需 #include "lcms2.h"。 - 我希望这会有所帮助,否则请告诉我。
  • @guitarflow 和 Martin,似乎从 iPhone 5 开始,Apple 声称屏幕具有完整的 sRGB 色域(非常接近:AnandTechMark Meyer)。但是,我仍然很好奇,如果我们可以获得设备颜色配置文件!从 RGB -> Lab 转换为其他配置文件对我来说似乎有问题。
【解决方案2】:

要获得 LAB 值,您需要将 RGB 值转换为 XYZ 值,然后再将其转换为 RGB 值。

- (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;
}

【讨论】:

  • 嗨,Nathan,您是否也有反向代码?
猜你喜欢
  • 2014-03-21
  • 2010-12-04
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多