Objective-C RGB в HSB - PullRequest
       82

Objective-C RGB в HSB

1 голос
/ 07 апреля 2010

Допустим, у меня есть цвет FF0000, который красный.Найти более темный цвет легко, я просто печатаю, может быть, CC вместо FF, но, скажем, у меня есть цвет AE83FC, который является сложным цветом, как, черт возьми, я могу найти его более светлую или темную версию автоматически?

Я решил, что простой способ сделать это - конвертировать мой RGB в HSB [Оттенок, Насыщенность, Яркость]

Как мне это сделать в Objective-C?

Давайтескажем, у меня есть RGB, который составляет: 1,0, 0,0, 0,0.Это красный.

CGFloat r = 1.0;
CGFloat g = 0.0;
CGfloat b = 0.0;

Как мне преобразовать это в HSB, а затем преобразовать цвета и вернуть его в RGB, чтобы я мог использовать CGContextRGBSetFillColor?

Есть ли какие-либо функции HSB?

Пожалуйста, помогите.:)

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

Во-первых, имейте в виду, что три числа не описывают цвет, а три числа вместе с цветовым пространством. RGB - это не цветовое пространство, а то, что называется цветовой моделью. Есть много цветовых пространств с моделью RGB. Таким образом, ((1,0,0), sRGB) отличается от цвета ((1,0,0), Adobe RGB). Знаете ли вы, как работают строковые кодировки, где куча байтов сама по себе не является строкой? Это очень похоже на это. Это также похоже на то, что вы как бы напрашиваетесь на неприятности всякий раз, когда хотите посмотреть на значения компонентов, потому что это возможность испортить обработку цветового пространства.

Извините, ничего не могу с собой поделать. В любом случае, я отвечу на вопрос так, как если бы ваш исходный цвет был ((1,0,0), Generic RGB).

NSColor *color = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1];
NSLog(@"hue! %g saturation! %g brightness! %g, [color hueComponent], [color saturationComponent], [color brightnessComponent]);

а с другой стороны

NSColor *color = [NSColor colorWithCalibratedHue:h saturation:s brightness:b alpha:1];
NSLog(@"red! %g green! %g blue! %g, [color redComponent], [color greenComponent], [color blueComponent]);

Эти методы fooComponent не работают со всеми цветами, только в двух определенных цветовых пространствах, см. Документы. Вы уже знаете, что хорошо, если вы создали цвета самостоятельно с помощью методов, описанных выше. Если у вас есть цвет неизвестного происхождения, вы можете (попытаться) преобразовать его в цветовое пространство, в котором вы можете использовать эти методы компонентов с -[NSColor colorUsingColorspaceName:].

0 голосов
/ 07 апреля 2010

Для этого не нужно идти до HSB. Если вы хотите найти более темную версию цвета, просто умножьте каждый компонент R, G и B на число от 0 до 1, и вы получите тот же цвет, но темнее.

Пример: половина интенсивности AE83FC:

  {0xAE, 0x83, 0xFC} * 0.5 =
  {174, 131, 252} * 0.5 =
  {87, 65, 126} =
  {0x57, 0x41, 0x7E} => 57417E

Таким же образом, вы можете получить более яркие версии, умножив на что-нибудь> 1. Значение каждого компонента не может быть больше 255, поэтому, когда это происходит, вам нужно ограничить его значением 255. Это означает, что цвет не будет точно более яркой версией того же цвета, но, вероятно, достаточно близким для ваших целей.

...