一尘不染

Java平滑颜色过渡

algorithm

假设我有两种颜色。

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());

但是不幸的是,它们都没有从一种颜色平稳过渡到另一种颜色。有人会知道如何在保持颜色明亮而不浸入深色的同时做到这一点,或者如何确保渐变过渡平滑而不是先变慢而不是先变快再变慢?

我真的不会提出任何公式。


阅读 323

收藏
2020-07-28

共1个答案

一尘不染

您在计算中使用了错误的符号。要正确应用该比例,应为正而不是负。

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()));

现有实现中出现深色的原因是,使用(-)时,它们通常会接近零(小于50?或负值但大于-50?),而在负数情况下,您正在绝对值,因此它变成一个小的正数,即深色。

2020-07-28