RGB和HSL色彩的相互转换

转自: http://blog.csdn.net/aniven/article/details/2205851

RGB和HSL(也叫HSB/HSV)是两种色彩空间,即:红,绿,蓝(Red,Green,Blue)和色调,饱和度,亮度(Hue,Saturation,Lightness或Brightness或Value),前者适用于机器采样,目前的显示器颜色即由这三种基色构成,而后者更符合人类的直观感觉,比如人一般表达一个颜色会这样说:有点浓的暗红色。而不会说红色占多少,绿色占多少,蓝色占多少。
      在Windows的标准颜色对话框中均包含这两种表示方法。RGB的取值范围在0~255之间,HSL的取值在0~1之间,但Windows系统处理成了0~240取值范围,各种不同环境下的取值参照附表。另外还有CMY/CMYK颜色空间,常用于印刷行业,以后再将RGB-CMY-CMYK的转换算法贴出。

RGB转换成HSL:
#include <algorithm>
using std::min;
using std::max;

void RGB2HSL(TColor AColor, double &H,double &S,double &L)
{
    double R,G,B,Max,Min,del_R,del_G,del_B,del_Max;
    R = GetRValue(AColor) / 255.0;       //Where RGB values = 0 ÷ 255
    G = GetGValue(AColor) / 255.0;
    B = GetBValue(AColor) / 255.0;

Min = min(R, min(G, B));    //Min. value of RGB
    Max = max(R, max(G, B));    //Max. value of RGB
    del_Max = Max - Min;        //Delta RGB value

L = (Max + Min) / 2.0;

if (del_Max == 0)           //This is a gray, no chroma...
    {
        //H = 2.0/3.0;          //Windows下S值为0时,H值始终为160(2/3*240)
        H = 0;                  //HSL results = 0 ÷ 1
        S = 0;
    }
    else                        //Chromatic data...
    {
        if (L < 0.5) S = del_Max / (Max + Min);
        else         S = del_Max / (2 - Max - Min);

del_R = (((Max - R) / 6.0) + (del_Max / 2.0)) / del_Max;
        del_G = (((Max - G) / 6.0) + (del_Max / 2.0)) / del_Max;
        del_B = (((Max - B) / 6.0) + (del_Max / 2.0)) / del_Max;

if      (R == Max) H = del_B - del_G;
        else if (G == Max) H = (1.0 / 3.0) + del_R - del_B;
        else if (B == Max) H = (2.0 / 3.0) + del_G - del_R;

if (H < 0)  H += 1;
        if (H > 1)  H -= 1;
    }
}

HSL转换为RGB:
TColor HSL2RGB(double H,double S,double L)
{
    double R,G,B;
    double var_1, var_2;
    if (S == 0)                       //HSL values = 0 ÷ 1
    {
        R = L * 255.0;                   //RGB results = 0 ÷ 255
        G = L * 255.0;
        B = L * 255.0;
    }
    else
    {
        if (L < 0.5) var_2 = L * (1 + S);
        else         var_2 = (L + S) - (S * L);

var_1 = 2.0 * L - var_2;

R = 255.0 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0));
        G = 255.0 * Hue2RGB(var_1, var_2, H);
        B = 255.0 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0));
    }
    return TColor(RGB(R,G,B));
}
//---------------------------------------------------------------------------
double Hue2RGB(double v1, double v2, double vH)
{
    if (vH < 0) vH += 1;
    if (vH > 1) vH -= 1;
    if (6.0 * vH < 1) return v1 + (v2 - v1) * 6.0 * vH;
    if (2.0 * vH < 1) return v2;
    if (3.0 * vH < 2) return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0;
    return (v1);
}

如果要得到Windows里的HSL值,可以重载这两个函数,参数换成int类型:
#include <Math.hpp>

RGB转换成HSL:
void RGB2HSL(TColor AColor, int &H,int &S,int &L)
{
    double h,s,l;
    RGB2HSL(AColor,h,s,l);
    H = RoundTo(h * 240,0);
    S = RoundTo(s * 240,0);
    L = RoundTo(l * 240,0);
}

HSL转换为RGB:
TColor HSL2RGB(int H, int S, int L)
{
    double h,s,l;
    h = H / 240.0;
    s = S / 240.0;
    l = L / 240.0;
    return HSL2RGB(h,s,l);
}

附表(HSL/V/B在各种环境下的取值范围):


Applications


Space


H Range


S Range


L/V/B Range


Paint Shop Pro


HSL


0 - 255


