C# 实现颜色的梯度渐变案例

 更新时间:2021年01月14日 14:40:17   作者:不听不看不说  
这篇文章主要介绍了C# 实现颜色的梯度渐变案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

为了表示不同的浓度值,对颜色条应用颜色梯度变化,基本方法是对ARGB分量乘以一个渐变系数。

下面是对十种颜色应用的三个梯度值的过程。

 public void DrawRect(gasConcentration[] data)
    {
      Graphics graphic = pictureBox1.CreateGraphics();
      Graphics graphic2 = pictureBox2.CreateGraphics();
      int iCall2 = pictureBox2.Width/10;
           
      data = new gasConcentration[40];
      int iLen = pictureBox1.Width = 540; 
      int iHigh = pictureBox1.Height;
      //初始化十种颜色
      Color[] color = new Color[10] { Color.FromArgb(240, 0, 0), Color.Green, Color.Yellow, Color.Blue, Color.SteelBlue, Color.SeaGreen,
                    Color.Chartreuse, Color.SaddleBrown, Color.Violet, Color.BurlyWood};
          
      //十个颜色,每个颜色三个深度
      for (int i = 0; i < 40; i++)
      {        
        data[i].gasType = i/4 + 1;
        data[i].gasConc = i%4;
      }
      Color c3, c4;
      if (data.Length > 0)
      {       
        int iCall = iLen / data.Length;
        pictureBox2.Width = iCall * data.Length;
        pictureBox1.Width = iCall * data.Length;
        iCall2 = iCall * 4;
        //画对比框条
        for (int i = 0; i < 10; i++)
        {          
          Brush brush1 = new LinearGradientBrush(new Point(0, iHigh), new Point(iCall2, iHigh), color[i], color[i]);
          graphic2.FillRectangle(brush1, 0 + iCall2 * i, 0, iCall2, iHigh);
          brush1.Dispose();
        }
        //画颜色条梯度分量
        for (int i = 0; i < data.Length; i++)
        {          
          //将颜色分为三个深度
          if (data[i].gasConc != 0)
            c3 = c4 = Color.FromArgb((byte)(255 * (float)(1 - (data[i].gasConc * 0.01))),
            (byte)(color[data[i].gasType-1].R * (float)(1 - (data[i].gasConc * 0.2))),
            (byte)(color[data[i].gasType-1].G * (float)(1 - (data[i].gasConc * 0.2))),
            (byte)(color[data[i].gasType-1].B * (float)(1 - (data[i].gasConc * 0.2))));
          else
            c3 = c4 = Color.Black;
          Brush brush1 = new LinearGradientBrush(new Point(0, iHigh), new Point(iCall, iHigh), c3, c4);
          graphic.FillRectangle(brush1, 0 + iCall * i , 0, iCall, iHigh);
          brush1.Dispose();                  
        }
      }
      else
      {
        c4 = color[0];
        Brush brush1 = new LinearGradientBrush(new Point(0, iHigh), new Point(iLen, iHigh), c4, c4);        
        graphic.FillRectangle(brush1, 0, 0, iLen, iHigh);
        brush1.Dispose();
      }
      
    }
 public struct gasConcentration
    {
      int iGasType;//气体名称
      int iGasConc;//气体浓度 // 0=no, 1=low, 2=med, 3=high
 
      public int gasType { get { return iGasType; }
        set { iGasType = value; }    }
      public int gasConc { get { return iGasConc; }
        set { iGasConc = value; }
      }
    }

补充:C# 简单的颜色渐变算法

今天要用到一个颜色渐变的算法,网上看了很多,觉得都太繁琐,索性自己写一个。话不多说,直接上代码!

**这是用来获取某一颜色段的分度集合**
 /// <summary>
    /// 获得某一颜色区间的颜色集合
    /// </summary>
    /// <param name="sourceColor">起始颜色</param>
    /// <param name="destColor">终止颜色</param>
    /// <param name="count">分度数</param>
    /// <returns>返回颜色集合</returns>
    public static List<Color> GetSingleColorList(Color srcColor, Color desColor, int count)
    {
      List<Color> colorFactorList = new List<Color>();
      int redSpan = desColor.R - srcColor.R;
      int greenSpan = desColor.G - srcColor.G;
      int blueSpan = desColor.B - srcColor.B;
      for (int i = 0; i < count; i++)
      {
        Color color = Color.FromArgb(
          srcColor.R + (int)((double)i / count * redSpan),
          srcColor.G + (int)((double)i / count * greenSpan),
          srcColor.B + (int)((double)i / count * blueSpan)
        );
        colorFactorList.Add(color);
      }
      return colorFactorList;
    }
