首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载  ┆ 端午节祝福 
设为首页
加入收藏
联系我们
热门关键字: .net应用  操作系统  Dreamweaver  WinRAR  网络推广
高级搜索
您当前的位置: 主页>C/C++>C++>C++实现RGB和HSL颜色转换代码实例
C++实现RGB和HSL颜色转换代码实例
来源: 发布时间:2008-07-10 发布人: 浏览: 人次   字体: [ ]  
下面的代码是用C++完成的RGB和HSL颜色转换。注意它们的分量的取值范围。        
 
#include "stdafx.h" 
#define min3v(v1, v2, v3)   ((v1)>(v2)? ((v2)>(v3)?(v3):(v2)):((v1)>(v3)?(v3):(v2)))
#define max3v(v1, v2, v3)   ((v1)<(v2)? ((v2)<(v3)?(v3):(v2)):((v1)<(v3)?(v3):(v1)))  
  
typedef struct   
{    
    BYTE  red;              // [0,255]    
    BYTE  green;            // [0,255]    
    BYTE  blue;             // [0,255]  
 
}COLOR_RGB;    
 
typedef struct   
{    
    float hue;              // [0,360]    
    float saturation;       // [0,100]    
    float luminance;        // [0,100]    
}COLOR_HSL;  
   
// Converts RGB to HSL  
 
static void RGBtoHSL(/*[in]*/const COLOR_RGB *rgb, /*[out]*/COLOR_HSL *hsl) 
{    
    float h=0, s=0, l=0;  
    // normalizes red-green-blue values  
    float r = rgb->red/255.f;  
    float g = rgb->green/255.f; 
    float b = rgb->blue/255.f; 
    float maxVal = max3v(r, g, b);  
    float minVal = min3v(r, g, b);   
 
 
    // hue  
 
    if(maxVal == minVal)    
    {    
        h = 0; // undefined    
    }  
 
    else if(maxVal==r && g>=b)    
    {    
        h = 60.0f*(g-b)/(maxVal-minVal);    
    }  
 
    else if(maxVal==r && g<b)    
    {    
        h = 60.0f*(g-b)/(maxVal-minVal) + 360.0f;  
    }  
 
    else if(maxVal==g)    
    {    
        h = 60.0f*(b-r)/(maxVal-minVal) + 120.0f;    
    }  
    else if(maxVal==b)    
    {    
        h = 60.0f*(r-g)/(maxVal-minVal) + 240.0f;    
    }  
 
    // luminance  
 
    l = (maxVal+minVal)/2.0f;  
    // saturation  
 
    if(l == 0 || maxVal == minVal)  
    {    
        s = 0;    
    }  
 
    else if(0<l && l<=0.5f)  
    {    
        s = (maxVal-minVal)/(maxVal+minVal);    
    }  
    else if(l>0.5f)    
    {    
        s = (maxVal-minVal)/(2 - (maxVal+minVal)); //(maxVal-minVal > 0)?    
    }  
    hsl->hue = (h>360)? 360 : ((h<0)?0:h);     
    hsl->saturation = ((s>1)? 1 : ((s<0)?0:s))*100;    
    hsl->luminance = ((l>1)? 1 : ((l<0)?0:l))*100;    
}   
// Converts HSL to RGB  
 
static void HSLtoRGB(const COLOR_HSL *hsl, COLOR_RGB *rgb)   
{    
    float h = hsl->hue;                  // h must be [0, 360]    
    float s = hsl->saturation/100.f; // s must be [0, 1]    
    float l = hsl->luminance/100.f;      // l must be [0, 1]    
    float R, G, B;  
   
    if(hsl->saturation == 0)    
    {    
        // achromatic color (gray scale)    
        R = G = B = l*255.f;    
    }  

共2页: 上一页 1 [2] 下一页
↓下一篇:没有了
相 关 文 章   发布商链接
·C语言程序设计入门学习六步曲
·C++不是万能的
·实例详细介绍各种字符集编码转换问题...
·C++实现仿Office风格的颜色选取框代...
·在Linux下验证日期是否合法
·祥解C++中的this指针
·vc读取XML文件中的文本代码
·C++程序中内存划分介绍
·C++计算含括号四则表达式的模板
·vc命令行调用winrar.exe进行文件解压...
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·如何在C++中创建持久对象的方
·c++实现获取IE缓存文件夹中的
·C++中regex库中静态正则表达...
·VC++编写交互程序时将打印结...
·实例讲解C++中CopyFileEx函数
·c++获取Windows 2000/XP操作...
·C++语言中多重继承下的虚函数
·什么是单例模式?C++中单例模...
·基于C++的DES加密算法实现代...
·vc命令行调用winrar.exe进行...
·C++计算含括号四则表达式的模
·C++程序中内存划分介绍
·vc读取XML文件中的文本代码
·祥解C++中的this指针
·在Linux下验证日期是否合法
热 门 文 章
·实例详细介绍各种字符集编码...
·基于C++的DES加密算法实现代...
·vc读取XML文件中的文本代码
·vc命令行调用winrar.exe进行...
·祥解C++中的this指针
·C语言程序设计入门学习六步曲...
·C++语言中多重继承下的虚函数...
·C++不是万能的
·VC++编写交互程序时将打印结...
·什么是单例模式?C++中单例模...
·C++中regex库中静态正则表达...
·C++程序中内存划分介绍
·在Linux下验证日期是否合法
·C++计算含括号四则表达式的模...
·实例讲解C++中CopyFileEx函数...
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .