我看过here,但我不太明白那里发生了什么。我是c#的新手,我正在尝试制作一个十六进制代码梯度生成器。我给了两串十六进制代码和一堆降压/升。
例如:
black: 000000 to grey: 666666
with a step of 10.
这将产生10个不同的HEX代码,这些代码将从这两个点构建一个渐变。我想知道我会怎么做,或者有人能给我一个如何做到这一点的算法。
谢谢!
答案 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;
}
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