最近做tchart曲线显示的时候,因为曲线太多,导致tchart到后面的曲线颜色一样,所以打算自己给曲线设置颜色。最后选用的是色阶文件生成常用的渐变色,例子如下所示:

ps:色阶文件及完整代码地址:
https://download.csdn.net/download/Yyuanyuxin/12858219

色阶文件的读取:

色阶文件也可以自己编写。
内容如下:

如上:蓝色划出的是专用连接(暂时用不上),红色划出的是位置,黄色为颜色,即百分比(例如44表示在44%的位置为rgb为102,51,0的颜色,最后一位是透明度,暂时用不上)。
下面是读取及解析所有的色阶文件,GradientColorClass是我自己定义保存色阶文件的类,可自己定义。

public static List<GradientColorClass> GetAllColorFile(string dir)
{List<GradientColorClass> colorClass = new List<GradientColorClass>();DirectoryInfo root = new DirectoryInfo(dir);foreach (var item in root.GetFiles()){//读取文件GradientColorClass gradientColor = new GradientColorClass();string info = File.ReadAllText(item.FullName);var list = info.Replace("\r\n", ",").Replace("\r", ",").Trim().Split(',');if (list.Length <= 1) continue;List<float> colorPositions = new List<float>();List<Color> colorList = new List<Color>();foreach (var color in list){var colorInfo = color.Trim();if (string.IsNullOrEmpty(color)) continue;var arr = colorInfo.Split(' ');var dealArr = new List<string>();//解决中间空格个数不确定foreach (var text in arr){var dealText = text.Trim();if (!string.IsNullOrEmpty(dealText)){dealArr.Add(dealText);}}if (dealArr.Count < 4) continue;if (float.TryParse(dealArr[0], out float position) && int.TryParse(dealArr[1], out int r) && int.TryParse(dealArr[2], out int g) && int.TryParse(dealArr[3], out int b)){colorList.Add(Color.FromArgb(r, g, b));colorPositions.Add(position / 100);}}gradientColor.FileName = item.Name;gradientColor.ColorList = colorList.ToArray();gradientColor.ColorPositions = colorPositions.ToArray();gradientColor.Text = info;gradientColor.FullPath = item.FullName;colorClass.Add(gradientColor);}return colorClass;
}

绘制渐变图片(方法1:绘制已有控件上)

上面得到色阶解析颜色之后,就可以绘制了
绘制函数如下:

public static void DrawColorPolygon(Graphics g, Color[] colorList, float[] colorPositions, int width = 100, int heigh = 50)
{try{//绘画一个四边形//PointF[] _pointfs = new PointF[4];//_pointfs[0] = new PointF(100, 50);//_pointfs[1] = new PointF(50, 80);//_pointfs[2] = new PointF(200, 80);//_pointfs[3] = new PointF(150, 50);//g.DrawPolygon(Pens.Black, _pointfs);//绘制矩形RectangleF _pointfs = new RectangleF(0, 0, width, heigh);g.DrawRectangle(Pens.Black, 0, 0, width, heigh);//设置RectangleRectangle _rect = new Rectangle(0, 0, width, heigh);LinearGradientBrush _linearGradientBrush = new LinearGradientBrush(_rect, Color.Red, Color.White, LinearGradientMode.Horizontal);//定义用于在多色渐变中以内插值取代颜色混合的颜色和位置的数组ColorBlend _colorBlend = new ColorBlend();//定义多种颜色_colorBlend.Colors = colorList;_colorBlend.Positions = colorPositions;// new float[] { 0/2f,3 / 4f, 2 / 2f};//设置多色渐变颜色_linearGradientBrush.InterpolationColors = _colorBlend;//填充多边形g.FillRectangle(_linearGradientBrush, _pointfs);//g.DrawString("sss", new Font("宋体", 12, FontStyle.Bold), new SolidBrush(Color.Black), 1, 1);_linearGradientBrush.Dispose();}catch (Exception ex){throw;}}

使用:
或者一般在paint事件

public void Show(GradientColorClass colorClass)
{Graphics g = this.Graphics;//需要绘制的控件画布DrawColorPolygon(g, colorClass.ColorList, colorClass.ColorPositions);
}

绘制渐变图片(方法二:生成image图片)

public static Bitmap DrawColorPolygon(Color[] colorList, float[] colorPositions, int width = 100, int heigh = 50)
{try{Bitmap flag = new Bitmap(width, heigh);Graphics g = Graphics.FromImage(flag);DrawColorPolygon(g, colorList, colorPositions, width, heigh);return flag;}catch (Exception ex){return null;}}

使用:

var img = DrawColorPolygon(selectedColor.ColorList, selectedColor.ColorPositions, width, heigh);
pb_color.Image = img;

从色阶中取色

/// <summary>
/// 拆分色阶,得到颜色列表(按RGB的百分百拆分)
/// </summary>
/// <param name="colors">色阶类</param>
/// <param name="count">需要得到的颜色数量,因为有小数会加1化整,一般会得到更多的颜色数量</param>
/// <returns></returns>
public static List<Color> GetCheckColor(GradientColorClass colors, int count)
{if (colors == null|| count==0) return null;List<Color> selectedColor = new List<Color>();for (int j = 0; j < colors.ColorPositions.Length - 1; j++){var max = colors.ColorPositions[j + 1];var min = colors.ColorPositions[j];var color1 = colors.ColorList[j];var color2 = colors.ColorList[j + 1];var colorCount = Math.Ceiling(count * (max - min));//每一个色块里面有多少个颜色for (int i = 0; i < colorCount; i++){if (i == 0){selectedColor.Add(color1);}else{var r = (int)(Math.Abs(color2.R - color1.R) * (i / colorCount));var g = (int)(Math.Abs(color2.G - color1.G) * (i / colorCount));var b = (int)(Math.Abs(color2.B - color1.B) * (i / colorCount));selectedColor.Add(Color.FromArgb(r, g, b));}}}return selectedColor;
}
/// <summary>
/// 拆分色阶,得到颜色列表(取图片像素点)
/// </summary>
/// <param name="colors">色阶类</param>
/// <param name="count">需要得到的颜色数量,因为有小数会加1化整,一般会得到更多的颜色数量</param>
/// <returns></returns>
public static List<Color> GetCheckColor(Bitmap colors, int count)
{if (colors == null || count <= 0) return null;List<Color> selectedColor = new List<Color>();var addCount = colors.Width / count;for (int j = 0; j < count; j++){selectedColor.Add(colors.GetPixel(j * addCount, 1));}return selectedColor;
}

c# 色阶文件的读取及渐变色绘制相关推荐

  1. .net 从txt中读取行数据_【VBA项目】从指定文件中读取数据并绘制图表

    VBA 是一种很久远的编程语言,但并不过时.在满足以下两个条件时,借助 VBA 可以极大的提升生产率,降低出错率: 你的电脑上不允许自主安装软件: 你需要执行的工作中大部分的步骤都是固定且重复的. 项 ...

  2. python导入txt文件并绘图-Python实现读取txt文件中的数据并绘制出图形操作示例

    本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作.分享给大家供大家参考,具体如下: 下面的是某一文本文件中的数据. 6.1101,17.592 5.5277,9.1302 8.51 ...

  3. 用python读取txt文件中的数据并画各类图形展示_Python实现读取txt文件中的数据并绘制出图形操作示例...

    本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作.分享给大家供大家参考,具体如下: 下面的是某一文本文件中的数据. 6.1101,17.592 5.5277,9.1302 8.51 ...

  4. Python读取excel文件中的数据,绘制折线图、散点图

    https://www.cnblogs.com/liulinghua90/p/9935642.html https://blog.csdn.net/qq_32458499/article/detail ...

  5. python读取日期_从文件中读取日期和数据(Python)

    我想从文件中读取时间字符串和数据,但是当我使用loadtxt时,我不能同时读取字符串和数字,因为字符串不是浮点型的.所以我尝试使用genfromtxt并使用delimiter=[]+[]+[]作为我所 ...

  6. python怎么读取csv文件-Python读取csv文件(详解版,看了无师自通)

    前面程序展示的数据都是直接通过程序给出的,但实际应用可能需要展示不同来源(比如文件.网络).不同格式(比如 csv.JSON)的数据,这些数据可能有部分是损坏的,因此程序需要对这些数据进行处理. cs ...

  7. Python实现从excel读取数据并绘制成精美图像

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Pyth ...

  8. Tableau学习Step2一数据文件的读取与统计图、表的概述

    Tableau学习Step2一数据文件的读取与统计图.表的概述 本文首发于博客冰山一树Sankey,去博客浏览效果更好. 一. 前言 本教程通过一个案例从浅到深来学习Tableau知识 案例概述: 二 ...

  9. 数字图像处理(极简) 第三章 BMP文件的读取与显示(docx)

    建议先修课程:高等数学(微积分).线性代数. 参考书目: 1.图像工程(上册)--图像处理(第4版) 章毓晋 清华大学出版社 链接:https://pan.baidu.com/s/1hEMGRUotQ ...

最新文章

  1. [译稿]同步复制提议 2010-09
  2. Shader相关Mask裁切UI粒子特效或者3D模型
  3. Nginx负载均衡策略之url_hash
  4. 周末狂欢赛3(跳格子,英雄联盟,排序问题)
  5. C语言,把指针按地上摩擦,爽
  6. go redis 清空所有值_【大厂面试】面试官看了赞不绝口的Redis笔记二
  7. python-三层神经网络的分类回归问题
  8. ERROR 2006 (HY000) MySQL server has gone away
  9. C语言中从键盘中输入到数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  10. mysql 8 配置参数优化_MySQL性能优化之参数配置
  11. python主线程执行_python主线程与子线程的结束顺序实例解析
  12. wps中的word删除空白页
  13. python数据可视化学习之随机漫步
  14. 《经济学的思维方式》内容
  15. 对啊网初级会计2-1会计基础1
  16. 定时启动你的Android App
  17. 大一寒假训练九(map,set,vector)【更新完成】
  18. 加强防护,近期勒索病毒有点疯狂!
  19. 【渝粤题库】广东开放大学 公共政策学 形成性考核
  20. QT里面Q_PROPERTY的使用

热门文章

  1. Java 从入门到进阶之路
  2. OpenCV入门基础学习
  3. 酒店客房管理系统之系统实施--数据库
  4. 防火墙原理讲解——练习实验
  5. 主成分分析二级指标权重_主成分分析中指标权重的确定
  6. W3C推荐的标准本体语言,web ontology language
  7. 浅谈Oracle GoldenGate
  8. String类的copyValueOf与valueOf的区别以及valueOf与toString的区别
  9. The History of Tcl/Tk
  10. 中国风电EPC工程市场运行分析及投资方向建议报告2022-2028年