0 - 255


L


0 - 255


Gimp


HSV


0 - 360°


0 - 100


V


0 - 100


Photoshop


HSV


0 - 360°


0 - 100%


B


0 - 100%


Windows


HSL


0 - 240


0 - 240


L


0 - 240


Linux / KDE


HSV


0 - 360°


0 - 255


V


0 - 255


GTK


HSV


0 - 360°


0 - 1.0


V


0 - 1.0


Java (awt.Color)


HSV


0 - 1.0


0 - 1.0


B


0 - 1.0


Apple


HSV


0 - 360°


0 - 100%


L


0 - 100%

时间: 2024-10-18 12:44:05

RGB和HSL色彩的相互转换的相关文章

Atitit &#160;从 RGB 到 HSL 或 HSV 的转换

Atitit  从 RGB 到 HSL 或 HSV 的转换 1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理1 1.2. public static HSV RGB2HSV(Color clr) {2 1.3. 参考资料2   1.1. 从 RGB 到 HSL 或 HSV 的转换公式与原理 设 (r, g, b) 分别是一个颜色的红.绿和蓝坐标,它们的值是在 0 到 1 之间的实数.设 max 等价于 r, g 和 b 中的最大者.设 min 等于这些值中的最小者.要找到在 HSL

D3.js绘制 颜色:RGB、HSL和插值 (V3版本)

颜色和插值 计算机中的颜色,常用的标准有RGB和HSL. RGB:色彩模式是通过对红(Red).绿(Green).蓝(Blue)三个颜色通道相互叠加来得到额各式各样的颜色.三个通道的值得范围都是0~255,因此总共能表示16777216(255*255*255)种,即一千六百多万种颜色.几乎包括了人类所能识别的所有颜色,是应用最广泛的色彩模式. HSL:色彩模式是通过色相(Hue).饱和度(Saturation).明度(Lightness)三个通道的相互叠加来得到各种颜色的.其中,色相的范围为0

颜色空间RGB与HSV(HSL)的转换

转自:http://blog.csdn.net/jiangxinyu/article/details/8000999 一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度. 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果,这时候就需要转换颜色空间了. 出处:http://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 H

RGB HSI HSV HSB HSL

HSI:色相(hue),饱和度(saturation),亮度(Intensity),这种模型完全对应于RGB模型转化而来,转化也有严格的公式推导得到,网上提供了几种转化公式的表示方法: HSV:色相(hue),饱和度(saturation),明度(value),也称HSB(brightness). HSL:色相(hue),饱和度(saturation),亮度(luminance). 上面这两种模型各个意义也不完全一样,它们的意义对应于它们各自的建模方式.其中HSV/HSB来自于Lab建模方式并考

关于HSL和HSV颜色空间的详细论述

目前在计算机视觉领域存在着较多类型的颜色空间(color space).HSL和HSV是两种最常见的圆柱坐标表示的颜色模型,它重新影射了RGB模型,从而能够视觉上比RGB模型更具有视觉直观性. HSV颜色空间 HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮.色彩H由绕V轴的旋转角给定.红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度24

三色视者与四色视者身后的理论基础:色彩原理

理论上,常人的肉眼是三色视觉(Trichromacy),通过三种视锥细胞(也可以说感光色素)来生成蓝色.绿色和红色的波长.但是,肉眼的不足之处是存在同色异谱色(metamers),也就是说尽管色彩看起来相同,但实际上是由不同光谱组成的. 视锥细胞与色彩识别 我们眼睛的视网膜视锥细胞是可以分辨入射光线颜色变化的.常人一般拥有三种类型的视锥细胞,每种类型的细胞能够识别出一种颜色——绿色.红色,或蓝色,因此我们这样的普通人也被称为“三色视者”.每种类型视细胞经过不同波长的光发生不同的连锁反应,引起视觉

十六进制颜色和RGB互转

dd //颜色互转 //十六进制颜色值域RGB格式颜色值之间的相互转换 //------------------------------------- //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; /* RGB颜色转换为16进制 */ String.prototype.colorHex = function(){     var that = this;     if(/^(rgb|RGB)/.test(that)

由RGB到HSV颜色空间的理解

1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解. 而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色.深浅如何.明暗如何.第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚

RGB,CMYK,HSB各种颜色表示的转换 C#语言

Introduction Why an article on "colors"? It's the same question I asked myself before writing this series. The fact is, in .NET, there are only two color formats that can be used: the RGB color model and the HSB color model. Those two are encaps