【问题标题】:How to scale colors using HSV in Objective C如何在 Objective C 中使用 HSV 缩放颜色
【发布时间】:2014-09-01 06:23:54
【问题描述】:

如果我拍一张白色块的照片,其 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];

rngnbn 是我的紫色的 RGB。

现在我想做的是从那个 CIColor 对象中获取 HSV。

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];`

【问题讨论】:

  • 这还不清楚。也许一些相关的代码会有所帮助。
  • 旁注 - 不要将 NSString stringWithFormatNSLog 一起使用。这是多余的。 NSLog 已经采用字符串格式。
  • 好提示 - 不知道。谢谢

标签: ios objective-c colors rgb hsv


【解决方案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

从那里,您现在可以对这些值做任何您想做的事情,包括操作它们以创建新颜色。

【讨论】:

  • 我明白了;但是对于中间步骤,HSV 和 HSB 的工作方式是否相似?或者它们不是可互换的格式?
  • 我相信这些是一回事。
  • 只是不确定 HSL = HSB 还是 HSB = HSV。哈哈;相当多的格式。感谢您的帮助。
  • 看起来 HSB = HSV,而 HSL 是不同的。
  • 一定要检查getHue...getRed...方法的返回值。它们会在各种(和常见的)条件下失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多