การแปลงสี HSL เป็น RGB [ปิด]


174

ฉันกำลังมองหาอัลกอริทึม JavaScript / PHP เพื่อแปลงระหว่างสี HSL เป็น RGB

สำหรับฉันดูเหมือนว่า HSL ไม่ได้ใช้กันอย่างแพร่หลายดังนั้นฉันจึงไม่มีโชคในการค้นหาตัวแปลง


2
เพิ่งสังเกตเห็นว่าโปรเจ็กต์ less.js มีฟังก์ชั่นการจัดการสีจำนวนมากรวมถึง hsl_to_rgb: github.com/cloudhead/less.js/blob/master/lib/less/functions.js
dmkc

1
ในด้านเบราว์เซอร์ - d3.js มี API ที่ดีสำหรับสิ่งนี้: github.com/mbostock/d3/wiki/Colors
matanster

เช็คเอาท์โปรด js Please.HEX_to_HSV('#ffeb3b')
Lex

4
ทำเครื่องหมายว่าเป็นหัวข้อปิดแม้ว่าจะขออัลกอริทึมซึ่งเป็น 'ในหัวข้อ' ที่stackoverflow.com/help/on-topicอย่างชัดเจน- อะไรให้
LeeGee

2
นี่คือการโหวตปิดที่แย่ที่สุดที่ฉันเคยเห็นในเว็บไซต์นี้และนั่นก็พูดมาก! ฉันเป็นคนแรกที่โหวตให้เปิดใหม่
Theodore R. Smith

คำตอบ:


300

Garry Tan โพสต์โซลูชัน Javascript ลงบนบล็อกของเขา (ซึ่งเขานำไปใช้กับ mjijackson.com ที่หมดอายุแล้วแต่ถูกเก็บถาวรที่นี่และผู้เขียนดั้งเดิมมีส่วนสำคัญ - ขอบคุณผู้ใช้ 2441511)

รหัสถูกโพสต์ใหม่ด้านล่าง:

HSL เป็น RGB:

/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes h, s, and l are contained in the set [0, 1] and
 * returns r, g, and b in the set [0, 255].
 *
 * @param   {number}  h       The hue
 * @param   {number}  s       The saturation
 * @param   {number}  l       The lightness
 * @return  {Array}           The RGB representation
 */
function hslToRgb(h, s, l){
    var r, g, b;

    if(s == 0){
        r = g = b = l; // achromatic
    }else{
        var hue2rgb = function hue2rgb(p, q, t){
            if(t < 0) t += 1;
            if(t > 1) t -= 1;
            if(t < 1/6) return p + (q - p) * 6 * t;
            if(t < 1/2) return q;
            if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
            return p;
        }

        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        var p = 2 * l - q;
        r = hue2rgb(p, q, h + 1/3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1/3);
    }

    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}

RGB เป็น HSL:

/**
 * Converts an RGB color value to HSL. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes r, g, and b are contained in the set [0, 255] and
 * returns h, s, and l in the set [0, 1].
 *
 * @param   {number}  r       The red color value
 * @param   {number}  g       The green color value
 * @param   {number}  b       The blue color value
 * @return  {Array}           The HSL representation
 */
function rgbToHsl(r, g, b){
    r /= 255, g /= 255, b /= 255;
    var max = Math.max(r, g, b), min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2;

    if(max == min){
        h = s = 0; // achromatic
    }else{
        var d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch(max){
            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
            case g: h = (b - r) / d + 2; break;
            case b: h = (r - g) / d + 4; break;
        }
        h /= 6;
    }

    return [h, s, l];
}

15
ฉันชอบความคิดเห็นที่บอกช่วงของตัวแปรและสิ่งที่คาดหวังว่าจะเป็นผลลัพธ์ เป็นระเบียบเรียบร้อยมาก ขอบคุณ!
Gleno

9
ฉันกำลังพยายามใช้สิ่งนี้สำหรับโครงการ แต่ผลลัพธ์ของฉันออกมาเป็นสีเทาเท่านั้น นี่เป็นข้อ จำกัด ของ HSL <-> RGB หรือไม่ บทความวิกิพีเดียดูเหมือนจะแนะนำว่ามีเพียงค่าเดียวเท่านั้นที่ถูกตั้งค่าเป็น 3 ช่อง
Bill

10
ฉันต้องการชี้ให้เห็นว่าการใช้การMath.roundแนะนำที่ไม่ถูกต้องเล็กน้อยที่ระดับต่ำสุดและสูง (ค่า 0 และ 255) ของเครื่องชั่ง ค่าที่ไม่ได้อยู่ที่ปลายของช่วงสามารถปัดขึ้นหรือลงเพื่อให้ได้ค่า แต่สามารถปัดลงเป็น 0 หรือสูงสุด 255 ซึ่งหมายความว่าช่วงของค่าที่แมปเป็น 0 และ 255 นั้นแน่นอน ครึ่งหนึ่งของค่าอื่น ๆ ในการแก้ไขปัญหานี้ให้ใช้สูตรนี้แทน: min(floor(val*256),255). ทำให้การทำแผนที่เกือบสมบูรณ์แบบ
marcus erronius

13
นอกจากนี้ถ้าคุณจะได้รับค่าระดับสีเทา, มันอาจจะเป็นเพราะเส้นที่ใช้และh + 1/3 h - 1/3ในหลายภาษาใช้การหารจำนวนเต็มโดยที่1/3ศูนย์ h + 1.0/3.0เพื่อให้ได้ผลลัพธ์ที่ถูกต้องใช้ตัวอักษรลอยแทนเช่น .:
marcus erronius

6
ฟังก์ชั่น RGB เป็น HSL ไม่ทำงาน นี่คือตัวอย่างของการใช้งานไม่ได้: jsfiddle.net/fs5L02k0/2และนี่คือฟังก์ชั่น, แก้ไขjsfiddle.net/t5nq6jjc/1 - สูตรที่ใช้จาก: nl.wikipedia.org/wiki/ …
Hanna

44

ค้นพบวิธีที่ง่ายที่สุดใช้ Python ในการช่วยเหลือ : D

colorsys.hls_to_rgb(h, l, s)

แปลงสีจากพิกัด HLS เป็นพิกัด RGB


