Технические вопросы и ответы QA1396

Создавание цветовых пространств, гарантирующих согласование цветов.

Q: Как я создаю цветовые пространства так, чтобы я мог удостовериться, что являются соответствующими мои цвета?

A: Как я создаю цветовые пространства так, чтобы я мог удостовериться, что являются соответствующими мои цвета?

Чтобы работать с цветом эффективно и понять Кварц 2D функции для использования цветовых пространств и цвета, необходимо быть знакомы с терминологией, обсужденной в Обзоре управления цветом. Тот документ обсуждает цветное восприятие, значения цвета, независящие от устройств и цветовые пространства устройства, проблема согласования цветов, представляя намерение, модули управления цветом и ColorSync.

Устройства (дисплеи, принтеры, сканеры, камеры) не обрабатывают цвет тот же путь; у каждого есть его собственный диапазон цветов, которые устройство может произвести искренне. Цвет, произведенный на одном устройстве, не мог бы быть в состоянии быть произведенным на другом устройстве. Лучший способ избежать этих видов проблем состоит в том, чтобы использовать цветовое пространство с «калибровочным профилем»? например, цветовое пространство ICCBased, использующее профиль ICC для калибровки. В таком случае система будет в состоянии перевести цвет от этого цветового пространства до любого места назначения (например, дисплей) самым лучшим способом. Если уже нет профиль для места назначения, лучшее решение состоит в том, чтобы использовать универсальное цветовое пространство. Универсальные цветовые пространства, например Универсальный RGB или Универсальный CYMK, являются цветовыми пространствами, которые будут всегда калиброваться, когда скопировано в устройство назначения.

Новый в Mac OS X 10.4, константы kCGColorSpaceGenericRGB, kCGColorSpaceGenericCMYK и kCGColorSpaceGenericGray может использоваться для простого создания универсального RGB, CYMK и цветовых пространств Грэя с помощью CGColorSpaceCreateWithName функция. Эти константы не доступны в 10.3.9 или ранее; если назад совместимость необходима для систем, прежде чем 10.4 будут использовать код от Перечисления 2 для создавания цветовых пространств от универсальных цветовых профилей ICC.

Перечисление 1  , Создающее универсальное цветовое пространство RGB с помощью kCGColorSpaceGenericRGB avalible в 10,4 и позже

CGColorSpaceRef genericRGBColorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);

Цветовые пространства устройства являются зависящими от устройств и предполагают, что все цвета уже калибруются для устройства назначения. Следующий APIs создает зависящие от устройств цветовые пространства и должен избежаться: CGColorSpaceCreateDeviceRGB(), CGColorSpaceCreateDeviceCYMK(), и CGColorSpaceCreateDeviceGray().

Mac OS X обеспечивает следующие файлы профиля ICC в каталоге '/System/Library/ColorSync/Profiles/':

В то время как нет простого API для создания цветового пространства ICC от цветового профиля ICC, Перечисление 2 обеспечивает пример того, как создать тот.

Перечисление 2  , Создающее цветовое пространство от профиля ICC и примеры для создания Универсального Цветового пространства RGB и sRGB Цветового пространства.

CGColorSpaceRef CreateICCColorSpaceFromPathToProfile (const char * iccProfilePath) {

    CMProfileRef    iccProfile = (CMProfileRef) 0;
    CGColorSpaceRef iccColorSpace = NULL;
    CMProfileLocation loc;

    // Specify that the location of the profile will be a POSIX path to the profile.
    loc.locType = cmPathBasedProfile;

    // Make sure the path is not larger then the buffer
    if(strlen(iccProfilePath) > sizeof(loc.u.pathLoc.path))
        return NULL;

    // Copy the path the profile into the CMProfileLocation structure
    strcpy (loc.u.pathLoc.path, iccProfilePath);

    // Open the profile
    if (CMOpenProfile(&iccProfile, &loc) != noErr)
    {
        iccProfile = (CMProfileRef) 0;
                return NULL;
    }

    // Create the ColorSpace with the open profile.
    iccColorSpace = CGColorSpaceCreateWithPlatformColorSpace( iccProfile );

    // Close the profile now that we have what we need from it.
    CMCloseProfile(iccProfile);

    return iccColorSpace;
}

