【问题标题】:C# Hex Code Shadow Gradient GeneratorC# 十六进制代码阴影渐变生成器
【发布时间】:2023-03-09 17:07:01
【问题描述】:

我看过here,但我不太明白那里发生了什么。我对 c# 很陌生,我正在尝试制作一个 HEX 代码渐变生成器。我得到了两串十六进制代码,带有一堆降级/升级。

例如:

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

这将生成 10 种不同的 HEX 代码,这些代码将从这两个点构建我的渐变。我想知道我该怎么做,或者是否有人可以给我一个如何做到这一点的算法。

谢谢!

【问题讨论】:

    标签: c# hex gradient


    【解决方案1】:

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

    例如,如果我们只看红色部分,并且希望分 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 输入。

    【讨论】:

      【解决方案2】:

      一个非常简单的方法是计算中间的红色、绿色和蓝色分量值......类似于:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-23
        • 2010-09-06
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 2015-03-21
        • 1970-01-01
        • 2013-12-17
        相关资源
        最近更新 更多