C#Hex代码阴影梯度发生器

时间:2012-02-23 00:41:58

标签: c# hex gradient

我看过here,但我不太明白那里发生了什么。我是c#的新手,我正在尝试制作一个十六进制代码梯度生成器。我给了两串十六进制代码和一堆降压/升。

例如:

black: 000000 to grey: 666666
with a step of 10. 

这将产生10个不同的HEX代码,这些代码将从这两个点构建一个渐变。我想知道我会怎么做,或者有人能给我一个如何做到这一点的算法。

谢谢!

2 个答案:

答案 0 :(得分:2)

简单渐变将范围线性划分为相等的部分。

例如,如果我们只看红色组件并且我们希望以5个步骤从0到250(十进制),那么每个部分将是((250 - 0)/(5 - 1)) = 62.5。
数值将为:0,62.5,125,187.5和250。

现在你要做的就是为每个组件重复这个线性除法。

关于Alpha频道

请注意,Color数据结构包含alpha通道值,在0x666666的情况下不会反映出来。如果你考虑模板0xRRGGBB的值,并假设alpha通道将是0xFF(即完全不透明),那么一切都很好。

但是如果你想在渐变中包含alpha通道(如此处的所有示例所示),那么对于模板0xAARRGGBB,在你的情况下alpha通道将为0,这意味着颜色将是完全的透明(不可见)。

从uint

构建Color

关于Color.FromArgb()的一个令人讨厌的事情是它接受int值而不是uint。因此,以0xFF666666为例,它将抛出异常。

为了克服这个问题,我们需要稍微移动一下弄脏手:

private static Color GetColorFromArgb( uint colorValue )
{
    Color color = Color.FromArgb(
                        (int)((colorValue & 0xFF000000) >> 24),
                        (int)((colorValue & 0x00FF0000) >> 16),
                        (int)((colorValue & 0x0000FF00) >> 8),
                        (int)((colorValue & 0x000000FF))
                    );

    return color;
}

编辑:GetColorFromArgb解释

要回答“如何将十六进制代码转换为RGB?”这一问题,那么GetColorFromArgb已经将十六进制数转换为R,G,B,但也添加了alpha通道信息。

GetColorFromArgb的输入是32位无符号整数。如果我们查看它的十六进制表示,那么它的模板是:0xAARRBBGG。

GetColorFromArgb使用位掩码和位移一个接一个地提取组件,然后调用Color.FromArgb(int a, int r, int g, int b)

以下是GetColorFromArgb的详细版本:

private static Color GetColorFromArgb(uint colorValue)
{
    int a = (int)((colorValue & 0xFF000000) >> 24);
    int r = (int)((colorValue & 0x00FF0000) >> 16);
    int g = (int)((colorValue & 0x0000FF00) >> 8);
    int b = (int)(colorValue & 0x000000FF);

    Color color = Color.FromArgb(a, r, g, b);

    return color;
}

如果问题是如何忽略alpha通道,那么你可以创建一个GetColorFromRGB()方法,它不会提取alpha信息,而是传递一个固定值:

private static Color GetColorFromRGB(int colorValue)
{
    int a = 0xFF; // Fully opaque
    int r = (int)((colorValue & 0x00FF0000) >> 16);
    int g = (int)((colorValue & 0x0000FF00) >> 8);
    int b = (int)(colorValue & 0x000000FF);

    Color color = Color.FromArgb(a, r, g, b);

    return color;
}
  • 请注意,由于您使用的是0xRRGGBB值,因此您可以使用int代替uint输入。

答案 1 :(得分:0)

一种非常简单的方法是计算中间的红色,绿色和蓝色组件值...类似于:

Dim tOriginHexColor As String = "000000"
Dim tTargetHexColor As String = "666666"
Dim tSteps As Byte = 10

Dim tOriginColor as Color = ColorTranslator.FromHtml(tOriginHexColor)
Dim tTargetColor As Color = ColorTranslator.FromHtml(tTargetHexColor)

Dim tRedStep As Byte = tTargetColor.R - tOriginColor.R
Dim tBlueStep As Byte = tTargetColor.R - tOriginColor.B
Dim tGreenStep As Byte = tTargetColor.R - tOriginColor.G

For tIndex As Int16 = 0 To tSteps - 1
  Debug.Print(ColorTranslator.ToHtml(Color.FromArgb(tOriginColor.R + tRedStep, tOriginColor.G + tGreenStep, tOriginColor.B + tBlueStep)))
Next