**这里就是将红到紫之间的颜色分为5个区间,利用上面的算法拼接5个区间的分度值,就得到全彩颜色集合**
/// <summary>
    /// 获取从红到紫的颜色段的颜色集合
    /// </summary>
    /// <param name="totalCount">分度数</param>
    /// <param name="redToPurple">是否从红到紫色渐变</param>
    /// <returns>返回颜色集合</returns>
    public static List<Color> GetFullColorList(int totalCount, bool redToPurple = true)
    {
      List<Color> colorList = new List<Color>();
      if (totalCount > 0)
      {
        if (redToPurple)
        {
          colorList.AddRange(GetSingleColorList(Color.Red, Color.Yellow, totalCount / 5 + (totalCount % 5 > 0 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Yellow, Color.Lime, totalCount / 5 + (totalCount % 5 > 1 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Lime, Color.Cyan, totalCount / 5 + (totalCount % 5 > 2 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Cyan, Color.Blue, totalCount / 5 + (totalCount % 5 > 3 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Blue, Color.Magenta, totalCount / 5 + (totalCount % 5 > 4 ? 1 : 0)));
        }
        else
        {
          colorList.AddRange(GetSingleColorList(Color.Magenta, Color.Blue, totalCount / 5 + (totalCount % 5 > 0 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Blue, Color.Cyan, totalCount / 5 + (totalCount % 5 > 1 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Cyan, Color.Lime, totalCount / 5 + (totalCount % 5 > 2 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Lime, Color.Yellow, totalCount / 5 + (totalCount % 5 > 3 ? 1 : 0)));
          colorList.AddRange(GetSingleColorList(Color.Yellow, Color.Red, totalCount / 5 + (totalCount % 5 > 4 ? 1 : 0)));
        }
      }
      return colorList;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • C#匹配中文字符串的4种正则表达式分享

    C#匹配中文字符串的4种正则表达式分享

    这篇文章主要介绍了C#匹配中文字符串的4种正则表达式分享,本文介绍了4种形式下的中文字符串匹配正则,需要的朋友可以参考下
    2014-08-08
  • 详解C#中HashTable的用法

    详解C#中HashTable的用法

    在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值
    2016-02-02
  • Silverlight将图片转换为byte的实现代码

    Silverlight将图片转换为byte的实现代码

    这篇文章主要介绍了Silverlight将图片转换为byte的实现代码,需要的朋友可以参考下
    2015-11-11
  • WPF基础教程之元素绑定详解

    WPF基础教程之元素绑定详解

    这篇文章主要给大家介绍了关于WPF基础教程之元素绑定的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 基于WPF实现面包屑控件的示例代码

    基于WPF实现面包屑控件的示例代码

    这篇文章主要为大家详细介绍了如何基于WPF实现简单的面包屑控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-05-05
  • c# 几个常见的TAP异步操作

    c# 几个常见的TAP异步操作

    这篇文章主要介绍了c# 几个常见的TAP异步操作,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#实现的SQL备份与还原功能示例

    C#实现的SQL备份与还原功能示例

    这篇文章主要介绍了C#实现的SQL备份与还原功能,结合具体实例形式分析了C#操作数据库实现SQL备份与还原相关的控件、SQL连接、文件等操作技巧,需要的朋友可以参考下
    2017-06-06
  • c#利用system.net发送html格式邮件

    c#利用system.net发送html格式邮件

    这篇文章主要介绍了c#利用system.net发送html格式邮件的示例,带有抄送、密送、附件功能,需要的朋友可以参考下
    2014-02-02
  • C#中的LINQ to Objects详解(1)

    C#中的LINQ to Objects详解(1)

    本文详细讲解了C#中的LINQ to Objects,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#创建及读取DAT文件操作

    C#创建及读取DAT文件操作

    这篇文章主要介绍了C#创建及读取DAT文件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论