CGColorSpaceRef CreateColorSpaceFromSystemICCProfileName(CFStringRef profileName) {
    FSRef pathToProfilesFolder;
    FSRef pathToProfile;

    // Find the Systems Color Sync Profiles folder
    if(FSFindFolder(kOnSystemDisk, kColorSyncProfilesFolderType, 
            kDontCreateFolder, &pathToProfilesFolder) == noErr) {

        // Make a UniChar string of the profile name
        UniChar uniBuffer[sizeof(CMPathLocation)];
        CFStringGetCharacters (profileName,CFRangeMake(0,CFStringGetLength(profileName)),uniBuffer);

        // Create a FSRef to the profile in the Systems Color Sync Profile folder
        if(FSMakeFSRefUnicode (&pathToProfilesFolder,CFStringGetLength(profileName),uniBuffer,
            kUnicodeUTF8Format,&pathToProfile) == noErr) {
                char path[sizeof(CMPathLocation)];

            // Write the posix path to the profile into our path buffer from the FSRef
            if(FSRefMakePath (&pathToProfile,path,sizeof(CMPathLocation)) == noErr)
                return CreateICCColorSpaceFromPathToProfile(path);
        }
    }

    return NULL;
}

CGColorSpaceRef CreateICCGenericRGBColorSpace() {
    return CreateColorSpaceFromSystemICCProfileName(CFSTR("Generic RGB Profile.icc"));
}

CGColorSpaceRef CreateICCsRGBColorSpace() {
     return CreateColorSpaceFromSystemICCProfileName(CFSTR("sRGB Profile.icc"));
}

Внеэкранные кэши обычно используются для улучшения производительности, но если цветовое пространство используется для создания внеэкранного кэша, не соответствующего дисплей, тогда каждый раз, когда данные копируются в дисплей, это должно пойти хотя процесс калибровки цветов. Начиная с каждого дисплея карты окрашивают по-другому к тем же значениям цвета, оптимальный метод должен попросить у системы профиля дисплеев. Как только профиль дисплеев получен, он может тогда использоваться для создавания пространства цвета отображения, которое может использоваться для создания CGBitmapContext, который будет использоваться в качестве внеэкранного кэша. Перечисление 2 показывает, как создать цветовое пространство на основе текущего профиля дисплея.

Перечисление 3  , Создающее цветовое пространство, представляющее основной дисплей

CGColorSpaceRef CreateSystemColorSpace () {
    CMProfileRef sysprof = NULL;
    CGColorSpaceRef dispColorSpace = NULL;

    // Get the Systems Profile for the main display
    if (CMGetSystemProfile(&sysprof) == noErr)
    {
        // Create a colorspace with the systems profile
        dispColorSpace = CGColorSpaceCreateWithPlatformColorSpace(sysprof);

        // Close the profile
        CMCloseProfile(sysprof);
    }

    return dispColorSpace;
}

Использование «пространства цвета отображения», на основе текущего профиля дисплея, говорит системе, что Вы не хотите, чтобы цвет был соответствующим, когда это копируется в экран, но Вы действительно хотите согласование цветов при рисовании к внеэкранному кэшу. Так как это «пространство цвета отображения» основывается на текущем дисплее, если кэшированные данные будут быть повторными в другой системе с различным дисплеем, то цветное появление будет отличаться, потому что каждое устройство реагирует по-другому на те же значения цвета.



История версии документа


ДатаПримечания
04.10.2005

Добавленный новые константы для создания универсального RGB, CYMK и Серых цветовых пространств в 10,4 и позже.

13.01.2005

Новый документ, что, как создать цветовые пространства, гарантирующие согласование цветов.