6
ฉันไม่อยากจะเชื่อเลยว่ามีโมดูลมาตรฐานใน Python! นี่ช่วยฉันได้จริงๆ ฉันได้รับการดิ้นรนกับอัลกอริทึมการแปลงในรายการ HSL ของ Wikipedia เป็นเวลา 2 ชั่วโมง ดูเหมือนว่าอัลกอริทึมไม่สามารถรับผลลัพธ์ที่ถูกต้องได้
Ray

2
รูบีเทียบเท่า: rubydoc.info/gems/color/1.8/Color/RGBเช่นColor::HSL.new(40,50,60).to_rgb
xxjjnn

1
ฉันใช้ brython เพื่อใช้เครื่องมือเลือกสีในเบราว์เซอร์นี่คือสิ่งที่ฉันต้องการ!
EvertW

23

การใช้ Java ของรหัส Mohsen

โปรดทราบว่าจำนวนเต็มทั้งหมดจะถูกประกาศเป็นทศนิยม (เช่น 1f) และจะต้องเป็นทศนิยมมิฉะนั้นคุณจะเลือกสีเทา

HSL เป็น RGB

 /**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes h, s, and l are contained in the set [0, 1] and
 * returns r, g, and b in the set [0, 255].
 *
 * @param h       The hue
 * @param s       The saturation
 * @param l       The lightness
 * @return int array, the RGB representation
 */
public static int[] hslToRgb(float h, float s, float l){
    float r, g, b;

    if (s == 0f) {
        r = g = b = l; // achromatic
    } else {
        float q = l < 0.5f ? l * (1 + s) : l + s - l * s;
        float p = 2 * l - q;
        r = hueToRgb(p, q, h + 1f/3f);
        g = hueToRgb(p, q, h);
        b = hueToRgb(p, q, h - 1f/3f);
    }
    int[] rgb = {to255(r), to255(g), to255(b)};
    return rgb;
}
public static int to255(float v) { return (int)Math.min(255,256*v); }

/** Helper method that converts hue to rgb */
public static float hueToRgb(float p, float q, float t) {
    if (t < 0f)
        t += 1f;
    if (t > 1f)
        t -= 1f;
    if (t < 1f/6f)
        return p + (q - p) * 6f * t;
    if (t < 1f/2f)
        return q;
    if (t < 2f/3f)
        return p + (q - p) * (2f/3f - t) * 6f;
    return p;
}

RGB เป็น HSL

/**
 * Converts an RGB color value to HSL. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes pR, pG, and bpBare contained in the set [0, 255] and
 * returns h, s, and l in the set [0, 1].
 *
 * @param pR       The red color value
 * @param pG       The green color value
 * @param pB       The blue color value
 * @return float array, the HSL representation
 */
public static float[] rgbToHsl(int pR, int pG, int pB) {
    float r = pR / 255f;
    float g = pG / 255f;
    float b = pB / 255f;

    float max = (r > g && r > b) ? r : (g > b) ? g : b;
    float min = (r < g && r < b) ? r : (g < b) ? g : b;

    float h, s, l;
    l = (max + min) / 2.0f;

    if (max == min) {
        h = s = 0.0f;
    } else {
        float d = max - min;
        s = (l > 0.5f) ? d / (2.0f - max - min) : d / (max + min);

        if (r > g && r > b)
            h = (g - b) / d + (g < b ? 6.0f : 0.0f);

        else if (g > b)
            h = (b - r) / d + 2.0f;

        else
            h = (r - g) / d + 4.0f;

        h /= 6.0f;
    }

    float[] hsl = {h, s, l};
    return hsl;
}

นี่คืออัลกอริทึมที่ง่ายกว่าบนวิกิ: stackoverflow.com/a/54014428/860099
Kamil Kiełczewski

19

บทความสำหรับHSL และ HSV บนวิกิพีเดียมีสูตรบางอย่าง การคำนวณเป็นบิตหากินดังนั้นจึงอาจจะมีประโยชน์ในการดูที่การใช้งานที่มีอยู่


1
+1 คำตอบที่ดี ลิงค์คือสิ่งที่ฉันกำลังมองหา คำตอบที่ได้รับการยอมรับนั้นมีประโยชน์สำหรับงูใหญ่เท่านั้น
AturSams

นี่เป็นอัลกอริทึมที่ง่ายกว่าบน wiki stackoverflow.com/a/54014428/860099
Kamil Kiełczewski

13

หากคุณกำลังมองหาสิ่งที่สอดคล้องกับ CSS semantics สำหรับ HSL และ RGB แน่นอนคุณสามารถใช้อัลกอริทึมที่ระบุในข้อกำหนด CSS 3ซึ่งอ่านได้:

HOW TO RETURN hsl.to.rgb(h, s, l): 
   SELECT: 
      l<=0.5: PUT l*(s+1) IN m2
      ELSE: PUT l+s-l*s IN m2
   PUT l*2-m2 IN m1
   PUT hue.to.rgb(m1, m2, h+1/3) IN r
   PUT hue.to.rgb(m1, m2, h    ) IN g
   PUT hue.to.rgb(m1, m2, h-1/3) IN b
   RETURN (r, g, b)

HOW TO RETURN hue.to.rgb(m1, m2, h): 
   IF h<0: PUT h+1 IN h
   IF h>1: PUT h-1 IN h
   IF h*6<1: RETURN m1+(m2-m1)*h*6
   IF h*2<1: RETURN m2
   IF h*3<2: RETURN m1+(m2-m1)*(2/3-h)*6
   RETURN m1

ฉันเชื่อว่านี่คือแหล่งที่มาของคำตอบอื่น ๆ ที่นี่


นี่เป็นอัลกอริทึมที่ง่ายกว่าstackoverflow.com/a/54014428/860099
Kamil Kiełczewski

7

รหัส C # จากคำตอบของ Mohsen

นี่คือรหัสจากคำตอบของ Mohsen ใน C # หากใครต้องการมัน หมายเหตุ: Colorเป็นคลาสที่กำหนดเองและVector4มาจาก OpenTK ทั้งสองเป็นเรื่องง่ายที่จะแทนที่ด้วยสิ่งอื่นที่คุณเลือก

Hsl ถึง Rgba

