Как масштабировать цвета с помощью HSV в Objective C

Если я сфотографирую белый блок, который читает RGB (255 255 255) и HSV (0,0,100).

Теперь я делаю вторую фотографию фиолетового блока внутри при разных условиях освещения, RGB оказывается (79, 40, 145) и HSV (262, 72, 56). Теперь, поскольку их значения различаются (разные условия освещения) в их HSV, становится очевидным, что их значения RGB нельзя точно сравнивать с тестом.

Поэтому мне нужно использовать HSV. Итак, чтобы увеличить масштаб моего HSV, мне нужно умножить фиолетовое значение на 100/56, чтобы довести его до 100. Следовательно, в результате получается цвет HSV (262, 72, 100). Теперь. Это здорово и модно, но есть ли способ в Objective-C прочитать HSV обратно в RGB или преобразовать HSV в RGB? Кажется, я не могу найти никаких хороших ресурсов по этому вопросу.

Я не уверен, с чем читать мой цвет, но вот пример кода того, что я пытаюсь выполнить:

CIColor *myColor = [CIColor colorWithRed:rn green:gn blue:bn alpha:1];

где rn, gn и bn — это RGB моего фиолетового цвета.

Теперь я хочу получить HSV из этого объекта CIColor.

hn = myColor.hue;
sn = myColor.saturation;
vn = myColor.value;

Далее я хочу взять этот HSV и масштабировать его до белого цвета, вот так.

CIColor *myNewColor = [CIColor colorWithHue:hn, saturation:sn, value:vn*(vw/vn)];

и измените его обратно на RGB.

Извините, если это сбивает с толку - возможно, есть лучший способ сделать это.

РЕДАКТИРОВАТЬ 2:

 rw = [self.whiteRGBValues.red floatValue];
gw = [self.whiteRGBValues.green floatValue];
bw = [self.whiteRGBValues.blue floatValue];
hw = [self.whiteRGBValues.hue floatValue];
sw = [self.whiteRGBValues.sat floatValue];
vw = [self.whiteRGBValues.val floatValue];


NSLog([NSString stringWithFormat:@"%f,%f,%f,%f,%f,%f",rw,gw,bw,rn,gn,bn]);
float scalar = vw/vn;

UIColor *myColor = [UIColor colorWithRed:rn green:gn blue:bn alpha:1];
CGFloat myHue, mySat, myBright, myAlpha;

[myColor getHue:&myHue saturation:&mySat brightness:&myBright alpha:&myAlpha];

UIColor *scaledColor = [UIColor colorWithHue:myHue
                                 saturation:mySat
                                 brightness:myBright*scalar
                                      alpha:myAlpha];

CGFloat myScaledR, myScaledG, myScaledB, myScaledAlpha;
CGFloat myScaledHue, myScaledSat, myScaledBright;

[scaledColor getRed:&myScaledR green:&myScaledG blue:&myScaledB alpha:&myScaledAlpha];

self.rgbScaledValues.red = [[NSNumber numberWithFloat:myScaledR] stringValue];
self.rgbScaledValues.green = [[NSNumber numberWithFloat:myScaledG] stringValue];
self.rgbScaledValues.blue = [[NSNumber numberWithFloat:myScaledB] stringValue];

[scaledColor getHue:&myScaledHue saturation:&myScaledSat brightness:&myScaledBright alpha:&myScaledAlpha];
self.rgbScaledValues.hue = [[NSNumber numberWithFloat:myScaledHue] stringValue];
self.rgbScaledValues.sat = [[NSNumber numberWithFloat:myScaledSat] stringValue];
self.rgbScaledValues.val = [[NSNumber numberWithFloat:myScaledBright] stringValue];

Я получаю сообщение об ошибке с точкой останова в строке с

`UIColor *myColor = [UIColor colorWithRed:rn green:gn blue:bn alpha:1];`

person Tukajo    schedule 10.07.2014    source источник
comment
Это неясно. Возможно, какой-то соответствующий код поможет.   -  person rmaddy    schedule 10.07.2014
comment
Примечание: не используйте NSString stringWithFormat с NSLog. Это избыточно. NSLog уже принимает строковый формат.   -  person rmaddy    schedule 10.07.2014
comment
Хороший совет - не знал. Спасибо   -  person Tukajo    schedule 10.07.2014


Ответы (1)


Вы можете получить компоненты HSB и RGB, используя встроенные методы. Сначала преобразуйте CIColor в UIColor.

UIColor *color = [UIColor colorWithCIColor: myColor];

CGFloat hue;
CGFloat saturation;
CGFloat brightness;
CGFloat alpha;
[color getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha];
// those 4 floats now hold the HSB values of this color

CGFloat red;
CGFloat green;
CGFloat blue;
CGFloat alpha2;
[color getRed:&red green:&green blue:&blue alpha:&alpha2];
// those 4 floats now hold the RGB values of this color

Теперь вы можете делать с этими значениями все, что хотите, включая манипулирование ими для создания новых цветов.

person Dima    schedule 10.07.2014
comment
Понял; но для промежуточного шага HSV и HSB работают одинаково? Или это не взаимозаменяемые форматы? - person Tukajo; 10.07.2014
comment
Я считаю, что это одно и то же. - person Dima; 10.07.2014
comment
Просто не был уверен, что HSL = HSB или HSB = HSV. Смешной; довольно много форматов. Спасибо за помощь. - person Tukajo; 10.07.2014
comment
Похоже, HSB = HSV, а HSL — это другое. - person Dima; 10.07.2014
comment
Обязательно проверьте возвращаемое значение методов getHue... и getRed.... Они выйдут из строя при различных (и распространенных) условиях. - person rmaddy; 10.07.2014
comment
Нужна ли методу colorWithRed в UIColor 0-1 или 0-255? Получение ошибки при вводе поплавков от 0-1. - person Tukajo; 10.07.2014
comment
@rmaddy и Дима Я добавил еще немного информации об ошибке. - person Tukajo; 10.07.2014
comment
@Tukajo Прочтите документы для UIColor colorWithRed.... Он говорит вам, какие значения должны быть. - person rmaddy; 10.07.2014
comment
Решил это; Спасибо ребята. Альфа должна быть 1.0f, а не 1; неправильный ввод поплавка. - person Tukajo; 10.07.2014