【问题标题】:Generate n colors between two colors在两种颜色之间生成n种颜色
【发布时间】:2013-07-06 19:40:09
【问题描述】:

我正在尝试编写函数,它可以根据给定值生成两种颜色之间的颜色。一个例子会更好地解释它..

输入..

X : 1
Y : 0.5
Z : 0

用户给出任意一组color:value 对,然后输入一个数字(比如 0.75)。然后我必须生成按比例混合 Y 和 Z 的颜色(基于它们的值和输入值)。我正在考虑以下方法。

  • 查找值周围的颜色,对于 0.75,它将是 0.5 和 1。
  • 根据值以某种方式混合这两种颜色并生成新颜色。

我完全迷失了,关于如何生成颜色,是否有任何库。

更新: 这是我正在进行的一个更大项目的一部分。假设我们有..

1 : X
0 : Y

和用户输入,0.25

我想要点东西..

(X*0.25 + Y*0.75)

因为它更接近 Y,这就是为什么比例更高。如果用户输入,0.5..输出应该是

(X*0.5 + Y*0.5)

等等。我不知道如何用 RGB 颜色做到这一点。

P.S:这些问题不是特定于语言的,但我是用 Java 做的。

【问题讨论】:

  • 你能再分享一些示例输入和相应的输出吗?
  • 我不认为混合会是独一无二的。 0.25 = 1/4 红色 + 3/4 绿色或 1/2 * 黄色 + 1/2 绿色。尝试将权重按比例设置为三位数,其中 abc,其中 a 是红色,b 绿色和 c 黄色的权重?
  • 添加了更多细节。
  • 我认为您需要阅读一般的加色混合,知道对于给定任务可能更容易使用的其他颜色空间(例如.HSB/HSV)。 java.awt.Color 值得一看。
  • Red : 1 Green : 0 Yellow : 0.5 你知道颜色是 RGB 而不是 RGY,对吧?顺便说一句 - 我会使用快速的'n'dirty方法将渐变绘制到BufferedImage,然后从图像中获取中间颜色。

标签: java algorithm colors rgb


【解决方案1】:

您必须像这样单独混合每个颜色通道(红色、绿色和蓝色):

Color x,y; //set by you
float blending;//set by you

float inverse_blending = 1 - blending;

float red =   x.getRed()   * blending   +   y.getRed()   * inverse_blending;
float green = x.getGreen() * blending   +   y.getGreen() * inverse_blending;
float blue =  x.getBlue()  * blending   +   y.getBlue()  * inverse_blending;

//note that if i pass float values they have to be in the range of 0.0-1.0 
//and not in 0-255 like the ones i get returned by the getters.
Color blended = new Color (red / 255, green / 255, blue / 255);

到目前为止,颜色示例。通常,如果您想要两个值之间的线性插值,您必须执行以下操作:

var firstValue;
var secondValue;
var interpolation;

var interpolated =  firstValue * interpolation + 
                   secondValue * (1 - interpolation);

但是由于您的情况有Color-Objects,因此您无法一步插入整个对象,您必须自行插入每个相关值。最终你还必须插入alpha-channel,不知道,因为你没有提到它,但为了完整起见,我将它包含在这个答案中。

【讨论】:

  • 这听起来不错。我没有第四频道,所以应该没问题。
【解决方案2】:

颜色是三维空间中的一个点。使用的确切坐标取决于所谓的“颜色空间”,其中有几种:RGB、HSV 等。因此,要计算两种给定颜色之间的颜色,请在相同颜色空间中获取这两种颜色,然后在它们之间的 3d 空间中计算这两种颜色之间的第三个点。

最简单的方法是对颜色空间的三个值(例如 R、G 和 B)中的每一个进行线性插值。但是还有一个更复杂的情况是坐标值通常不是线性的,因此您必须首先对其进行线性化(例如,电视颜色是指数型的,λ 约为 2.2)。根据您的应用程序,错误地假设线性可能无论如何都可以正常工作,尤其是在起始颜色已经接近的情况下。

(如 luk2302 所述,如有必要,为 alpha 添加第四个坐标)。

【讨论】:

  • 是否有任何用于 3D 插值的库,这对我来说听起来并不难。
  • 嗯,不,这只是一个简单的公式:从 x0 到 x1 的直线上的 25% 就是 (x0 + (.25 * (x1 - x0)))。做三遍。
【解决方案3】:

你可以像这样使用 Java.awt.color:

public Color mixColors(Color color1, Color color2, double percent){
      double inverse_percent = 1.0 - percent;
      int redPart = (int) (color1.getRed()*percent + color2.getRed()*inverse_percent);
      int greenPart = (int) (color1.getGreen()*percent + color2.getGreen()*inverse_percent);
      int bluePart = (int) (color1.getBlue()*percent + color2.getBlue()*inverse_percent);
      return new Color(redPart, greenPart, bluePart);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-21
    • 2016-08-07
    • 2012-11-27
    • 2013-08-02
    • 2019-12-07
    • 2018-07-24
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多