设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2646|回复: 1

【OneKeyTools源代码分享8】HSL转RGB

[复制链接]
发表于 2016-8-30 13:58:38 | 显示全部楼层 |阅读模式
本帖最后由 只为设计 于 2016-8-30 14:06 编辑
  1. private int Hsl2Rgb(int h, int s, int l)
  2.         {
  3.             float nh = (float)h / 255;
  4.             float ns = (float)s / 255;
  5.             float nl = (float)l / 255;
  6.             float nr = 0;
  7.             float ng = 0;
  8.             float nb = 0;

  9.             if (ns == 0)
  10.             {
  11.                 nr = nl;
  12.                 ng = nl;
  13.                 nb = nl;
  14.             }
  15.             else
  16.             {
  17.                 float q = 0;
  18.                 if (nl < 0.5f)
  19.                 {
  20.                     q = nl * (1 + ns);
  21.                 }
  22.                 else
  23.                 {
  24.                     q = nl + ns - nl * ns;
  25.                 }

  26.                 float p = 2 * nl - q;
  27.                 float tr = nh + (float)1 / 3;
  28.                 float tg = nh;
  29.                 float tb = nh - (float)1 / 3;

  30.                 if (tr < 0)
  31.                 {
  32.                     tr = tr + 1;
  33.                 }
  34.                 else
  35.                 {
  36.                     if (tr > 1)
  37.                     {
  38.                         tr = tr - 1;
  39.                     }
  40.                     else
  41.                     {
  42.                         tr = tr + 0;
  43.                     }
  44.                 }

  45.                 if (tg < 0)
  46.                 {
  47.                     tg = tg + 1;
  48.                 }
  49.                 else
  50.                 {
  51.                     if (tg > 1)
  52.                     {
  53.                         tg = tg - 1;
  54.                     }
  55.                     else
  56.                     {
  57.                         tg = tg + 0;
  58.                     }
  59.                 }

  60.                 if (tb < 0)
  61.                 {
  62.                     tb = tb + 1;
  63.                 }
  64.                 else
  65.                 {
  66.                     if (tb > 1)
  67.                     {
  68.                         tb = tb - 1;
  69.                     }
  70.                     else
  71.                     {
  72.                         tb = tb + 0;
  73.                     }
  74.                 }

  75.                 if (tr < (float)1 / 6)
  76.                 {
  77.                     nr = p + (q - p) * 6 * tr;
  78.                 }
  79.                 else
  80.                 {
  81.                     if (tr < (float)1 / 2)
  82.                     {
  83.                         nr = q;
  84.                     }
  85.                     else
  86.                     {
  87.                         if (tr < (float)2 / 3)
  88.                         {
  89.                             nr = p + (q - p) * 6 * ((float)2 / 3 - tr);
  90.                         }
  91.                         else
  92.                         {
  93.                             nr = p;
  94.                         }
  95.                     }
  96.                 }

  97.                 if (tg < (float)1 / 6)
  98.                 {
  99.                     ng = p + (q - p) * 6 * tg;
  100.                 }
  101.                 else
  102.                 {
  103.                     if (tg < (float)1 / 2)
  104.                     {
  105.                         ng = q;
  106.                     }
  107.                     else
  108.                     {
  109.                         if (tg < (float)2 / 3)
  110.                         {
  111.                             ng = p + (q - p) * 6 * ((float)2 / 3 - tg);
  112.                         }
  113.                         else
  114.                         {
  115.                             ng = p;
  116.                         }
  117.                     }
  118.                 }

  119.                 if (tb < (float)1 / 6)
  120.                 {
  121.                     nb = p + (q - p) * 6 * tb;
  122.                 }
  123.                 else
  124.                 {
  125.                     if (tb < (float)1 / 2)
  126.                     {
  127.                         nb = q;
  128.                     }
  129.                     else
  130.                     {
  131.                         if (tb < (float)2 / 3)
  132.                         {
  133.                             nb = p + (q - p) * 6 * ((float)2 / 3 - tb);
  134.                         }
  135.                         else
  136.                         {
  137.                             nb = p;
  138.                         }
  139.                     }
  140.                 }
  141.             }
  142.             int r = (int)(nr * 255);
  143.             int g = (int)(ng * 255);
  144.             int b = (int)(nb * 255);
  145.             int rgb = r + g * 256 + b * 256 * 256;
  146.             return rgb;
  147.         }
复制代码
这是我根据维基百科上的公式做出的C#代码
该代码用于我开发的OneKeyTools插件里

使用时

  1. int rgb = Hsl2Rgb(h, s, l);
  2. int r = rgb % 256;
  3. int g = (rgb / 256) % 256;
  4. int b = (rgb / 256 / 256) % 256;
复制代码



本帖被以下淘专辑推荐:

发表于 2016-9-25 09:46:22 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-3-29 04:02 , Processed in 0.088605 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表