【问题标题】:Calculate the color at a given point on a gradient between two colors?计算两种颜色之间渐变上给定点的颜色?
【发布时间】:2014-03-06 07:43:08
【问题描述】:

所以这基本上是我想编写的方法(在 Objective-C/Cocoa 中,使用 UIColors,但我真的只是对底层数学感兴趣):

+ (UIColor *)colorBetweenColor:(UIColor *)startColor andColor:(UIColor *)endColor atLocation:(CGFloat)location;

举个例子,假设我有两种颜色,纯红色和纯蓝色。给定两者之间的线性渐变,我想计算在该渐变上的 33% 标记处的颜色:
所以如果我这样调用我的方法:

UIColor *resultingColor = [UIColor colorBetweenColor:[UIColor redColor] andColor:[UIColor blueColor] atLocation:0.33f];

我会在“B”处得到结果颜色,同样,传递0.0f 作为位置将返回颜色“A”,1.0f 将返回颜色“C”。

所以基本上我的问题是,我将如何混合两种颜色的 RGB 值并确定它们之间某个“位置”的颜色?

【问题讨论】:

标签: ios colors gradient uicolor


【解决方案1】:

您只需像这样线性插值红色、绿色和蓝色通道:

double resultRed = color1.red + percent * (color2.red - color1.red);
double resultGreen = color1.green + percent * (color2.green - color1.green);
double resultBlue = color1.blue + percent * (color2.blue - color1.blue);

percent 是一个介于 0 和 1 之间的值(location 在您的第一个方法原型中)。

【讨论】:

  • @LudovicLandry 你能详细说明一下吗?您可以在任何颜色空间中线性插值颜色,但结果可能并不总是令人满意或您所期望的。 (事实上​​,即使在 RGB 中,您也经常会通过灰色,这有时是不希望的。)以上内容在哪些方面不适用于哪些颜色空间?
  • 例如,这不适用于 [UIColor whiteColor],因为它不在 RGB 中。见stackoverflow.com/questions/4700168/…
  • @LudovicLandry - 啊,我明白你的意思了。是的,您必须将命名颜色转换为其他颜色空间(RGB、HSV、CMYK 等)。但是,一旦它们处于可以进行数学运算的颜色空间中,线性插值就可以正常工作。
  • 谢谢伙计。我因为没有意识到这一点而感到愚蠢。非常感谢。
【解决方案2】:

RGB 色彩空间就像一个圆圈。外边界饱和度最高,中间为灰色。从一种颜色移动到另一种颜色,您最好从中间沿着相同的半径(圆)这样做;以便饱和度和价值保持不变。在这种情况下,色调以线性方式变化。您不会进入比您最初的左右颜色更多的灰色区域。 你可以从一个内环到一个外环,简单地上升(或下降)饱和度;再次线性。 色环见here(在例如paint.net中尝试)

Apple 的 (iOS) 物镜类允许您使用 RGB 以外的其他光谱。

【讨论】:

  • RGB 不像圆形,它是一个立方体。像 HSV 或 HSB 这样的空间形成一个圆圈,色调以度数或弧度为单位。
猜你喜欢
  • 2019-12-07
  • 2013-08-02
  • 2010-09-24
  • 2023-03-14
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2012-11-27
  • 2020-08-21
相关资源
最近更新 更多