Работа с цветовыми пространствами

Этот документ обсуждает использование цветовых пространств при создании или преобразовании NSColor объекты. Это также описывает, как создать объекты, представляющие новые цветовые пространства при помощи NSColorSpace класс.

Создание и преобразование цветов Используя цветовые пространства

Методы NSColor класс, которые создают или преобразовывают цветовые объекты, делает явную или неявную ссылку на цветовое пространство, или в форме имени или в объекте. В конце концов, цвета не могут быть определены без цветового пространства, обеспечивающего среду для определения. Следующие разделы суммируют их NSColor методы и инструкции по предложению для их использования в программировании.

Методы NSColor то использование цветовые пространства

Много методов фабрики цветного создания NSColor встройте имя цветового пространства в имени метода. Необходимо указать значения компонентов цвета после ключевых слов метода. Например, colorWithDeviceCyan:magenta:yellow:black:alpha: создает цвет, использующий цветовое пространство, определяемое NSDeviceCMYKColorSpace. Вы создали бы цвет в калиброванном цветовом пространстве HSB (который определяется NSCalibratedRGBColorSpace в этом случае) использование colorWithCalibratedHue:saturation:brightness:alpha:. Раскрашивает именованный (каталог), и цветовые пространства образца также имеют свои собственные методы создания фабрики: colorWithCatalogName:colorName: и colorWithPatternImage:

Создать цветовые объекты в цвете располагает с интервалами представленный NSColorSpace объекты, используйте colorWithColorSpace:components:count: метод. Как проиллюстрировано в Перечислении 1, можно получить один из предопределенных объектов цветового пространства путем вызова надлежащего NSColorSpace метод фабрики классов (например, genericCMYKColorSpace).

Перечисление 1  , Создающее цвет из предопределенного объекта цветового пространства

float comps[] = {0.4, 0.2, 0.6, 0.0, 1.0};
NSColor *aColor = [NSColor colorWithColorSpace:[NSColorSpace genericCMYKColorSpace] components:comps count:5];

Основное преимущество использования colorWithColorSpace:components:count: метод для создания цветов - то, что можно использовать объект, представляющий пространство пользовательского цвета (см. Пробелы Пользовательского цвета Создания). Вы не ограничиваетесь предопределенными объектами цветового пространства.

Объекты NSColorSpace имеют преимущества перед именами цветового пространства на основании того, чтобы быть объектами. Например, можно также запросить эти объекты об их свойствах, таких как число компонентов, значения компонента, и локализованное имя. Можно также заархивировать и разархивировать объекты цветового пространства.

Некоторое цветное создание методы NSColor не делает ссылки на цветовое пространство на их имена. Некоторые из этих методов фабрики классов создают основные и дополнительные цвета, такой как blueColor и purpleColor; другие, такой как lightGrayColor, создайте полутоновые цвета. Они NSColor методы фабрики принимают цветовое пространство калиброванного RGB (NSCalibratedRGBColorSpace) или калиброванный белый (NSCalibratedWhiteColorSpace), как надлежащий. В большинстве случаев альфа-компонент (непрозрачность) 1.0.

Другие цветные методы создания NSColor создайте объекты, представляющие стандартные цвета объектов пользовательского интерфейса в OS X; примеры этих методов включают controlTextColor, gridColor, и windowFrameColor. Вы не должны делать предположения о цветовом пространстве этих цветов. Действительно, для любого цветового объекта, это - хорошая практика, чтобы не принять ее цветовое пространство, но вместо этого преобразовать его в пространство требуемого цвета перед использованием его. См. Инструкции по Программированию для Цветовых пространств для больше на этом предмете.

NSColor предлагает colorUsingColorSpaceName: метод для преобразования цветов от один раз цветового пространства другому. Этот метод берет имя цветового пространства в качестве параметра. Вот пример использования этого метода, преобразовывающего NSColor объект, создаваемый выше от CMYK до цветового пространства RGB:

NSColor *bColor = [aColor colorUsingColorSpaceName:NSCalibratedRGBColorSpace];

Цветовой объект, создаваемый этим методом обычно, имеет значения компонентов, отличающиеся от значений компонентов исходного объекта, но цвета выглядят одинаково. Иногда преобразование цветов корректно только для текущего устройства; метод мог бы даже возвратиться nil если не может быть сделано требуемое преобразование.

Обратите внимание на то, что использование colorUsingColorSpace: метод для преобразования цвета между цветовыми пространствами приемлем, но что итоговый цвет представлен пространством пользовательского цвета и не будет реагировать на методы цветового-пространства-specifc. Например, NSColor объект, создаваемый следующим методом, находится в цветовом пространстве RGB, но представлен пространством пользовательского цвета (NSColorSpace), и таким образом повышает исключение, когда Вы отправляете ему a redComponent сообщение:

NSColor *cColor = [aColor colorUsingColorSpace:[NSColorSpace genericRGBColorSpace]];

Получать определенные атрибуты цвета с colorUsingColorSpace:, используйте getComponents: метод как в следующем примере:

if(cColor){
    CGFloat components[4];
    [cColor getComponents:components];
}

Программирование инструкций для цветовых пространств

Наблюдайте следующие инструкции при контакте с объектами NSColor и цветовыми пространствами.

Какое цветовое пространство я использую?

Цвет Какао APIs дает Вам диапазон предопределенных цветовых пространств для работы с, или через имена цветового пространства или как объекты, возвратился из NSColorSpace методы фабрики. Как Вы знаете который цветовое пространство использовать в каком-либо данном программировании контекста?

Обычно рекомендуется использовать калиброванный (или универсальный) цветовые пространства вместо цветовых пространств устройства. Цвета в цветовых пространствах устройства могут значительно различаться с устройства на устройство, тогда как калиброванные цветовые пространства обычно приводят к довольно точному цвету. Цветовые пространства устройства, с другой стороны, могли бы привести к лучшей производительности при определенных обстоятельствах, поэтому если Вы знаете наверняка устройство, которое представит или получит цвет, использовать цветовое пространство устройства вместо этого.

Что касается модели предопределенного цветового пространства, это зависит от того, где цвет должен быть представлен или получен. Используйте RGB для цветных мониторов и сканеров, NSCalibratedWhiteColorSpace или genericGrayColorSpace объекты для полутоновых мониторов и CYMK для принтеров. Если место назначения неопределенно, используйте RGB.

Действительно ли я могу получить доступ к компонентам какого-либо объекта NSColor?

Это недопустимо для использования метода доступа, связанного с компонентами определенного цветового пространства на NSColor объект, который не находится в том цветовом пространстве. Например, NSColor методы такой как redComponent и getRed:green:blue:alpha: работа над цветовыми объектами в калиброванном и устройстве цветовые пространства RGB. При отправке такого сообщения в объект NSColor в цветовом пространстве CMYK исключение повышено.

Если Вы имеете NSColor объект в неизвестном цветовом пространстве и Вы хотите извлечь его компоненты, необходимо сначала преобразовать цветовой объект в известное цветовое пространство перед использованием методов доступа компонента того цветового пространства. Например:

NSColor *aColor = [color colorUsingColorSpaceName:NSCalibratedRGBColorSpace];
if (aColor) {
    float rcomp = [aColor redComponent];
}

Если цвет уже находится в требуемом цветовом пространстве, Вы возвращаете исходный объект.

Создание пробелов пользовательского цвета

Разработчику редко нужно цветовое пространство, не предоставляющееся системой. Мало того, что предопределенные универсальны (калиброванный) и цветовые пространства устройства, достаточные в большинстве целей, но OS X позволяет Вам создавать пространства пользовательского цвета, не имея необходимость писать любой код. В области Color системного предпочтения Дисплеев (рисунок 1) там кнопка Calibrate; щелчок по этой кнопке запускает мастер, продвигающийся Вы через процедуру для создания пользовательского профиля, из которого сделано пространство пользовательского цвета. (Пользовательский профиль сохранен в ~/Library/ColorSync/Profiles.)

Рисунок 1  область Color системного предпочтения Дисплеев
The Color pane of the Displays system preference

Но если по некоторым причинам необходимо создать пространство пользовательского цвета программно, можно использовать один из методов инициализатора класса NSColorSpace. Вы инициализируете пользовательский объект NSColorSpace с одним из двух источников данных:

Инициализатор NSColorSpace initWithICCProfileData: метод берет объект NSData инкапсуляция карты профиля ICC. Эта карта профиля является структурой данных, изображенной на рисунке 2. Заголовок карты профиля обеспечивает, информационные приложения должны искать и вид профили ICC, такие как размер профиля, версия, тип CMM, цветовое пространство и основная платформа. Следующая таблица тега состоит из переменного числа записей; каждая запись имеет уникальную подпись тега, смещение к началу данных элемента тега и размеру тех данных. International Color Consortium (ICC) поддерживает веб-сайт в http://www .color.org/icc_specs2.html, из которого можно получить новую спецификацию профиля ICC.

Рисунок 2  ICC профилирует карту
An ICC profile map

Как только у Вас есть карта профиля ICC, создал Вас, может инициализировать объект NSData с ним с помощью методов фабрики классов dataWithBytes:length: или dataWithBytesNoCopy:length:freeWhenDone:. Тогда можно вызвать инициализатор NSColorSpace initWithICCProfileData:, передача в объекте данных.

Другая альтернатива для создания объекта, представляющего пространство пользовательского цвета, должна инициализировать объект с a CMProfileRef «объект». A CMProfileRef непрозрачный тип представляет профиль ColorSync. Обычно Вы вызываете CMNewProfile функция для создания нового (но неполный) профиль и поддерживающий копию в определенном расположении. Функция берет указатель на расположение и возвращает указатель на создаваемый CMProfileRef.

CMError CMNewProfile (
   CMProfileRef * prof,
   const CMProfileLocation * theProfile
)

Профиль ColorSync идентичен профилю ICC. Необходимо заполнить поля заголовка профиля и заполнить профиль с тегами и их данными элемента. Тогда вызовите функцию CMUpdateProfile сохранять данные элемента к файлу профиля. Обратите внимание на то, что содержание профиля ColorSync по умолчанию включает заголовок профиля типа CM2Header и таблица элемента. Посмотрите менеджера ColorSync Референса по подробным данным о том, как снабдить требуемыми данными профиля ColorSync.

Можно просмотреть данные существующих профилей ColorSync путем выполнения утилиты ColorSync. Запустите эту утилиту путем нажатия кнопки Open Profile области Color системного предпочтения Дисплеев. Рисунок 3 показывает часть профиля ColorSync для Дисплея Studio Apple.

Рисунок 3  Утилита ColorSync показ значений карты ICC
ColorSync Utility showing values of ICC map