Создавание цветовых пространств, гарантирующих согласование цветов.
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/':
Универсальный CMYK Profile.icc
Универсальный серый Profile.icc
Generic Lab Profile.icc
Универсальный RGB Profile.icc
Универсальный XYZ Profile.icc
sRGB Profile.icc
В то время как нет простого 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 | Новый документ, что, как создать цветовые пространства, гарантирующие согласование цветов. |