C# RGB和HSB相互转换
背景
最近做的项目中有这样一个场景,设置任意一种颜色,得到这种颜色偏深和偏浅的两种颜色。也就是说取该颜色同色系的深浅两种颜色。首先想到的是调节透明度,但效果不理想。后来尝试调节颜色亮度,发现这才是正解。但是.NET中不能直接改变Color的亮度,需要将Color转换成HSB模式,然后改变B的值调节亮度。调节亮度后需要再转换成我们熟悉的RGB模式才能使用。下面给出颜色转换方法。
代码
/// <summary>
/// 颜色转换帮助类
/// </summary>
public class ColorConversionHelper
{
/// <summary>
/// RGB转HSB
/// </summary>
/// <param name="red">红色值</param>
/// <param name="green">绿色值</param>
/// <param name="blue">蓝色值</param>
/// <returns>返回:HSB值集合</returns>
public static List<float> RGBtoHSB(int red, int green, int blue)
{
List<float> hsbList = new List<float>();
System.Drawing.Color dColor = System.Drawing.Color.FromArgb(red, green, blue);
hsbList.Add(dColor.GetHue());
hsbList.Add(dColor.GetSaturation());
hsbList.Add(dColor.GetBrightness());
return hsbList;
} /// <summary>
/// HSB转RGB
/// </summary>
/// <param name="hue">色调</param>
/// <param name="saturation">饱和度</param>
/// <param name="brightness">亮度</param>
/// <returns>返回:Color</returns>
public static Color HSBtoRGB(float hue, float saturation, float brightness)
{
int r = , g = , b = ;
if (saturation == )
{
r = g = b = (int)(brightness * 255.0f + 0.5f);
}
else
{
float h = (hue - (float)Math.Floor(hue)) * 6.0f;
float f = h - (float)Math.Floor(h);
float p = brightness * (1.0f - saturation);
float q = brightness * (1.0f - saturation * f);
float t = brightness * (1.0f - (saturation * (1.0f - f)));
switch ((int)h)
{
case :
r = (int)(brightness * 255.0f + 0.5f);
g = (int)(t * 255.0f + 0.5f);
b = (int)(p * 255.0f + 0.5f);
break;
case :
r = (int)(q * 255.0f + 0.5f);
g = (int)(brightness * 255.0f + 0.5f);
b = (int)(p * 255.0f + 0.5f);
break;
case :
r = (int)(p * 255.0f + 0.5f);
g = (int)(brightness * 255.0f + 0.5f);
b = (int)(t * 255.0f + 0.5f);
break;
case :
r = (int)(p * 255.0f + 0.5f);
g = (int)(q * 255.0f + 0.5f);
b = (int)(brightness * 255.0f + 0.5f);
break;
case :
r = (int)(t * 255.0f + 0.5f);
g = (int)(p * 255.0f + 0.5f);
b = (int)(brightness * 255.0f + 0.5f);
break;
case :
r = (int)(brightness * 255.0f + 0.5f);
g = (int)(p * 255.0f + 0.5f);
b = (int)(q * 255.0f + 0.5f);
break;
}
}
return Color.FromArgb(Convert.ToByte(), Convert.ToByte(r), Convert.ToByte(g), Convert.ToByte(b));
}
}
扩展阅读
http://stackoverflow.com/questions/4106363/converting-rgb-to-hsb-colors
http://my.oschina.net/soitravel/blog/79862
C# RGB和HSB相互转换的更多相关文章
- RGB和HSB的转换推算
RGB三原色是基于人肉眼对光线的生理作用.人眼内有三种椎状体“对这三种光线频率所能感受的带宽最大,也能独立刺激这三种颜色的受光体”,因此RGB称为三原色.比如,黄色波长的光对人眼的刺激效果,和红色与绿 ...
- RGB与HSB之间的转换公式
先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...
- RGB,CMYK,HSB各种颜色表示的转换 C#语言
Introduction Why an article on "colors"? It's the same question I asked myself before writ ...
- c# 颜色RGB到HSB互相转换
/// <summary> /// 色相,饱和度,亮度转换成rgb值 /// </summary> /// <returns></returns> pu ...
- RGB与HSB之间转换
先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...
- e585. Converting Between RGB and HSB Colors
This example demonstrates how to convert between a color value in RGB (three integer values in the r ...
- 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)
[C#]RGB,CMYK,HSB各种颜色表示的转换 一.表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等 1.RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合 ...
- 基于pcl 和 liblas 库 las与pcd格式(rgb点)相互转换(win10 VS2013 X64环境 )
#include <liblas/liblas.hpp> #include <iomanip> #include <iostream> #include <s ...
- RGB 与 HSB/HSV 的关系
能理解 RGB 模式中确定数值的各种颜色,但怎么理解「明度」.「饱和度」.「色相」等概念? 从第一张图可以简单得出以下结论: 明度--这个最简单,rgb中,三色光的值,其加起来的和越大,明度就越大. ...
随机推荐
- 本机jdbc连接报The user specified as a definer ('root'@'%') does not exist
昨晚一台测试服务器连接本机的mysql时,有些调用存储过程报"The user specified as a definer ('root'@'%') does not exist" ...
- Jsp九大内置对象及其作用域
本文主要介绍Jsp九大内置对象及其作用域,着重介绍几个常用的,希望对初学者有所帮助. 1 Jsp九大内置对象 2 详细介绍 2.1 request javax.servlet.http.HttpSer ...
- 更加简洁易用——wangEditor富文本编辑器新版本发布
1. 前言 wangEditor富文本编辑器(www.wangEditor.com)从去年11月份发布,至今已经有将近10各月了.它就像一个襁褓中的小婴儿,在我的努力以及众多使用者的支持下不断摸索.成 ...
- CSS高级选择符
2016-11-07 <css入门经典>第八章 1.属性选择器 选择器 描述 [attribute] 用于选取带有指定属性的元素. [attribute=value] 用于选取带有指定属性 ...
- 从0开始学angularjs-笔记04
由于公司加班,刚到家不久,然而却毫无睡意,可能是老了吧--- 不废话了,没睡意那就做点有意义的事情吧,继续我们的angular学习之路,深夜博文,希望能造福大家! 这次我们来详细讲解angular的双 ...
- 从零开始,做一个NodeJS博客(二):实现首页-加载文章列表和详情
标签: NodeJS 0 这个伪系列的第二篇,不过和之前的几篇是同一天写的.三分钟热度貌似还没过. 1 静态资源代理 上一篇,我们是通过判断请求的路径来直接返回结果的.简单粗暴,缺点明显:如果url后 ...
- 微信不支持Object.assign
微信不支持Object.assign,让我Vue怎么用QAQ... 解决方法: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- 三分钟玩转jQuery.noConflict()
jQuery是目前使用最广泛的前端框架之一,有大量的第三方库和插件基于它开发.为了避免全局命名空间污染,jQuery提供了jQuery.noConflict()方法解决变量冲突.这个方法,毫无疑问 ...
- Android的生命周期学习
掌握Android的生命周期对于如何一个刚刚接触Android初学者来说是至关重要的,在然后的开发中会给我留有更多的时刻余地,当自己正在认识Android中整个声明周期后,会编写出更加的流畅的程序 应 ...
- 【代码笔记】iOS-将log日志保存到文件
代码: #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDe ...