Кварц 2D: CGColorSpaceCreateLab: Назначение параметра диапазона? - PullRequest
7 голосов
/ 06 октября 2009

В Quartz 2D функция CGColorSpaceCreateLab() принимает параметр range, определенный следующим образом:

CGFloat range [4]: ​​ Массив из 4 чисел, которые задают диапазон допустимых значений для компонентов a * и b * цветового пространства. Компонент a * представляет значения от зеленого до красного, а компонент b * представляет значения от синего до желтого.

Вопрос в том, что этот параметр на самом деле делает ?

Я могу вспомнить как минимум три возможных сценария.

Вариант 1: возможно, он масштабирует значения компонентов

Допустим, у меня есть два цветовых пространства с разными диапазонами:

CGFloat range1[] = {  -10,  10,  -10,  10 };
CGFloat range2[] = { -100, 100, -100, 100 };
CGColorSpaceRef space1 = CGColorSpaceCreateLab(whitePoint, blackPoint, range1);
CGColorSpaceRef space2 = CGColorSpaceCreateLab(whitePoint, blackPoint, range2);

Я создаю цвета с одинаковыми значениями компонентов и в пределах указанного диапазона каждого пробела:

CGFloat components[] = { 50, 10, 10, 1 };
CGColorRef color1 = CGColorCreate(space1, components);
CGColorRef color2 = CGColorCreate(space2, components);

color1 и color2 представляют один и тот же цвет? Или параметр range каким-то образом масштабирует компоненты, делая эти два разных цвета? (Если последнее, какое значение для range соответствует стандартному CIELAB масштабированию координат?

Вариант 2: возможно, он обрезает значения компонентов

Учитывая два пробела, определенных выше, скажем, я вместо этого создаю следующие цвета:

CGFloat components[] = { 50, 50, 50, 1 };
CGColorRef color1 = CGColorCreate(space1, components);
CGColorRef color2 = CGColorCreate(space2, components);

Теперь color1 и color2 представляют один и тот же цвет? Или параметр range обрезает компоненты color1 до {50, 10, 10, 1}? (Если последнее, в чем смысл? Чрезвычайно грубое приближение определения гаммы? Обеспечение того, чтобы значения оставались в пределах диапазона, совместимого с другим типом данных?)

Вариант 3: Возможно, он используется в другом месте, например, при отображении гаммы с целью восприятия рендеринга

Наличие некоторого представления о диапазоне ожидаемых значений L * a * b * может помочь с отображением гаммы, особенно в случае восприятия, но, опять же, это кажется таким грубым приближением, что я не понимаю, почему быть особенно полезным.

Вариант 4: что-то еще?

1 Ответ

7 голосов
/ 06 октября 2009

Я провел некоторое тестирование, и похоже, что ответ:

Параметр range масштабирует значения компонентов a * и b *.

Кроме того, значения компонентов не выглядят обрезанными до указанного диапазона.

Итак, в следующем примере:

CGFloat range1[] = {  -10,  10,  -10,  10 };
CGFloat range2[] = { -100, 100, -100, 100 };
CGColorSpaceRef space1 = CGColorSpaceCreateLab(whitePoint, blackPoint, range1);
CGColorSpaceRef space2 = CGColorSpaceCreateLab(whitePoint, blackPoint, range2);

CGFloat components1[] = { 50, 10, 10, 1 };
CGColorRef color1 = CGColorCreate(space1, components1);

CGFloat components2[] = { 50, 100, 100, 1 };
CGColorRef color2 = CGColorCreate(space2, components2);

CGColorRef color3 = CGColorCreate(space1, components2);
  • color1 и color2 представляют один и тот же цвет.
  • color3, похоже, сохраняет указанные значения компонентов, даже если они находятся за пределами диапазона, указанного цветовым пространством.

Наконец, похоже, что спецификация диапазона {-127, 127, -127, 127} приводит к цветовому пространству со стандартными шкалами CIELAB для осей a * и b *.

Если у кого-нибудь есть более авторитетный ответ, пожалуйста, пишите!

...