【发布时间】:2013-11-19 10:12:21
【问题描述】:
假设我有两种颜色。
public final static Color FAR = new Color(237, 237, 30);
public final static Color CLOSE = new Color(58, 237, 221);
如何在不浸入深色的情况下从一种颜色过渡到另一种颜色?
我想出了一些想法,例如
double ratio = diff / range; // goes from 1 to 0
int red = (int)Math.abs((ratio * FAR.getRed()) - ((1 - ratio) * CLOSE.getRed()));
int green = (int)Math.abs((ratio * FAR.getGreen()) - ((1 - ratio) * CLOSE.getGreen()));
int blue = (int)Math.abs((ratio * FAR.getBlue()) - ((1 - ratio) * CLOSE.getBlue()));
或
double ratio = diff / range; // goes from 1 to 0
int red = (int) ((1 - (diff / range)) * FAR.getRed() + CLOSE.getRed() - FAR.getRed());
int green = (int) ((1 - (diff / range)) * FAR.getGreen() + CLOSE.getGreen() - FAR.getGreen());
int blue = (int) ((1 - (diff / range)) * FAR.getBlue() + CLOSE.getBlue() - FAR.getBlue());
但不幸的是,它们都没有从一种颜色平滑过渡到另一种颜色。 有谁知道如何在保持颜色明亮而不陷入较暗颜色的同时做到这一点,或者如何确保渐变过渡是平滑的,而不是先慢后快再慢?
我真的想不出任何公式。
【问题讨论】:
-
diff和range是否都是整数?如果是,请注意整数除法。 -
我在一个循环中使用它们,在这里我从 30 开始差异并下降到 0。我的范围是 30 双倍。因此,我将其用作以 30 步从 1 到 0 平稳过渡的手段。但是我认为步骤数应该没有那么重要。
-
将 RGB 颜色空间视为cube。在立方体上找到两种颜色,然后决定如何从一个点移动到另一个点以获得所需的过渡颜色。例如,您可以在立方体中钻出一条隧道,直接从一种颜色变为另一种颜色。或者,您可以限制移动以沿着立方体的表面停留,以避免不饱和的灰色颜色。