WPF将RGB转为HSL的工具类
2024-10-01 04:42:25
class HSLColor
{
private int _alpha = 255;
public int _hue = 0;
public double _saturation = 1d;
public double _lightness = 1d;
//public double H;
//public double S;
//public double L;
public HSLColor()
{
}
public HSLColor(Color color)
{
_alpha = color.A;
FromRGB(color);
//double h = 0;
//double s = 0;
//double l = 0;
//RGB2HSL(color, out h, out s, out l);
//H = 255 * h;
//S = 255 * s;
//L = 255 * l;
}
private void FromRGB(Color color)
{
double r = ((double)color.R) / 255;
double g = ((double)color.G) / 255;
double b = ((double)color.B) / 255;
double min = Math.Min(Math.Min(r, g), b);
double max = Math.Max(Math.Max(r, g), b);
double distance = max - min;
_lightness = (max + min) / 2;
if (distance == 0)
{
_hue = 0;
_saturation = 0;
}
else
{
double hueTmp;
_saturation =
(_lightness < 0.5) ?
(distance / (max + min)) : (distance / ((2 - max) - min));
double tempR = (((max - r) / 6) + (distance / 2)) / distance;
double tempG = (((max - g) / 6) + (distance / 2)) / distance;
double tempB = (((max - b) / 6) + (distance / 2)) / distance;
if (r == max)
{
hueTmp = tempB - tempG;
}
else if (g == max)
{
hueTmp = (0.33333333333333331 + tempR) - tempB;
}
else
{
hueTmp = (0.66666666666666663 + tempG) - tempR;
}
if (hueTmp < 0)
{
hueTmp += 1;
}
if (hueTmp > 1)
{
hueTmp -= 1;
}
_hue = (int)(hueTmp * 250);
_saturation = _saturation * 240;
_lightness = _lightness * 200;
}
}
public static void RGB2HSL(Color rgb, out double h, out double s, out double l)
{
double r = rgb.R / 255.0;
double g = rgb.G / 255.0;
double b = rgb.B / 255.0;
double v;
double m;
double vm;
double r2, g2, b2;
h = 0; // default to black
s = 0;
l = 0;
v = Math.Max(r, g);
v = Math.Max(v, b);
m = Math.Min(r, g);
m = Math.Min(m, b);
l = (m + v) / 2.0;
if (l <= 0.0)
{
return;
}
vm = v - m;
s = vm;
if (s > 0.0)
{
s /= (l <= 0.5) ? (v + m) : (2.0 - v - m);
}
else
{
return;
}
r2 = (v - r) / vm;
g2 = (v - g) / vm;
b2 = (v - b) / vm;
if (r == v)
{
h = (g == m ? 5.0 + b2 : 1.0 - g2);
}
else if (g == v)
{
h = (b == m ? 1.0 + r2 : 3.0 - b2);
}
else
{
h = (r == m ? 3.0 + g2 : 5.0 - r2);
}
h /= 6.0;
}
}
|
最新文章
- Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法
- 你的联动够快够小吗——基于Telerik(ASP.NET平台)
- Sequence operation(线段树区间多种操作)
- android软键盘弹出隐藏的监听
- 文件查找和比较命令 来自: http://man.linuxde.net/find
- javaWeb学习总结(11)- 监听器(Listener)学习
- 使用KeePass愉快的来管理你的密码
- Linux硬链接软连接
- HDU 1874 畅通工程续【Floyd算法实现】
- token:NLP之词形还原
- javascript 执行环境,作用域、作用域链、闭包
- 微信小程序云端解决方案探索之路
- 对比手机SLAM和机器人SLAM
- sp_executesql动态执行sql语句并将结果赋值给一变量
- MySQL数据库行去重复
- CTF中的变量覆盖漏洞
- IO操作中的建议
- 度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。
- thinkcmf5增加微信管理app笔记
- null in JavaScript
热门文章
- 【转】CentOS 6.3(x86_64)下安装Oracle 10g R2
- Cisco配置aaa验证
- JVM类加载机制---类加载的过程
- Effective Java 之 --- 用私有构造器或者枚举类型强化Singleton属性
- ABP官方文档翻译 7.1 后台Jobs和Workers
- Vue.js搭建路由报错 router.map is not a function,Cannot read property ‘component’ of undefined
- ctags的使用
- HDU 4333 [SAM WRONG!!!]
- JAVAEE——BOS物流项目03:学习计划、messager、menubutton、登陆拦截器、信息校验和取派员添加功能
- SQL Server 页面查询超时(SOS_SCHEDULER_YIELD等待)