/// <summary>
/// Converts an HSL color value to RGB.
/// Input: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
/// Output: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )
/// </summary>
/// <param name="hsl">Vector4 defining X = h, Y = s, Z = l, W = a. Ranges [0, 1.0]</param>
/// <returns>RGBA Color. Ranges [0, 255]</returns>
public static Color HslToRgba(Vector4 hsl)
{
    float r, g, b;

    if (hsl.Y == 0.0f)
        r = g = b = hsl.Z;

    else
    {
        var q = hsl.Z < 0.5f ? hsl.Z * (1.0f + hsl.Y) : hsl.Z + hsl.Y - hsl.Z * hsl.Y;
        var p = 2.0f * hsl.Z - q;
        r = HueToRgb(p, q, hsl.X + 1.0f / 3.0f);
        g = HueToRgb(p, q, hsl.X);
        b = HueToRgb(p, q, hsl.X - 1.0f / 3.0f);
    }

    return new Color((int)(r * 255), (int)(g * 255), (int)(b * 255), (int)(hsl.W * 255));
}

// Helper for HslToRgba
private static float HueToRgb(float p, float q, float t)
{
    if (t < 0.0f) t += 1.0f;
    if (t > 1.0f) t -= 1.0f;
    if (t < 1.0f / 6.0f) return p + (q - p) * 6.0f * t;
    if (t < 1.0f / 2.0f) return q;
    if (t < 2.0f / 3.0f) return p + (q - p) * (2.0f / 3.0f - t) * 6.0f;
    return p;
}

Rgba ถึง Hsl

/// <summary>
/// Converts an RGB color value to HSL.
/// Input: Color ( R: [0, 255], G: [0, 255], B: [0, 255], A: [0, 255] )
/// Output: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
/// </summary>
/// <param name="rgba"></param>
/// <returns></returns>
public static Vector4 RgbaToHsl(Color rgba)
{
    float r = rgba.R / 255.0f;
    float g = rgba.G / 255.0f;
    float b = rgba.B / 255.0f;

    float max = (r > g && r > b) ? r : (g > b) ? g : b;
    float min = (r < g && r < b) ? r : (g < b) ? g : b;

    float h, s, l;
    h = s = l = (max + min) / 2.0f;

    if (max == min)
        h = s = 0.0f;

    else
    {
        float d = max - min;
        s = (l > 0.5f) ? d / (2.0f - max - min) : d / (max + min);

        if (r > g && r > b)
            h = (g - b) / d + (g < b ? 6.0f : 0.0f);

        else if (g > b)
            h = (b - r) / d + 2.0f;

        else
            h = (r - g) / d + 4.0f;

        h /= 6.0f;
    }

    return new Vector4(h, s, l, rgba.A / 255.0f);
}

นี่คืออัลกอริทึมที่ง่ายกว่าบนวิกิ: stackoverflow.com/a/54014428/860099
Kamil Kiełczewski

7

การใช้ Php ของรหัส C #ของChris

นอกจากนี้จากที่นี่ซึ่งอธิบายคณิตศาสตร์ของมันได้เป็นอย่างดี

นี่คือฟังก์ชั่นพื้นฐานในการแปลงเป็นและจาก HSL (Hue Saturation Lightness)

ผ่านการทดสอบและทำงานบน PHP 5.6.15

TL; DR : รหัสเต็มสามารถพบได้ที่นี่ใน Pastebin


Hex เป็น HSL

