相信很多调过RBG灯的朋友都是通过分别改变R、B、G的占空比来改变颜色的,但是不是发现了一个问题,那就是不管怎样调都很难实现几十种颜色的变化,一般只有是7种颜色的渐变。下面给朋友们分享一个可以实现几十种颜色渐变(颜色确实比原来那方法多,能不能达到这么多应该跟有关)的方法,希望对大家有启示作用。

首先要给大家简单地说一下HSL,就是色调,饱和度和亮度,也是一种色彩空间模式,类似于RBG,只不过用HSL表示色彩更加的符合人类的视角感观,而RBG则更多用于机械上。所以,我们要实现多颜色的渐变要做的是把RBG转成HSL,然后改变H(色调)分量(S和L不用变),这时就得到了新的HSL,再把这个新HSL转换成RBG,得到新的RBG后就是我们要PWM。
简单地说,RBG->HSL->改变H(例如+0.00001)->新HSL->RBG
下面符上网上RBG->HSL和HSL->RBGR的代码,转载 于    http://blog.csdn.net/aniven/article/details/2205851
RGB转换成HSL:
#include
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(得到R 的值)
    G = GetGValue(AColor) / 255.0;//得到G的值
    B = GetBValue(AColor) / 255.0;//得到B的值

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:

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);
}
 

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));
}
//--------------------------------------------------------------------------

接下来,大家要做的是把我上面说的方法,翻译成代码就可以了。

转载于:https://www.cnblogs.com/panlangen/p/7588415.html

RBG灯颜色渐变(颜色要尽可能多)程序分析相关推荐

  1. 一文搞懂Qt中的颜色渐变(QGradient Class)

    一文搞懂Qt中的颜色渐变(QGradient Class) 1, 快速开始! Qt中与颜色渐变有关的类是QGradient 其中它又有三个子类:QLinearGradient.QRadialGradi ...

  2. CSS渐变颜色和浏览器前缀、opacity透明度以及设置多个背景图片写法

    目录 前言 一.多个背景图片 二.渐变颜色 1.线性渐变 2.径向渐变 3.浏览器前缀 4.opacity透明度 写在最后 前言 在前面说了CSS怎样设置背景图片,与设置颜色的几种方式.如果你想查看可 ...

  3. CSS背景属性之颜色渐变

    颜色渐变 颜色渐变其实在网页设计中并不是特别常见,但也不可避免的会出现导航栏是渐变色这种情况或者别的不是单一颜色的情况,例如: 这样的设计解决方案并不是只可以使用颜色渐变,我们可以使用两个div拼接, ...

  4. CSS 文字,边框实现从左至右颜色渐变

    微信小程序开发交流qq群   173683895    承接微信小程序开发.扫码加微信. 1.文本从左至右颜色渐变 效果图: 2.边框从左至右颜色渐变 效果图: 实现代码: 1.文本从左至右颜色渐变实 ...

  5. 【原】Github系列之三:开源iOS下 渐变颜色的进度条WGradientProgress

    概述 今天我们来实现一个iOS平台上的进度条(progress bar or progress view).这种进度条比APPLE自带的更加漂亮,更加有"B格".它拥有渐变的颜色, ...

  6. matlab 多条函数颜色渐变(没多大用处)

    多条函数颜色渐变(没多大用处) clc,clear; data=sin(linspace(0,2*pi,100)); for i=1:7plot((7-i)*data,'color',[0 1 0]* ...

  7. ARabevaluator 颜色渐变控制类

    参考资料: http://blog.csdn.net/qq_33456552/article/details/52092865 实现渐变效果: ArgbEvaluator argbEvaluator; ...

  8. CSS3颜色渐变模式

       1.线性渐变:linear-gradient 语法:<linear-gradient> = linear-gradient([ [ <angle> | to <si ...

  9. php如何在添加div的背景颜色_css3颜色渐变:css3如何实现背景颜色渐变?

    为了开发网页的美观,css3背景颜色渐变是经常会用到的,那么,css3背景颜色渐变如何设置呢?本篇文章我们就来介绍关于css颜色渐变背景的设置方法. 我们要知道的是css3渐变有两种类型:css3线性 ...

最新文章

  1. 使用ubuntu(18.04) 作为软路由器连接互联网
  2. jQuery 元素操作——遍历元素
  3. 持续交付二:为什么需要多个环境
  4. SendMessage和PostMessage
  5. Eclipse 答疑:如何使用 Eclipse 进行断点(Breakpoints)调试?
  6. 别在我的坟前哭 脏了我轮回的路
  7. Extjs6(六)——增删查改之查询
  8. php初学遇到的问题。
  9. 卡诺模型案例分析_质量管理神器,Kano模型您可知道?
  10. 仿百度文库解决方案(一)——总体思路
  11. 安装firefox扩展(xpi)文件的简便方法
  12. 给宝宝的固态硬盘装机教程
  13. 曼联足球俱乐部披露安全漏洞
  14. Axure Share ——原型设计工具 Axure ,移动版
  15. 找出大于200的最小质数
  16. 图画日记怎么画_画画提高的一个方法: 绘画日记!
  17. C#实例.net_经典例子400个
  18. GDB attach 调试
  19. android 水波纹扩散动画,[Android]多层波纹扩散动画——自定义View绘制
  20. [wine5.0] 解决wine所有软件乱码(中文不显示)问题

热门文章

  1. python实战-实现内网CAS统一认证登录
  2. source insight 4 统一设置字体大小
  3. c99、gnu99与c89
  4. mysql必知必会的数据_MySQL必知必会--汇 总 数 据
  5. QQ第三方授权登录+阿里云短信服务
  6. 11. 合伙创业企业的股份计算解决办法
  7. 10个免费的HTML在线编辑工具
  8. 安徽省宿州高考成绩查询时间2021年,2021年宿州高考成绩查询系统入口
  9. 关于shaderLab中 tags(标签)
  10. python进行股票收益率计算和风险控制的实现