简单渐变将范围线性划分为相等的部分。
例如,如果我们只看红色部分,并且希望分 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 输入。