C# 实现颜色的梯度渐变案例
作者:不听不看不说 发布时间:2023-11-20 22:01:06
标签: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;
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/fanfan513/article/details/79970522


猜你喜欢
- 一、作用和区别 break的作用是跳出当前循环块(for、while、do while)或程序块(switch)。在循环块中的作用
- 在上篇文章,我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标。1)重构Get方法2)如何
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以
- 前言:最近对接了一个第三方的项目,该项目的数据传输格式是XML。由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后
- 在Controller层时,往往会需要校验或验证某些操作,而在每个Controller写重复代码,工作量比较大,这里在Springboot项
- 一、导入依赖普通项目<dependency> <groupId>ch.qos.logbac
- Java设计模式访问者模式模式概念访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的
- java两个对象之间传值及封装在项目里面使用SSH框架的过程中, 经常涉及到修改,我们只要对部门的部门属性进行修改我们通常的做法是先从数据库
- 本文主要介绍了spring-boot-maven-plugin报红解决方案,亲测有效,具体如下:<?xml version="
- 本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下。观察者模式(有时又被称为发布(publish )-订阅(Subs
- 接上一篇文章:Android实现图片区域裁剪功能上一篇文章提及了通过调用系统相册或拍照来实现图片的缩放\裁剪。不过这对于笔者项目的要求同样不
- NTP是Android原生通过网络获取时间的机制,其中关键代码逻辑都在NetworkTimeUpdateService,它是Android系
- 本文实例展示了C#利用反射来判断对象是否包含某个属性的实现方法,对于C#程序设计人员来说有一定的学习借鉴价值。具体实现代码如下:/// &l
- 一、BitConverter 将预定义的基础类型与字节数据进行互转(Unicode)1、将值类型转成字节数组(Unicode):BitCon
- 使用Button时为了让用户有“按下”的效果,有两种实现方式:1.在代码里面。imageButton.setOnTouchListener(
- Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常1、高效加载大图片我们在编写Android程序的时候经常要用到
- C#一些延时函数sleep延时方法System.Threading.Thread.Sleep(1000); //毫秒实现的是非独占性延时函数
- 在Java的6.0版本中新增了concurrent包,这个包是用作线程同步的包,提供了很多工具类。其中定时器就是其中之一。近期在做一个项目,
- 对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp
- 本文实例讲述了C#逐行读取文件的方法。分享给大家供大家参考。具体如下:这里使用C#逐行读取文件,对于大文件的读取非常有用。StreamRea