อินพุต: สีหกเหลี่ยมในรูปแบบ: [#] 0f4 หรือ [#] 00ff44 (ตัวเลือกเครื่องหมายปอนด์)
เอาท์พุท: HSL ในหน่วยองศาเปอร์เซ็นต์เปอร์เซ็นต์

/**
 * Input: hex color
 * Output: hsl(in ranges from 0-1)
 * 
 * Takes the hex, converts it to RGB, and sends
 * it to RGBToHsl.  Returns the output.
 * 
*/
function hexToHsl($hex) {
    $r = "";
    $g = "";
    $b = "";

    $hex = str_replace('#', '', $hex);

    if (strlen($hex) == 3) {
        $r = substr($hex, 0, 1);
        $r = $r . $r;
        $g = substr($hex, 1, 1);
        $g = $g . $g;
        $b = substr($hex, 2, 1);
        $b = $b . $b;
    } elseif (strlen($hex) == 6) {
        $r = substr($hex, 0, 2);
        $g = substr($hex, 2, 2);
        $b = substr($hex, 4, 2);
    } else {
        return false;
    }

    $r = hexdec($r);
    $g = hexdec($g);
    $b = hexdec($b);

    $hsl =  rgbToHsl($r,$g,$b);
    return $hsl;
}

RGB เป็น HSL

อินพุต: RGB ในช่วง 0-255 เอาต์พุต: HSL เป็นองศาเปอร์เซ็นต์ร้อยละ

/**
 * 
 *Credits:
 * /programming/4793729/rgb-to-hsl-and-back-calculation-problems
 * http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/
 *
 * Called by hexToHsl by default.
 *
 * Converts an RGB color value to HSL. Conversion formula
 * adapted from http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/.
 * Assumes r, g, and b are contained in the range [0 - 255] and
 * returns h, s, and l in the format Degrees, Percent, Percent.
 *
 * @param   Number  r       The red color value
 * @param   Number  g       The green color value
 * @param   Number  b       The blue color value
 * @return  Array           The HSL representation
*/
function rgbToHsl($r, $g, $b){  
    //For the calculation, rgb needs to be in the range from 0 to 1. To convert, divide by 255 (ff). 
    $r /= 255;
    $g /= 255;
    $b /= 255;

    $myMax = max($r, $g, $b);
    $myMin = min($r, $g, $b);

    $maxAdd = ($myMax + $myMin);
    $maxSub = ($myMax - $myMin);

    //luminence is (max + min)/2
    $h = 0;
    $s = 0;
    $l = ($maxAdd / 2.0);

    //if all the numbers are equal, there is no saturation (greyscale).
    if($myMin != $myMax){
        if ($l < 0.5) {
            $s = ($maxSub / $maxAdd);
        } else {
            $s = (2.0 - $myMax - $myMin); //note order of opperations - can't use $maxSub here
            $s = ($maxSub / $s);
        }

        //find hue
        switch($myMax){
            case $r: 
                $h = ($g - $b);
                $h = ($h / $maxSub);
                break;
            case $g: 
                $h = ($b - $r); 
                $h = ($h / $maxSub);
                $h = ($h + 2.0);
                break;
            case $b: 
                $h = ($r - $g);
                $h = ($h / $maxSub); 
                $h = ($h + 4.0);
                break;
        } 
    }

    $hsl = hslToDegPercPerc($h, $s, $l);
    return $hsl;
}

HSL (ช่วง 0-1) ถึงองศาเปอร์เซ็นต์รูปแบบเปอร์เซ็นต์

สำหรับการคำนวณทางคณิตศาสตร์ HSL นั้นง่ายต่อการจัดการในช่วง 0-1 แต่สำหรับการอ่านของมนุษย์มันง่ายกว่าในรูปแบบองศาเปอร์เซ็นต์ร้อยละ ฟังก์ชันนี้ใช้ HSL ในช่วง 0-1 และส่งกลับ HSL เป็นองศาเปอร์เซ็นต์เปอร์เซ็นต์

/**
 * Input: HSL in ranges 0-1.
 * Output: HSL in format Deg, Perc, Perc.
 * 
 * Note: rgbToHsl calls this function by default.
 * 
 * Multiplies $h by 60, and $s and $l by 100.
 */
function hslToDegPercPerc($h, $s, $l) {
    //convert h to degrees
    $h *= 60;

    if ($h < 0) {
        $h += 360;
    }

    //convert s and l to percentage
    $s *= 100;
    $l *= 100;

    $hsl['h'] = $h;
    $hsl['s'] = $s;
    $hsl['l'] = $l;
    return $hsl;
}

HSL (องศา, เปอร์เซ็นต์, รูปแบบเปอร์เซ็นต์) ถึง HSL ในช่วง 0-1

ฟังก์ชันนี้แปลง HSL ในรูปแบบ Degrees, Percent, Percent ไปเป็นช่วง 0-1 เพื่อการคำนวณที่ง่ายขึ้น

/**
 * Input: HSL in format Deg, Perc, Perc
 * Output: An array containing HSL in ranges 0-1
 * 
 * Divides $h by 60, and $s and $l by 100.
 * 
 * hslToRgb calls this by default.
*/
function degPercPercToHsl($h, $s, $l) { 
    //convert h, s, and l back to the 0-1 range

    //convert the hue's 360 degrees in a circle to 1
    $h /= 360;

    //convert the saturation and lightness to the 0-1 
    //range by multiplying by 100
    $s /= 100;
    $l /= 100;

    $hsl['h'] =  $h;
    $hsl['s'] = $s;
    $hsl['l'] = $l;

    return $hsl;
}

HSL เป็น RGB

การป้อนข้อมูล: HSL ในรูปแบบองศา, เปอร์เซ็นต์, เอาท์พุท: RGB 255, 255, 255ในรูปแบบ

/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/.
 * Assumes h, s, and l are in the format Degrees,
 * Percent, Percent, and returns r, g, and b in 
 * the range [0 - 255].
 *
 * Called by hslToHex by default.
 *
 * Calls: 
 *   degPercPercToHsl
 *   hueToRgb
 *
 * @param   Number  h       The hue value
 * @param   Number  s       The saturation level
 * @param   Number  l       The luminence
 * @return  Array           The RGB representation
 */
function hslToRgb($h, $s, $l){
    $hsl = degPercPercToHsl($h, $s, $l);
    $h = $hsl['h'];
    $s = $hsl['s'];
    $l = $hsl['l'];

    //If there's no saturation, the color is a greyscale,
    //so all three RGB values can be set to the lightness.
    //(Hue doesn't matter, because it's grey, not color)
    if ($s == 0) {
        $r = $l * 255;
        $g = $l * 255;
        $b = $l * 255;
    }
    else {
        //calculate some temperary variables to make the 
        //calculation eaisier.
        if ($l < 0.5) {
            $temp2 = $l * (1 + $s);
        } else {
            $temp2 = ($l + $s) - ($s * $l);
        }
        $temp1 = 2 * $l - $temp2;

        //run the calculated vars through hueToRgb to
        //calculate the RGB value.  Note that for the Red
        //value, we add a third (120 degrees), to adjust 
        //the hue to the correct section of the circle for
        //red.  Simalarly, for blue, we subtract 1/3.
        $r = 255 * hueToRgb($temp1, $temp2, $h + (1 / 3));
        $g = 255 * hueToRgb($temp1, $temp2, $h);
        $b = 255 * hueToRgb($temp1, $temp2, $h - (1 / 3));
    }

    $rgb['r'] = $r;
    $rgb['g'] = $g;
    $rgb['b'] = $b;

    return $rgb;
}

ฮิวถึง RGB

ฟังก์ชั่นนี้เรียกว่าโดย hslToRgb เพื่อแปลงเฉดสีให้เป็นค่า RGB แยกต่างหาก

/**
 * Converts an HSL hue to it's RGB value.  
 *
 * Input: $temp1 and $temp2 - temperary vars based on 
 * whether the lumanence is less than 0.5, and 
 * calculated using the saturation and luminence
 * values.
 *  $hue - the hue (to be converted to an RGB 
 * value)  For red, add 1/3 to the hue, green 
 * leave it alone, and blue you subtract 1/3 
 * from the hue.
 *
 * Output: One RGB value.
 *
 * Thanks to Easy RGB for this function (Hue_2_RGB).
 * http://www.easyrgb.com/index.php?X=MATH&$h=19#text19
 *
*/
function hueToRgb($temp1, $temp2, $hue) {
    if ($hue < 0) { 
        $hue += 1;
    }
    if ($hue > 1) {
        $hue -= 1;
    }

    if ((6 * $hue) < 1 ) {
        return ($temp1 + ($temp2 - $temp1) * 6 * $hue);
    } elseif ((2 * $hue) < 1 ) {
        return $temp2;
    } elseif ((3 * $hue) < 2 ) {
        return ($temp1 + ($temp2 - $temp1) * ((2 / 3) - $hue) * 6);
    }
    return $temp1;
}

HSL เป็น Hex

อินพุต: HSL ในรูปแบบองศาเปอร์เซ็นต์ร้อยละเอาต์พุต: Hex ในรูปแบบ00ff22(ไม่มีเครื่องหมายปอนด์)

แปลงเป็น RGB จากนั้นแปลงเป็น Hex

/**
 * Converts HSL to Hex by converting it to 
 * RGB, then converting that to hex.
 * 
 * string hslToHex($h, $s, $l[, $prependPound = true]
 * 
 * $h is the Degrees value of the Hue
 * $s is the Percentage value of the Saturation
 * $l is the Percentage value of the Lightness
 * $prependPound is a bool, whether you want a pound 
 *  sign prepended. (optional - default=true)
 *
 * Calls: 
 *   hslToRgb
 *
 * Output: Hex in the format: #00ff88 (with 
 * pound sign).  Rounded to the nearest whole
 * number.
*/
function hslToHex($h, $s, $l, $prependPound = true) {
    //convert hsl to rgb
    $rgb = hslToRgb($h,$s,$l);

    //convert rgb to hex
    $hexR = $rgb['r'];
    $hexG = $rgb['g'];
    $hexB = $rgb['b'];

    //round to the nearest whole number
    $hexR = round($hexR);
    $hexG = round($hexG);
    $hexB = round($hexB);

    //convert to hex
    $hexR = dechex($hexR);
    $hexG = dechex($hexG);
    $hexB = dechex($hexB);

    //check for a non-two string length
    //if it's 1, we can just prepend a
    //0, but if it is anything else non-2,
    //it must return false, as we don't 
    //know what format it is in.
    if (strlen($hexR) != 2) {
        if (strlen($hexR) == 1) {
            //probably in format #0f4, etc.
            $hexR = "0" . $hexR;
        } else {
            //unknown format
            return false;
        }
    }
    if (strlen($hexG) != 2) {
        if (strlen($hexG) == 1) {
            $hexG = "0" . $hexG;
        } else {
            return false;
        }
    }
    if (strlen($hexB) != 2) {
        if (strlen($hexB) == 1) {
            $hexB = "0" . $hexB;
        } else {
            return false;
        }
    }

    //if prependPound is set, will prepend a
    //# sign to the beginning of the hex code.
    //(default = true)
    $hex = "";
    if ($prependPound) {
        $hex = "#";
    }

    $hex = $hex . $hexR . $hexG . $hexB;

    return $hex;
}

ฉันทำการแก้ไขไปrgbToHslแล้วคุณอาจต้องการอัปเดตโค้ด php ของคุณ มี / เป็นข้อบกพร่องในรหัส ใน rgbToHsl () s = maxSub / (2 - maxSub)ควรเป็นs = maxSub / (2 - maxAdd)
Lex

@Lex ตามที่นี่และที่นี่รหัสของฉันถูกต้องจริง ฉันคิดว่าคุณอาจจะสับสนกับif l < 0.5 elseคุณอธิบายความคิดของคุณได้ไหม ขอบคุณที่สละเวลาแสดงความคิดเห็น!
Cullub

1
ขออภัยคุณพูดถูก แต่ก็ยังมีปัญหาเรื่องการดำเนินการอยู่ # 8cd08c เพื่อ HSL ใช้ Calc นี้เมื่อมันควรจะเป็นในตัวอย่างการเชื่อมโยงที่สอง(2 - maxSub) = 1.7333333333333334 ( 2 - max - min ) = 0.6352941176470588การใช้2 - maxAddทำให้ฉันเข้าใกล้ Photoshops อย่างต่อเนื่องดังนั้นฉันจึงคิดว่ามันถูกต้อง
Lex

โอวตกลง. ขอบคุณสำหรับการชี้ให้เห็น! ฉันแก้ไขมันตอนนี้ หวังว่านี่จะเป็นประโยชน์!
Cullub

มันมีประโยชน์จริง ๆ ฉันอยู่ในขั้นตอนการแปลงเป็น JS github.com/bambii7/glow
Lex

6

นี่คือวิธีที่ฉันทำซึ่งจำได้ง่ายคือนึกถึง RGB เป็นซี่ล้อสามซี่ห่างกัน 120 องศา

H = hue (0-360)
S = saturation (0-1)
L = luminance (0-1)

R1 = SIN( H ) * L 
G1 = SIN( H + 120 ) * L 
B1 = SIN( H + 240 ) * L 

ส่วนที่ยุ่งยากคือความอิ่มตัวซึ่งลดลงตามค่าเฉลี่ยของทั้งสาม

AVERAGE = (R1 + G1 + B1) / 3 

R2 = ((R1 - AVERAGE) * S) + AVERAGE 
G2 = ((G1 - AVERAGE) * S) + AVERAGE 
B2 = ((B1 - AVERAGE) * S) + AVERAGE 

RED = R2 * 255 
GREEN = G2 * 255 
BLUE = B2 * 255 

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ... ง่ายกว่าและใช้งานง่ายกว่า! คุณสามารถย้อนกลับอัลกอริทึมได้หรือไม่
JoelFan

@JoelFan - มันเป็นที่เรียบง่าย แต่ไม่ถูกต้อง นอกจากนี้ไม่มีทางสำหรับการแสดงออกเหตุผลบริสุทธิ์ (มีเพียง+, -, *และ/เป็นถูกนำมาใช้โดยความหมายสำหรับการแปลงสี - - จะแสดงให้พวกเขาด้วยความช่วยเหลือของ) sineฟังก์ชั่นที่มีความเป็นอิสระเดียวกัน (input) ตัวแปร ทั้งๆที่มันเป็นสิ่งที่ดีสำหรับการทำความเข้าใจหลักการ (แต่ไม่ได้สำหรับการแปลง)
MarianD

ปัญหาของการแก้ปัญหานี้คือ AVERAGE มีค่าเท่ากับศูนย์: (R1 + G1 + B1) = L*[ SIN(H) + SIN(H+120) + SIN(H+240) ]- และตอนนี้ถ้าเราใช้สูตรsin(a)+sin(b) = 2*sin((a+b)/2)*cos((a-b)/2)สำหรับบาปสองข้อแรกที่เราได้รับ: AVERAGE=L*( sin(h+60) + sin(h+240) )และอีกครั้งAVERAGE= L*2*sin(h+150)*cos(-180/2) = 0(ตั้งแต่ cos (-180/2) = cos (90) = 0) ดังนั้นการคำนวณค่าความอิ่มตัวจึงผิด
Kamil Kiełczewski

@JoelFan ปัญหาที่สองของการแก้ปัญหานี้คือเราต้องเพิ่ม 180 องศาใน H เพื่อให้มี "รุ่นที่เข้ากันได้" กับen.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB (กรณีทดสอบ: สีแดงสำหรับ H = 0) ยังคงมีปัญหากับจำนวนของสี - ในการแก้ปัญหาข้างต้นสีเหลือง, สีม่วงและสีฟ้าเป็นสี ommit และ / หรือแมปในทางที่ผิด มีซอ js กับการเปรียบเทียบ: jsfiddle.net/Lamik/9s24uc1o/10
Kamil Kiełczewski

3

ต่อไปนี้เป็นรุ่นที่เรียบง่ายและไม่มีสาขาใน GLSL:

vec3 hsl2rgb( vec3 c ) {
    vec3 rgb = clamp(abs(mod(c.x*6.0 + vec3(0.0, 4.0, 2.0), 6.0)-3.0)-1.0, 0.0, 1.0);
    return c.z + c.y * (rgb-0.5)*(1.0-abs(2.0*c.z-1.0));
}

ไม่สั้นกว่านี้อีก ~


ลิงก์ไปยังแนวคิดการพิสูจน์ดั้งเดิม: https://www.shadertoy.com/view/XljGzV

(ข้อจำกัดความรับผิดชอบ: ไม่ใช่รหัสของฉัน!)


2

นี่คือฟังก์ชั่นจาวาสคริปต์ที่ปรับเปลี่ยนแล้วมันจะแสดงผลฮิวในชุด 0-360 องศา

function rgbToHsl(r, g, b) {
      r /= 255, g /= 255, b /= 255;
      var max = Math.max(r, g, b), min = Math.min(r, g, b);
      var h, s, l = (max + min) / 2;

      if(max == min){
          h = s = 0; // achromatic
      } else {
          var d = max - min;
          s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
          switch(max){
              case r: h = (g - b) / d ; break;
              case g: h = 2 + ( (b - r) / d); break;
              case b: h = 4 + ( (r - g) / d); break;
          }
          h*=60;
          if (h < 0) h +=360;
      }
     return([h, s, l]);
  }  
alert(rgbToHsl(125,115,145));

2

ฉันได้สิ่งนี้จากเครื่องมือเลือก HSLของแบรนดอนมาติสซอร์สโค้ดตัว

มันถูกเขียนขึ้นใน CoffeeScriptCoffeeScript ฉันแปลงเป็น JavaScript โดยใช้เครื่องมือแปลงออนไลน์และนำกลไกการตรวจสอบว่าการป้อนข้อมูลของผู้ใช้เป็นค่า RGB ที่ถูกต้อง คำตอบนี้ใช้ได้กับ usecase ของฉันเนื่องจากคำตอบที่ได้รับการโหวตมากที่สุดในโพสต์นี้ฉันพบว่าไม่ได้สร้างมูลค่า HSL ที่ถูกต้อง

โปรดทราบว่ามันจะส่งกลับhslaค่าที่มีaความทึบ / โปร่งใส 0โปร่งใสอย่างสมบูรณ์และ1ทึบแสงเต็มที่

function rgbToHsl(rgb) {
  var a, add, b, diff, g, h, hue, l, lum, max, min, r, s, sat;
  r = parseFloat(rgb[0]) / 255;
  g = parseFloat(rgb[1]) / 255;
  b = parseFloat(rgb[2]) / 255;
  max = Math.max(r, g, b);
  min = Math.min(r, g, b);
  diff = max - min;
  add = max + min;
  hue = min === max ? 0 : r === max ? ((60 * (g - b) / diff) + 360) % 360 : g === max ? (60 * (b - r) / diff) + 120 : (60 * (r - g) / diff) + 240;
  lum = 0.5 * add;
  sat = lum === 0 ? 0 : lum === 1 ? 1 : lum <= 0.5 ? diff / add : diff / (2 - add);
  h = Math.round(hue);
  s = Math.round(sat * 100);
  l = Math.round(lum * 100);
  a = parseFloat(rgb[3]) || 1;
  return [h, s, l, a];
}

ฉันใช้สิ่งนี้เป็นพื้นฐานสำหรับวิธีการ Python ขอบคุณ
JayJay123

นี่ไม่ใช่ HSL เป็น RGB ตามที่ผู้ถามถาม
bryc

1

สำหรับเมื่อคุณต้องการ RGB เป็น HSV และในทางกลับกันแทน:

function rgbToHsv(r, g, b)
{
    r /= 255, g /= 255, b /= 255;

    var min = Math.min(r, g, b),
    max = Math.max(r, g, b),
    delta = max - min,
    h = 0, s = 0, v = max;

    if (min != max)
    {
        s = (delta / max);

        switch (max)
        {
            case r: h = (g - b) / delta + (g < b ? 6 : 0); break;
            case g: h = (b - r) / delta + 2; break;
            case b: h = (r - g) / delta + 4; break;
        }

        h /= 6;
    }

    return [h, s, v];
}

function hsvToRgb(h, s, v)
{
    var step = h / (1 / 6),
    pos = step - Math.floor(step), // the hue position within the current step
    m = (Math.floor(step) % 2) ? (1 - pos) * v : pos * v, // mix color value adjusted to the brightness(v)
    max = 1 * v,
    min = (1 - s) * v,
    med = m + ((1 - s) * (v - m)),
    r, g, b;

    switch (Math.floor(step))
    {
        case 0:
            r = max;
            g = med;
            b = min;
            break;
        case 1:
            r = med;
            g = max;
            b = min;
            break;
        case 2:
            r = min;
            g = max;
            b = med;
            break;
        case 3:
            r = min;
            g = med;
            b = max;
            break;
        case 4:
            r = med;
            g = min;
            b = max;
            break;
        case 5:
            r = max;
            g = min;
            b = med;
            break;
    }

    return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}

1

Unity3D C # Code จากคำตอบของ Mohsen

นี่คือรหัสจากคำตอบของ Mohsen ใน C # ที่กำหนดเป้าหมายเฉพาะสำหรับ Unity3D มันดัดแปลงมาจากคำตอบ C # ที่กำหนดโดย Alec Thilenius ด้านบน

using UnityEngine;
using System.Collections;

public class ColorTools {

    /// <summary>
    /// Converts an HSL color value to RGB.
    /// Input: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )**strong text**
    /// Output: Color ( R: [0.0, 1.0], G: [0.0, 1.0], B: [0.0, 1.0], A: [0.0, 1.0] )
    /// </summary>
    /// <param name="hsl">Vector4 defining X = h, Y = s, Z = l, W = a. Ranges [0, 1.0]</param>
    /// <returns>RGBA Color. Ranges [0.0, 1.0]</returns>
    public static Color HslToRgba(Vector4 hsl)
    {
        float r, g, b;

        if (hsl.y == 0.0f)
            r = g = b = hsl.z;
        else
        {
            var q = hsl.z < 0.5f ? hsl.z * (1.0f + hsl.y) : hsl.z + hsl.y - hsl.z * hsl.y;
            var p = 2.0f * hsl.z - q;
            r = HueToRgb(p, q, hsl.x + 1.0f / 3.0f);
            g = HueToRgb(p, q, hsl.x);
            b = HueToRgb(p, q, hsl.x - 1.0f / 3.0f);
        }

        return new Color(r, g, b, hsl.w);
    }

    // Helper for HslToRgba
    private static float HueToRgb(float p, float q, float t)
    {
        if (t < 0.0f) t += 1.0f;
        if (t > 1.0f) t -= 1.0f;
        if (t < 1.0f / 6.0f) return p + (q - p) * 6.0f * t;
        if (t < 1.0f / 2.0f) return q;
        if (t < 2.0f / 3.0f) return p + (q - p) * (2.0f / 3.0f - t) * 6.0f;
        return p;
    }

    /// <summary>
    /// Converts an RGB color value to HSL.
    /// Input: Color ( R: [0.0, 1.0], G: [0.0, 1.0], B: [0.0, 1.0], A: [0.0, 1.0] )
    /// Output: Vector4 ( X: [0.0, 1.0], Y: [0.0, 1.0], Z: [0.0, 1.0], W: [0.0, 1.0] )
    /// </summary>
    /// <param name="rgba"></param>
    /// <returns></returns>
    public static Vector4 RgbaToHsl(Color rgba)
    {

        float max = (rgba.r > rgba.g && rgba.r > rgba.b) ? rgba.r : 
            (rgba.g > rgba.b) ? rgba.g : rgba.b;
        float min = (rgba.r < rgba.g && rgba.r < rgba.b) ? rgba.r : 
            (rgba.g < rgba.b) ? rgba.g : rgba.b;

        float h, s, l;
        h = s = l = (max + min) / 2.0f;

        if (max == min)
            h = s = 0.0f;
        else
        {
            float d = max - min;
            s = (l > 0.5f) ? d / (2.0f - max - min) : d / (max + min);

            if (rgba.r > rgba.g && rgba.r > rgba.b)
                h = (rgba.g - rgba.b) / d + (rgba.g < rgba.b ? 6.0f : 0.0f);

            else if (rgba.g > rgba.b)
                h = (rgba.b - rgba.r) / d + 2.0f;

            else
                h = (rgba.r - rgba.g) / d + 4.0f;

            h /= 6.0f;
        }

        return new Vector4(h, s, l, rgba.a);
    }

}

1

สำหรับทุกคนที่กล่าวว่าวิธีการแก้ปัญหา Garry Tan แปลงไม่ถูกต้องจาก RGB เป็น HSL และย้อนกลับ เป็นเพราะเขาปล่อยเศษส่วนของรหัสในรหัส ฉันแก้ไขรหัสของเขาแล้ว (จาวาสคริปต์) ขออภัยสำหรับลิงค์ในภาษารัสเซีย แต่ในภาษาอังกฤษขาด - HSL-wiki

function toHsl(r, g, b)
{
    r /= 255.0;
    g /= 255.0;
    b /= 255.0;
    var max = Math.max(r, g, b);
    var min = Math.min(r, g, b);
    var h, s, l = (max + min) / 2.0;

    if(max == min)
    {
        h = s = 0; 
    }
    else
    {
        var d = max - min;
        s = (l > 0.5 ? d / (2.0 - max - min) : d / (max + min));

        if(max == r && g >= b)
        {
            h = 1.0472 * (g - b) / d ;
        }
        else if(max == r && g < b)
        {
            h = 1.0472 * (g - b) / d + 6.2832;
        }
        else if(max == g)
        {
            h = 1.0472 * (b - r) / d + 2.0944;
        }
        else if(max == b)
        {
            h = 1.0472 * (r - g) / d + 4.1888;
        }
    }
    return {
        str: 'hsl(' + parseInt(h / 6.2832 * 360.0 + 0.5) + ',' + parseInt(s * 100.0 + 0.5) + '%,' + parseInt(l * 100.0 + 0.5) + '%)',
        obj: { h: parseInt(h / 6.2832 * 360.0 + 0.5), s: parseInt(s * 100.0 + 0.5), l: parseInt(l * 100.0 + 0.5) }
    };
};

1

hsl | ค่าสีตั้งค่าใน javascript จะถูกแปลงเป็น rgb | a ทันทีที่คุณต้องทำคือเข้าถึงค่าสไตล์ที่คำนวณ

document.body.style.color = 'hsla(44, 100%, 50%, 0.8)';

console.log(window.getComputedStyle(document.body).color);

// displays: rgba(255, 187, 0, 0.8)

ในทางเทคนิคแล้วฉันคิดว่ามันไม่ได้มีอะไรแม้แต่อย่างเดียวบรรทัดแต่มันก็ทำโดยอัตโนมัติ ดังนั้นขึ้นอยู่กับสภาพแวดล้อมของคุณคุณอาจจะสามารถหลีกหนีจากสิ่งนี้ได้ ไม่ใช่ว่ามีการตอบสนองที่ไม่รอบคอบมากนักที่นี่ ฉันไม่รู้ว่าเป้าหมายของคุณคืออะไร

ทีนี้ถ้าคุณต้องการแปลงจาก rbg | a ถึง hsl | a


1

การใช้ C ++ ที่มีประสิทธิภาพดีกว่ารหัส @Mohsen มันใช้ช่วง [0-6] สำหรับสี, หลีกเลี่ยงการหารและการคูณด้วย 6 ช่วง S และ L คือ [0,1]

void fromRGBtoHSL(float rgb[], float hsl[])
{
     const float maxRGB = max(rgb[0], max(rgb[1], rgb[2]));
     const float minRGB = min(rgb[0], min(rgb[1], rgb[2]));
     const float delta2 = maxRGB + minRGB;
     hsl[2] = delta2 * 0.5f;

     const float delta = maxRGB - minRGB;
     if (delta < FLT_MIN)
         hsl[0] = hsl[1] = 0.0f;
     else
     {
         hsl[1] = delta / (hsl[2] > 0.5f ? 2.0f - delta2 : delta2);
         if (rgb[0] >= maxRGB)
         {
             hsl[0] = (rgb[1] - rgb[2]) / delta;
             if (hsl[0] < 0.0f)
                 hsl[0] += 6.0f;
         }
         else if (rgb[1] >= maxRGB)
             hsl[0] = 2.0f + (rgb[2] - rgb[0]) / delta;
         else
             hsl[0] = 4.0f + (rgb[0] - rgb[1]) / delta;
     }
}

void fromHSLtoRGB(const float hsl[], float rgb[])
{
    if(hsl[1] < FLT_MIN)
        rgb[0] = rgb[1] = rgb[2] = hsl[2];
    else if(hsl[2] < FLT_MIN)
        rgb[0] = rgb[1] = rgb[2] = 0.0f;
    else
    {
        const float q = hsl[2] < 0.5f ? hsl[2] * (1.0f + hsl[1]) : hsl[2] + hsl[1] - hsl[2] * hsl[1];
        const float p = 2.0f * hsl[2] - q;
        float t[] = {hsl[0] + 2.0f, hsl[0], hsl[0] - 2.0f};

        for(int i=0; i<3; ++i)
        {
            if(t[i] < 0.0f)
                t[i] += 6.0f;
            else if(t[i] > 6.0f)
                t[i] -= 6.0f;

            if(t[i] < 1.0f)
                rgb[i] = p + (q - p) * t[i];
            else if(t[i] < 3.0f)
                rgb[i] = q;
            else if(t[i] < 4.0f)
                rgb[i] = p + (q - p) * (4.0f - t[i]);
            else
                rgb[i] = p;
          }
      }
}

0

ด้วย H, S และ L ในช่วง [0,1]:

ConvertHslToRgb: function (iHsl)
{
    var min, sv, sextant, fract, vsf;

    var v = (iHsl.l <= 0.5) ? (iHsl.l * (1 + iHsl.s)) : (iHsl.l + iHsl.s - iHsl.l * iHsl.s);
    if (v === 0)
        return { Red: 0, Green: 0, Blue: 0 };

    min = 2 * iHsl.l - v;
    sv = (v - min) / v;
    var h = (6 * iHsl.h) % 6;
    sextant = Math.floor(h);
    fract = h - sextant;
    vsf = v * sv * fract;

    switch (sextant)
    {
        case 0: return { r: v, g: min + vsf, b: min };
        case 1: return { r: v - vsf, g: v, b: min };
        case 2: return { r: min, g: v, b: min + vsf };
        case 3: return { r: min, g: v - vsf, b: v };
        case 4: return { r: min + vsf, g: min, b: v };
        case 5: return { r: v, g: min, b: v - vsf };
    }
}

0

ฉันต้องการน้ำหนักที่เบาจริง ๆ มันไม่ได้ 100% แต่มันเข้าใกล้พอสำหรับบางคน

float3 Hue(float h, float s, float l)
{
    float r = max(cos(h * 2 * UNITY_PI) * 0.5 + 0.5, 0);
    float g = max(cos((h + 0.666666) * 2 * UNITY_PI) * 0.5 + 0.5, 0);
    float b = max(cos((h + 0.333333) * 2 * UNITY_PI) * 0.5 + 0.5, 0);
    float gray = 0.2989 * r + 0.5870 * g + 0.1140 * b;
    return lerp(gray, float3(r, g, b), s) * smoothstep(0, 0.5, l) + 1 * smoothstep(0.5, 1, l);
}

0

การติดตั้ง PHP ของรหัส @ Mohsen (รวมถึงการทดสอบ!)

ขออภัยที่จะโพสต์สิ่งนี้อีกครั้ง แต่ฉันไม่เคยเห็นการใช้งานอื่นใดที่ให้คุณภาพที่ฉันต้องการ

/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes h, s, and l are contained in the set [0, 1] and
 * returns r, g, and b in the set [0, 255].
 *
 * @param   {number}  h       The hue
 * @param   {number}  s       The saturation
 * @param   {number}  l       The lightness
 * @return  {Array}           The RGB representation
 */
  
function hue2rgb($p, $q, $t){
            if($t < 0) $t += 1;
            if($t > 1) $t -= 1;
            if($t < 1/6) return $p + ($q - $p) * 6 * $t;
            if($t < 1/2) return $q;
            if($t < 2/3) return $p + ($q - $p) * (2/3 - $t) * 6;
            return $p;
        }
function hslToRgb($h, $s, $l){
    if($s == 0){
        $r = $l;
        $g = $l;
        $b = $l; // achromatic
    }else{
        $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
        $p = 2 * $l - $q;
        $r = hue2rgb($p, $q, $h + 1/3);
        $g = hue2rgb($p, $q, $h);
        $b = hue2rgb($p, $q, $h - 1/3);
    }

    return array(round($r * 255), round($g * 255), round($b * 255));
}

/* Uncomment to test * /
for ($i=0;$i<360;$i++) {
  $rgb=hslToRgb($i/360, 1, .9);
  echo '<div style="background-color:rgb(' .$rgb[0] . ', ' . $rgb[1] . ', ' . $rgb[2] . ');padding:2px;"></div>';
}
/* End Test */
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.