4

我试图淡化一种颜色,让我们说Yellow一段White时间。我已经把计时器搞定了,我也可以很好地应用新颜色,但是褪色并不平滑(例如,它在到达之前会褪色成一些奇怪的颜色White,其中一些比它们的前身更暗在“褪色链”上,我们称之为)。我相信这是因为数学是错误的,但我似乎无法找到一个很好的数学例子来修改我正在做的事情。

我什至ColorCeiling从这个问题中提取了代码的基础知识:Fade a color to white (increasing brightness)

现在我取一个颜色,并调用一个扩展方法Increase

dataGridViewResults.Rows[0].DefaultCellStyle.BackColor.Increase(50);

public static Color Increase(this Color color, byte offset)
{
    return Color.FromArgb(
        color.A.ColorCeiling(offset),
        color.R.ColorCeiling(offset),
        color.G.ColorCeiling(offset),
        color.B.ColorCeiling(offset));
}

正如你所看到的,每种颜色都会被一个偏移量修改,并考虑到一个上限,以防止抛出异常。该扩展方法ColorCeiling如下所示:

public static int ColorCeiling(this byte val, byte modifier, byte ceiling = 255)
{
    return (val + modifier > ceiling) ? ceiling : val + modifier;
}

现在,我确信这ColorCeiling就是问题所在,但老实说,我就是找不到数学。老实说,我觉得仅仅增加 ARGB 几乎肯定是错误的方法,似乎你会说我希望你轻 50%,但就代码而言,我只是不知道这意味着什么。

4

4 回答 4

8

这是一个可能有效的想法。

不要在红绿蓝空间中进行数学运算。而是将您的颜色视为具有三个组成部分:

  • 色调(是红色、橙色、黄色、绿色、蓝色、紫色等),
  • 饱和度(颜色有多强烈?)
  • 值(颜色中有多少黑度?)

有从 RGB 转换为 HSV 的算法;查找它们。这是一个很好的起点:

http://en.wikipedia.org/wiki/HSL_and_HSV

现在,当您从一种颜色渐变到另一种颜色时,沿着 HSV 轴而不是 RGB 轴采取步骤。

于 2013-05-21T20:08:42.827 回答
2

渐变是您正在寻找的。您将不得不像这样将它们分开并重新组合..

int rMax = Color.Yellow.R;
int rMin = Color.White.R;
int bMax = Color.Yellow.B;
int bMin = Color.White.B;
int gMax = Color.Yellow.G;
int gMin = Color.White.G;

var colorList = new List<Color>();
for(int i=0; i<size; i++)
{
    var rAverage = rMin + (int)((rMax - rMin) * i / size);
    var bAverage = bMin + (int)((bMax - bMin) * i / size);
    var gAverage = gMin + (int)((gMax - gMin) * i / size);

    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage));
}
于 2013-05-21T20:09:16.673 回答
1

百分比意味着乘法,而不是加法。在我非常简单的 JavaScript Color 类中,我通过定义两种颜色并混合 RGB 尺寸来完成这类事情。

从我的颜色课:

this.getBlendedColor = function(color, percent) {
    // limit percent between 0 and 1.
    // this percent is the amount of 'color' rgb components to use
    var p = percent > 0 ? percent : 0;
    p = p < 1 ? p : 1;

    // amount of 'this' rgb components to use
    var tp = 1 - p;

    // blend the colors
    var r = Math.round(tp * this.r + p * color.r);
    var g = Math.round(tp * this.g + p * color.g);
    var b = Math.round(tp * this.b + p * color.b);

    // return new color object
    return new Color(r, g, b);
} // getBlendedColor ()

所以,如果你有一些颜色 c,并且你想让它变白 50%,你会这样做:

var newColor = c.getBlendedColor(new Color('#ffffff'), 0.50);

如果您使用的是 alpha 通道,则可以明确包含它而不会造成任何问题——您示例中的两种颜色可能都是 100% 的不透明度。

使用简单 RGB 颜色混合数学的示例渐变:http: //jsfiddle.net/2MymY/1/

于 2013-05-21T20:16:29.520 回答
0

这是我用来在 RGB 颜色空间中从一种颜色渐变到另一种颜色的一些代码。它非常适合我的目的。您可能必须对其进行调整以逐步返回颜色。目前,对于每个i,您将有一个介于和之间curClri/discreteUnits百分比。baseClrfadeTo

int discreteUnits = 10;
Color fadeTo = Color.Green;
Color baseClr = Color.Red;
float correctionFactor = 0.0f;
float corFactorStep = 1.0f / discreteUnits;

for(int i = 0; i < discreteUnits; i++)
{
    correctionFactor += corFactorStep;
    float red = (fadeTo.R - baseClr.R) * correctionFactor + baseClr.R;
    float green = (fadeTo.G - baseClr.G) * correctionFactor + baseClr.G;
    float blue = (fadeTo.B - baseClr.B) * correctionFactor + baseClr.B;
    Color curClr = Color.FromArgb(baseClr.A, (int)red, (int)green, (int)blue);
}

感谢这个网站给了我一个起点:http ://www.pvladov.com/2012/09/make-color-lighter-or-darker.html

于 2014-07-09T12:57:58.977 回答