12

给定两种颜色和n步,如何计算 n 种颜色,包括产生渐变效果的两种给定颜色?

如果可能的话,最好使用伪代码,但这可能会在 Java 中实现。

谢谢!

4

7 回答 7

21

将每种颜色划分为其 RGB 分量,然后计算所需的各个步骤。

oldRed = 120;
newRed = 200;
steps = 10;
redStepAmount = (newRed - oldRed) / steps;

currentRed = oldRed;
for (i = 0; i < steps; i++) {
   currentRed += redStepAmount;
}

显然将其扩展到绿色和蓝色。

于 2008-11-26T02:42:58.337 回答
11

您还应该查看两个很好的相关问题:

请注意,您通常最好在 HSV 颜色空间而不是 RGB 中执行此操作 - 它会产生更令人愉悦的颜色(冲突或负面光学特性的可能性更低)。

祝你好运!

-亚当

于 2008-11-26T03:08:08.533 回答
5

如果你想要一个看起来像大多数颜色选择器 GUI 小部件的混合,你真的想翻译成 HSL 或 HSV。从那里开始,您可能对每个维度的线性插值都很好。

尝试直接在 RGB 颜色空间中进行任何插值是一个坏主意。这太非线性了(不,伽马校正在这种情况下无济于事)。

于 2008-11-26T03:32:52.947 回答
4

对于那些寻找可以复制和粘贴的东西的人。为 RGB 颜色做了一个快速功能。返回一个单一的颜色,它是ratio更接近的数量rgbColor2

function fadeToColor(rgbColor1, rgbColor2, ratio) {
    var color1 = rgbColor1.substring(4, rgbColor1.length - 1).split(','),
        color2 = rgbColor2.substring(4, rgbColor2.length - 1).split(','),
        difference,
        newColor = [];

    for (var i = 0; i < color1.length; i++) {
        difference = color2[i] - color1[i];
        newColor.push(Math.floor(parseInt(color1[i], 10) + difference * ratio));
    }

    return 'rgb(' + newColor + ')';
}
于 2014-04-01T20:48:15.547 回答
1

问题是你想要发生什么样的转变?如果您转置到 HSV 色彩空间并给出

FF0000 和 00FF00

它将从红色过渡到黄色到绿色。

但是,如果您将“黑色”或其他阴影定义为混合的中点,则必须先将颜色着色为 ff0000->000000->00ff00 或通过白色:ff0000 -> ffffff -> 00ff00。

然而,通过 HSV 进行转换可能会很有趣,因为您必须使用一些三角函数将圆形映射映射到矢量分量。

于 2008-11-26T02:44:34.353 回答
1

最简单的做法是颜色分量之间的线性插值(参见 nickf 的响应)。请注意,眼睛是高度非线性的,所以它不一定看起来你正在均匀地走。一些色彩空间试图解决这个问题(也许是 CIE?),因此您可能希望先转换为另一个颜色空间,进行插值,然后再转换回 RGB 或您正在使用的任何颜色空间。

于 2008-11-26T02:51:20.660 回答
0

这个答案怎么样

- (UIColor *)colorFromColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(float)percent
{
    float dec = percent / 100.f;
    CGFloat fRed, fBlue, fGreen, fAlpha;
    CGFloat tRed, tBlue, tGreen, tAlpha;
    CGFloat red, green, blue, alpha;

    if(CGColorGetNumberOfComponents(fromColor.CGColor) == 2) {
        [fromColor getWhite:&fRed alpha:&fAlpha];
        fGreen = fRed;
        fBlue = fRed;
    }
    else {
        [fromColor getRed:&fRed green:&fGreen blue:&fBlue alpha:&fAlpha];
    }
    if(CGColorGetNumberOfComponents(toColor.CGColor) == 2) {
        [toColor getWhite:&tRed alpha:&tAlpha];
        tGreen = tRed;
        tBlue = tRed;
    }
    else {
        [toColor getRed:&tRed green:&tGreen blue:&tBlue alpha:&tAlpha];
    }

    red = (dec * (tRed - fRed)) + fRed;
    green = (dec * (tGreen - fGreen)) + fGreen;
    blue = (dec * (tBlue - fBlue)) + fBlue;
    alpha = (dec * (tAlpha - fAlpha)) + fAlpha;

    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}
于 2015-07-13T05:38:56.260 回答