3

単純な質問ですが、おそらく複雑な答えです:

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

2 に答える 2

5

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

もちろん、変換は 1 回だけ作成され、すべての色変換に使用されます。

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);
于 2013-02-16T23:29:36.823 に答える