Objective-C RGB в HSB

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

Я решил, что простой способ сделать это - конвертировать мой RGB в HSB [Hue, Saturation, Brightness]

Как бы я это сделал в 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 ответа

Решение

Во-первых, имейте в виду, что три числа не описывают цвет, а три числа вместе с цветовым пространством. 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:],

Для этого нет необходимости идти до 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. Это означает, что цвет не будет точно более яркой версией того же цвета, но, вероятно, достаточно близким для ваших целей.

Другие вопросы по тегам