objective-c - UIColor CMYK 和 Lab 值

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

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

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

我发现这个关于获取 CMYK 值,但我无法从中获得任何准确的值,尽管它无处不在,但我听说它不是一个很好的片段。

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

最佳答案

对于基于 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);

关于objective-c - UIColor CMYK 和 Lab 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912938/

相关文章:

objective-c - iOS 编程与 Web 数据库接口(interface)

objective-c - 自定义 TableView-Cell(来自服务器的数据)通过附件更改选择多个值

ios - UIKit 问题 - 在 IBOutlet 项目上设置颜色需要花费大量时间

objective-c - 在 Xcode 4 中制作精简版

objective-c - 查找内存泄漏/过度释放裂缝的来源

c# - 如何将 RGB 颜色转换为 HSV?

opencv - 在OpenCV中将RGB视频转换为灰度

C、开罗 : render stream of RGB images

ios - 如何在 Swift 中以编程方式访问系统颜色?

iphone - iOS 5.1 : -[UIColor colorWithPatternImage:] background color draws solid black