Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RGB值改进颜色着色和着色算法_C#_Algorithm_Math_Colors - Fatal编程技术网

C# 使用RGB值改进颜色着色和着色算法

C# 使用RGB值改进颜色着色和着色算法,c#,algorithm,math,colors,C#,Algorithm,Math,Colors,我曾经想知道如何获得所选颜色的不同色度和色调,但现在我希望改进算法。中间范围的颜色(RGB的总计达400到500)产生了与下面2行和4行所见的优异结果。但超出该范围的颜色会导致更像第1行和第3行中的颜色,其中较浅的颜色不会褪色很多。我想我需要调整我的乘数来纠正这个问题,但我的数学技能就是达不到这个要求 private void getShadesAndTints(Color c) { int i; Double m; int r; int g; int b; for (i

我曾经想知道如何获得所选颜色的不同色度和色调,但现在我希望改进算法。中间范围的颜色(RGB的总计达400到500)产生了与下面2行和4行所见的优异结果。但超出该范围的颜色会导致更像第1行和第3行中的颜色,其中较浅的颜色不会褪色很多。我想我需要调整我的乘数来纠正这个问题,但我的数学技能就是达不到这个要求

private void getShadesAndTints(Color c)
{
    int i; Double m;
    int r; int g; int b;
    for (i = 1; i < 21; i++)
    {
        m = i * 0.1;
        r = (int)(c.R * m); if (r > 255) r = 255;
        g = (int)(c.G * m); if (g > 255) g = 255;
        b = (int)(c.B * m); if (b > 255) b = 255;
        colorList.Add(Color.FromArgb(r, g, b));
    }
}

private void getShadesAndTints(c色)
{
int i;双m;
int r;int g;int b;
对于(i=1;i<21;i++)
{
m=i*0.1;
r=(int)(c.r*m);如果(r>255)r=255;
g=(int)(c.g*m);如果(g>255)g=255;
b=(int)(c.b*m);如果(b>255)b=255;
添加(Color.FromArgb(r,g,b));
}
}

如果您想亲自尝试,完整代码可从以下网址获得:

据我所知,这里有一种方法可以在阴影中均匀增加黑暗度:-

private void getShades(Color c)
{
    int i; Double factor;
    int r; int g; int b;
    for (i = 20; i >=0; i--)
    {
        factor = i/20;
        r = (int)(c.R * factor); if (r > 255) r = 255;
        g = (int)(c.G * factor); if (g > 255) g = 255;
        b = (int)(c.B * factor); if (b > 255) b = 255;
        colorList.Add(Color.FromArgb(r, g, b));
    }
}
说明:颜色的亮度仅取决于rgb的大小,而不改变它们的比率,因此乘以(0,1)中的因子可以得到具有所需亮度的颜色


注意:您所做的工作可以很好地从纯色生成色调。

以下是我的结论。它与Vikram Bhat的答案不同,我现在做两个独立的循环,一个用于阴影,一个用于色调,通过获取计数器的最大值来维持分布,取总RGB,除以38.25(如果取765,除以20)。我应该在我的原始帖子中提到,我在寻找尽可能均匀分布的20种颜色,这就是这个算法现在所做的。选择各种深浅的灰色、白色和黑色,实际上会返回完全相同的20种颜色(无论好坏)

private void getShadesAndTints(c色)
{
双RGB;双最大值;
RGB=(int)c.R+(int)c.G+(int)c.B;
max=(int)RGB/38.25;
max=数学圆(max);
如果(max==19)max=20;
双i;双f;
int r;int g;int b;
对于(i=0;i255)r=255;
g=(int)(c.g*f);如果(g>255)g=255;
b=(int)(c.b*f);如果(b>255)b=255;
添加(Color.FromArgb(r,g,b));
}
最大值=20-最大值;
对于(i=0;i255)r=255;
g=(int)((255-c.g)*f+c.g);如果(g>255)g=255;
b=(int)((255-c.b)*f+c.b);如果(b>255)b=255;
添加(Color.FromArgb(r,g,b));
}
}
以下是我的做法:

    /// <summary>
    /// <para>Fades the specified color by the fading factor from interval [-1, 1].</para>
    /// <para>
    /// For example, -0.3 will make color 30% darker and 0.3 will make color 30% lighter.
    /// </para>
    /// </summary>
    /// <param name="color">The color.</param>
    /// <param name="fading">The fading factor.</param>
    /// <returns>The faded color.</returns>
    private static Color Fade(Color color, double fading)
    {
        Debug.Assert(fading >= -1 && fading <= 1);

        if (fading < 0)
        {
            var shade = 1 + fading;
            return Color.FromArgb(ShadeComponent(color.R, shade), ShadeComponent(color.G, shade), ShadeComponent(color.B, shade));
        }
        else if (fading > 0)
        {
            var tint = 1 - fading;
            return Color.FromArgb(TintComponent(color.R, tint), TintComponent(color.G, tint), TintComponent(color.B, tint));
        }
        else
            return color;
    }

    private static int ShadeComponent(int component, double shade)
    {
        return Round(component * shade);
    }

    private static int TintComponent(int component, double tint)
    {
        return Round(255 - (255 - component) * tint);
    }

    private static int Round(double value)
    {
        return (int)Math.Round(value);
    }
//
///按间隔[-1,1]的淡入系数淡入指定颜色。
/// 
///例如,-0.3将使颜色变暗30%,0.3将使颜色变亮30%。
/// 
/// 
///颜色。
///衰落因素。
///褪色的颜色。
专用静态褪色(彩色、双褪色)
{
Assert(淡入淡出>=-1&&0)
{
var tint=1-褪色;
返回Color.FromArgb(TintComponent(Color.R,tint)、TintComponent(Color.G,tint)、TintComponent(Color.B,tint));
}
其他的
返回颜色;
}
私有静态int-ShadeComponent(int-component,双阴影)
{
返回圆(组件*阴影);
}
专用静态int-tint组件(int-component,双色)
{
返回轮(255-(255-成分)*色调);
}
专用静态整数舍入(双值)
{
返回(int)数学舍入(value);
}
    /// <summary>
    /// <para>Fades the specified color by the fading factor from interval [-1, 1].</para>
    /// <para>
    /// For example, -0.3 will make color 30% darker and 0.3 will make color 30% lighter.
    /// </para>
    /// </summary>
    /// <param name="color">The color.</param>
    /// <param name="fading">The fading factor.</param>
    /// <returns>The faded color.</returns>
    private static Color Fade(Color color, double fading)
    {
        Debug.Assert(fading >= -1 && fading <= 1);

        if (fading < 0)
        {
            var shade = 1 + fading;
            return Color.FromArgb(ShadeComponent(color.R, shade), ShadeComponent(color.G, shade), ShadeComponent(color.B, shade));
        }
        else if (fading > 0)
        {
            var tint = 1 - fading;
            return Color.FromArgb(TintComponent(color.R, tint), TintComponent(color.G, tint), TintComponent(color.B, tint));
        }
        else
            return color;
    }

    private static int ShadeComponent(int component, double shade)
    {
        return Round(component * shade);
    }

    private static int TintComponent(int component, double tint)
    {
        return Round(255 - (255 - component) * tint);
    }

    private static int Round(double value)
    {
        return (int)Math.Round(value);
    }