
C# RGB和HSB相互转换
发布日期:2021-05-09 04:22:17
浏览次数:16
分类:博客文章
本文共 3363 字,大约阅读时间需要 11 分钟。
背景
最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色。也就是说取该颜色同色系的深浅两种颜色。首先想到的是调节透明度,但效果不理想。后来尝试调节颜色亮度,发现这才是正解。但是.NET中不能直接改变Color的亮度,需要将Color转换成HSB模式,然后改变B的值调节亮度。调节亮度后需要再转换成我们熟悉的RGB模式才能使用。下面给出颜色转换方法。
代码
1 ///2 /// 颜色转换帮助类 3 /// 4 public class ColorConversionHelper 5 { 6 ///7 /// RGB转HSB 8 /// 9 /// 红色值10 /// 绿色值11 /// 蓝色值12 ///返回:HSB值集合 13 public static ListRGBtoHSB(int red, int green, int blue)14 {15 List hsbList = new List ();16 System.Drawing.Color dColor = System.Drawing.Color.FromArgb(red, green, blue);17 hsbList.Add(dColor.GetHue());18 hsbList.Add(dColor.GetSaturation());19 hsbList.Add(dColor.GetBrightness());20 return hsbList;21 }22 23 24 /// 25 /// HSB转RGB26 /// 27 /// 色调28 /// 饱和度29 /// 亮度30 ///返回:Color 31 public static Color HSBtoRGB(float hue, float saturation, float brightness)32 {33 int r = 0, g = 0, b = 0;34 if (saturation == 0)35 {36 r = g = b = (int)(brightness * 255.0f + 0.5f);37 }38 else39 {40 float h = (hue - (float)Math.Floor(hue)) * 6.0f;41 float f = h - (float)Math.Floor(h);42 float p = brightness * (1.0f - saturation);43 float q = brightness * (1.0f - saturation * f);44 float t = brightness * (1.0f - (saturation * (1.0f - f)));45 switch ((int)h)46 {47 case 0:48 r = (int)(brightness * 255.0f + 0.5f);49 g = (int)(t * 255.0f + 0.5f);50 b = (int)(p * 255.0f + 0.5f);51 break;52 case 1:53 r = (int)(q * 255.0f + 0.5f);54 g = (int)(brightness * 255.0f + 0.5f);55 b = (int)(p * 255.0f + 0.5f);56 break;57 case 2:58 r = (int)(p * 255.0f + 0.5f);59 g = (int)(brightness * 255.0f + 0.5f);60 b = (int)(t * 255.0f + 0.5f);61 break;62 case 3:63 r = (int)(p * 255.0f + 0.5f);64 g = (int)(q * 255.0f + 0.5f);65 b = (int)(brightness * 255.0f + 0.5f);66 break;67 case 4:68 r = (int)(t * 255.0f + 0.5f);69 g = (int)(p * 255.0f + 0.5f);70 b = (int)(brightness * 255.0f + 0.5f);71 break;72 case 5:73 r = (int)(brightness * 255.0f + 0.5f);74 g = (int)(p * 255.0f + 0.5f);75 b = (int)(q * 255.0f + 0.5f);76 break;77 }78 }79 return Color.FromArgb(Convert.ToByte(255), Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));80 }81 }
扩展阅读
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月03日 13时02分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
也来玩玩 javascript对象深拷贝,浅拷贝
2021-05-09
Kubernetes实战总结 - 动态存储管理StorageClass
2021-05-09
Django实战总结 - 快速开发一个Web服务
2021-05-09
【DG】主rac + 备rac dg 部署
2021-05-09
Oracle一次缩小表空间的处理过程
2021-05-09
【三思笔记】 全面学习Oracle分区表及分区索引
2021-05-09
造成错误“ORA-12547: TNS:lost contact”的常见原因有哪些?
2021-05-09
wcf webHttpBinding Post 大数据量提交 ios c#客户端
2021-05-09
[LeetCode题解]141. 环形链表 | 快慢指针
2021-05-09
MySQL错误日志(Error Log)
2021-05-09
MySQL二进制文件(binlog)
2021-05-09
Redis性能篇(二)CPU核和NUMA架构的影响
2021-05-09
MMORPG大型游戏设计与开发(客户端架构 part3 of vegine)
2021-05-09
C基础 带你手写 redis ae 事件驱动模型
2021-05-09
深度优先搜索和广度优先搜索
2021-05-09
我是个怎样的人
2021-05-09
C基础 工程中常用的排序
2021-05-09
6.Android-五大布局
2021-05-09
第3阶段——内核启动分析之start_kernel初始化函数(5)
2021-05-09