এইচএসএল থেকে আরজিবি রঙ রূপান্তর [বন্ধ]


174

আমি এইচএসএল রঙের মধ্যে আরজিবিতে রূপান্তর করতে একটি জাভাস্ক্রিপ্ট / পিএইচপি অ্যালগরিদম খুঁজছি।

আমার কাছে মনে হয় এইচএসএল খুব বেশি ব্যবহৃত হয় না তাই কনভার্টারের সন্ধানে আমার খুব ভাগ্য হয় না।


2
সবেমাত্র লক্ষ্য করা গেছে যে কম.জেএসজে প্রকল্পের hsl_to_rgb সহ অনেকগুলি রঙের ম্যানিপুলেশন ফাংশন রয়েছে: github.com/cloudhead/less.js/blob/master/lib/less/funitions.js
dmkc

1
ব্রাউজারের দিক থেকে - d3.js এর জন্য ভাল এপিআই রয়েছে: github.com/mbostock/d3/wiki/ Version
matanster

চেকআউট দয়া করে js Please.HEX_to_HSV('#ffeb3b')
লেস

4
অ্যালগরিদম জিজ্ঞাসা করা সত্ত্বেও বিষয় হিসাবে চিহ্নিত হিসাবে চিহ্নিত করা হয়েছে, যা স্ট্যাকওভারফ্লো . com / help / on- topic এ স্পষ্টভাবে একটি 'অন টপিক' - কী দেয়?
লিজি

2
এটি আমি এই সাইটে দেখেছি সবচেয়ে খারাপ ভোট-থেকে-কাছাকাছি, এবং এটি অনেক কিছু বলছে! আমি পুনরায় খোলা প্রথম ভোট।
থিওডোর আর স্মিথ

উত্তর:


300

গ্যারি টান তার ব্লগে একটি জাভাস্ক্রিপ্ট সমাধান পোস্ট করেছেন (যা তিনি এখন অবজ্ঞিত mjijackson.com এর সাথে দায়ী, তবে এখানে সংরক্ষণাগারভুক্ত এবং মূল লেখকের একটি বক্তব্য রয়েছে বক্তব্য রয়েছে - ব্যবহারকারীর জন্য ধন্যবাদ 2441511)।

কোডটি নীচে পুনরায় পোস্ট করা হয়েছে:

এইচএসএল থেকে আরজিবি:

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

আরজিবি থেকে এইচএসএল:

/**
 * 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
মন্তব্যগুলি কীভাবে আমাকে ভেরিয়েবলের পরিসীমা বলে এবং আউটপুট হিসাবে কী আশা করতে পারে তা পছন্দ করি। পরিপাটি। ধন্যবাদ!
গ্লেনো

9
আমি এটি একটি প্রকল্পের জন্য ব্যবহার করার চেষ্টা করছি, তবে আমার ফলাফলগুলি কেবল গ্রেস্কেল হিসাবে প্রকাশিত হচ্ছে। এটি কি এইচএসএল এর সীমাবদ্ধতা <-> আরজিবি? উইকিপিডিয়া নিবন্ধটি মনে হয় যে সমস্ত 3 টি চ্যানেলে কেবলমাত্র একটি একক মান সেট করা আছে।
বিল

10
আমি উল্লেখ করতে চাই যে Math.roundস্কেলটির নিম্ন এবং উচ্চ প্রান্তে (0 এবং 255 এর মান) ছোট ছোট ভুল ব্যবহার করে । সীমার প্রান্তে থাকা মানগুলি তাদের মান পর্যন্ত পৌঁছানোর জন্য উপরে বা নীচে বৃত্তাকার হতে পারে, তবে মানগুলি কেবল 0 বা 255 পর্যন্ত গোল করা যেতে পারে This এর অর্থ হল মান এবং মান 0 এর 255 অবধি বিস্তৃত অন্যান্য মানের জন্য যারা অর্ধেক। এটির সমাধান করতে, পরিবর্তে এই সূত্র ব্যবহার করুন: min(floor(val*256),255)। এটি ম্যাপিংকে প্রায় নিখুঁত করে তোলে।
মার্কাস এরোনিয়াস

13
এছাড়াও, যদি আপনি গ্রেস্কেল মান পেয়ে থাকেন তবে এটি সম্ভবত ব্যবহৃত লাইনগুলির কারণে h + 1/3এবং h - 1/3। অনেক ভাষায়, এটি পূর্ণসংখ্যা বিভাগ ব্যবহার করে, যেখানে 1/3শূন্য। সঠিক ফলাফল পেতে, ব্যবহার ভাসা পরিবর্তে লিটারেল, অর্থাত্ .: h + 1.0/3.0
মার্কাস এরোনিয়াস

6
আরজিবি থেকে এইচএসএল ফাংশনটি কাজ করে না। এটি কাজ করছে না এর একটি উদাহরণ এখানে রয়েছে: jsfiddle.net/fs5L02k0/2 এবং এখানে ফাংশনটি রয়েছে, স্থির jsfiddle.net/t5nq6jjc/1 - সূত্রটি গৃহীত হয়েছে: nl.wikedia.org/wiki/…
হান্না

44

সবচেয়ে সহজতম উপায়, অজগরটি উদ্ধারের জন্য : ডি

colorsys.hls_to_rgb(h, l, s)

এইচএলএস স্থানাঙ্ক থেকে আরজিবি স্থানাঙ্কে রঙ রূপান্তর করুন।


6
পাইথনে এমন মানক মডিউল আছে বলে আমি বিশ্বাস করতে পারি না! এই সত্যিই আমাকে উদ্ধার। আমি ২ ঘন্টা ধরে উইকিপিডিয়ায় এইচএসএল প্রবেশের রূপান্তর অ্যালগরিদমের সাথে লড়াই করেছি। দেখে মনে হচ্ছে অ্যালগরিদম সঠিক আউটপুট পেতে পারে না।
রায়

2
রুবির সমতুল্য: রুবডোক.ইন.ফো / জেমস / রঙ / ১.৮ / রঙ / আরজিবি যেমনColor::HSL.new(40,50,60).to_rgb
xxjjnn

1
ব্রাউজারে রঙিন পিকার পেতে আমি ব্রাইথন ব্যবহার করি, এটি আমার প্রয়োজন মাত্র!
এভারটব্লু

23

মহাসেনের কোডটির জাভা বাস্তবায়ন

মনে রাখবেন যে সমস্ত পূর্ণসংখ্যাকে ভাসা হিসাবে ঘোষণা করা হয় (অর্থাত্ 1f) এবং অবশ্যই ভাসমান হওয়া উচিত, অন্যথায় আপনি ধূসর রঙ পছন্দ করবেন।

এইচএসএল থেকে আরজিবি

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

আরজিবি থেকে এইচএসএল

/**
 * 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
কামিল Kiełczewski

19

উইকিপিডিয়ায় এইচএসএল এবং এইচএসভির নিবন্ধটিতে কিছু সূত্র রয়েছে। গণনাগুলি কিছুটা জটিল, সুতরাং বিদ্যমান বাস্তবায়নগুলি একবার দেখে নেওয়া কার্যকর হতে পারে ।


1
+1 দুর্দান্ত উত্তর। লিঙ্কটি ঠিক আমি যা খুঁজছিলাম was গৃহীত উত্তরটি কেবল অজগরটির জন্য কার্যকর বলে মনে হয়।
আতুরস্যামস

এখানে উইকি চেয়ে সহজ আলগোরিদিম stackoverflow.com/a/54014428/860099
কামিল Kiełczewski

13

আপনি যদি এইচএসএল এবং আরজিবির জন্য সিএসএস শব্দার্থবিজ্ঞানের সাথে যথাযথভাবে সামঞ্জস্যপূর্ণ এমন কোনও কিছু সন্ধান করছেন তবে আপনি সিএসএস 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
কামিল Kiełczewski

7

সি # কোডটি মহসেনের উত্তর থেকে।

সি # তে মোহসেনের উত্তর থেকে কোডটি এখানে যদি অন্য কেউ চান তবে is দ্রষ্টব্য: Colorএকটি কাস্টম ক্লাস এবং Vector4ওপেনটকে থেকে। উভয়ই আপনার পছন্দসই অন্য কিছু দিয়ে প্রতিস্থাপন করা সহজ।

এইচএসএল টু আরজিবা

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

আরজিবা টু এইচএসএল

/// <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
কামিল Kiełczewski

7

ক্রিস এর সি # কোড পিএইচপি বাস্তবায়ন

এছাড়াও থেকে এখানে , খুব ভাল তা গণিত ব্যাখ্যা পারে।

এটি এইচএসএল (হিউ স্যাচুরেশন লাইটনেস) এ রূপান্তর করতে মূলত ফাংশনগুলির একটি গুচ্ছ

পরীক্ষিত এবং পিএইচপি 5.6.15 এ কাজ করছে

টিএল; ডিআর : পুরো কোডটি এখানে পেস্টবিনে পাওয়া যাবে


হেক্স থেকে এইচএসএল

ইনপুট: ফর্ম্যাটে হেক্স রঙ: [#] 0 এফ 4 বা [#] 00 এফ 44 (পাউন্ড সাইন optionচ্ছিক)
আউটপুট: ডিগ্রি, পার্সেন্ট, পার্সেন্টে এইচএসএল

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

আরজিবি থেকে এইচএসএল

ইনপুট: আরজিবি 0-255 পরিসীমা আউটপুট: এইচএসএল ডিগ্রি, পার্সেন্ট, পার্সেন্টে।

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

এইচএসএল (0-1 রেঞ্জ) থেকে ডিগ্রি, পার্সেন্ট, পার্সেন্ট ফর্ম্যাট

গণিতের গণনার জন্য, এইচএসএল 0-1 ব্যাপ্তিতে কাজ করা আরও সহজ তবে মানব পাঠযোগ্যতার জন্য এটি ডিগ্রি, পার্সেন্ট, পার্সেন্টে আরও সহজ। এই ফাংশনটি 0-1 রেঞ্জের মধ্যে এইচএসএল নেয় এবং শতাংশ, শতাংশ, ডিগ্রিতে এইচএসএল দেয়।

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

এইচএসএল (ডিগ্রি, শতাংশ, শতাংশ ফর্ম্যাট) 0-1-এর মধ্যে এইচএসএল থেকে

এই ফাংশনটি ডিগ্রি, পার্সেন্ট, পার্সেন্ট, এইচএসএলকে সহজ কম্পিউটিংয়ের জন্য 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;
}

এইচএসএল থেকে আরজিবি

ইনপুট: ডিগ্রি, শতাংশ, শতাংশ আউটপুট: ফর্ম্যাটে আরজিবি বিন্যাসে এইচএসএল 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;
}

হু টু আরজিবি

এই ফাংশনটিকে hslToRgb বলা হয় হিউকে পৃথক আরজিবি মানগুলিতে রূপান্তর করতে।

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

এইচএসএল থেকে হেক্স

ইনপুট: এইচএসএল ডিগ্রি ডিগ্রি, শতাংশ, পারসেন্ট আউটপুট: ফর্ম্যাটে হেক্স 00ff22 (কোনও পাউন্ড সাইন নেই)।

আরজিবিতে রূপান্তর করে, তারপরে পৃথকভাবে হেক্সে রূপান্তরিত করে।

/**
 * 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, আপনি আপনার পিএইচপি কোড আপডেট করতে চাইতে পারেন। কোডটিতে একটি বাগ ছিল। RgbToHsl এ () s = maxSub / (2 - maxSub)হওয়া উচিতs = maxSub / (2 - maxAdd)
লেক্স

@Lex এখানে এবং এখানে অনুসারে , আমার কোডটি আসলে সঠিক। আমি মনে করি আপনি এর if l < 0.5সাথে বিভ্রান্ত হবেন else। আপনি কি আপনার চিন্তাভাবনা ব্যাখ্যা করতে পারেন? মতামত দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ!
কুল্লব

1
দুঃখিত, আপনি ঠিক বলেছেন, কিন্তু এখনও অপারেশন ইস্যু একটি অর্ডার আছে। # এই Calc ব্যবহার HSL করার 8cd08c (2 - maxSub) = 1.7333333333333334যখন এটি দ্বিতীয় লিঙ্কে উদাহরণ হিসাবে হওয়া উচিত ( 2 - max - min ) = 0.6352941176470588। ব্যবহার করে 2 - maxAddআমাকে ফটোশপ আউটপুটের সাথে নিয়মিত ঘনিষ্ঠ করে তুললাম তাই আমি ধরে নিলাম এটি সঠিক ছিল।
লেেক্স

ওহ ঠিক আছে. যে ইশারা জন্য ধন্যবাদ! আমি এখন এটি স্থির। আশা করি এটি সহায়ক!
কুল্লব

এটি সত্যই সহায়ক, আমি এটিকে জেএস github.com/bambii7/glow- এ
লেক্স

6

এইভাবে আমি এটি করি যা মনে রাখা সহজ যেটি হ'ল আরজিবিকে তিন চক্রের তিন স্পিকার হিসাবে মনে করা উচিত, 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 

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত ... অনেক সহজ এবং আরও স্বজ্ঞাত! আপনি কি অ্যালগরিদম বিপরীত করতে পারেন?
জোয়েলফ্যান 6'16

@ জোয়েলফ্যান - এটি সহজ তবে সঠিক নয় । নেই কোন উপায় (শুধুমাত্র সঙ্গে বিশুদ্ধ মূলদ এক্সপ্রেশন জন্য +, -, *, এবং /তাদের সাহায্যে প্রকাশ করার - যেমন রঙ রূপান্তরের জন্য সংজ্ঞা দ্বারা ব্যবহৃত হয় -) sineএকই স্বাধীন (ইনপুট) ভেরিয়েবল সঙ্গে ফাংশন। তবুও এটি নীতিটি বোঝার জন্য দুর্দান্ত (তবে রূপান্তর সম্পাদনের জন্য নয় )।
মেরিয়ানড

এই সমাধানটির সাথে সমস্যাটি হ'ল অ্যাভারেজ সর্বদা সমান শূন্য: (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(কোস (-180/2) = কোস (90) = 0)। সুতরাং স্যাচুরেশনের জন্য গণনা ভুল এবং প্রকৃতপক্ষে স্যাচুরেশন এখানে আলোকরূপ হিসাবে কাজ করে।
কামিল কিয়েসজেউস্কি

এই সমাধান দ্বিতীয় সমস্যা @JoelFan যে আমরা এইচ 180 ডিগ্রী যোগ করার জন্য সঙ্গে "সামঞ্জস্যপূর্ণ" সংস্করণ আছে প্রয়োজন en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB কিন্তু এটা (টেস্ট কেস এইচ = 0 জন্য লাল রঙ) রঙের সংখ্যা নিয়ে এখনও সমস্যা রয়েছে - উপরের সমাধানে হলুদ, ম্যাজেন্টা এবং সায়ান বর্ণগুলি বাদ দেওয়া হয় এবং / অথবা ভুল উপায়ে ম্যাপ করা হয়। তুলনার সাথে জেএস ফ্রিডল রয়েছে
কামিল কিয়েসজেউস্কি

3

জিএলএসএল এ এখানে একটি দ্রুত, অতি-সহজ, শাখাবিহীন সংস্করণ:

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-03 ডিগ্রি সেট করে।

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

আমি এটি ব্র্যান্ডন ম্যাথিসের এইচএসএল পিকারের কাছ থেকে পেয়েছি উত্স কোড ।

এটি মূলত কফিস্ক্রিপ্টে লেখা হয়েছিল । আমি একটি অনলাইন রূপান্তরকারী ব্যবহার করে এটি জাভাস্ক্রিপ্টে রূপান্তরিত করেছিলাম এবং ব্যবহারকারীর ইনপুটটি বৈধ আরজিবি মান যাচাই করার প্রক্রিয়াটি বের করেছিলাম। এই উত্তরটি আমার ইউজকেসের জন্য কাজ করেছে, এই পোস্টে সর্বাধিক ভোট দেওয়া উত্তর হিসাবে আমি খুঁজে পেয়েছি যে কোনও বৈধ এইচএসএল মান উত্পাদন করে না।

দ্রষ্টব্য যে এটি অস্বচ্ছতা / স্বচ্ছতার প্রতিনিধিত্ব করে একটি hslaমান ফেরত দেয় a0সম্পূর্ণ স্বচ্ছ এবং 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];
}

আমি পাইথন পদ্ধতির ভিত্তি হিসাবে এটি ব্যবহার করেছি। ধন্যবাদ।
জয়জয় 123

পোস্টারটি জিজ্ঞাসা করে এটি আরজিবিতে এইচএসএল নয়
ব্রিক করুন

1

আপনার যখন আরজিবি থেকে এইচএসভি প্রয়োজন এবং তার বিপরীতে এর জন্য:

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

ইউনিটি 3 ডি সি # কোড থেকে মহসেনের উত্তর।

সি # তে মহসেনের উত্তর থেকে কোডটি এখানে নির্দিষ্টভাবে ইউনিটি 3 ডি এর জন্য লক্ষ্যযুক্ত করা হয়েছে। এটি উপরে আলেক থাইলেনিয়াসের দেওয়া সি # উত্তর থেকে অভিযোজিত হয়েছিল।

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

তাদের জন্য যারা বলেছিলেন যে গ্যারি ট্যান সমাধানটি আরজিবি থেকে এইচএসএল এবং ফিরে ভুলকে রূপান্তর করছে। কারণ তিনি তার কোডটিতে সংখ্যার ভগ্নাংশ রেখে গেছেন। আমি তার কোড (জাভাস্ক্রিপ্ট) সংশোধন করেছি। রাশিয়ান ল্যাঙ্গুয়েজে লিঙ্কের জন্য দুঃখিত, তবে ইংরেজিতে অনুপস্থিত - এইচএসএল-উইকি

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

একটি এইচএসএল | একটি রঙ মান, জাভাস্ক্রিপ্টে সেট করা হয়েছে, তাত্ক্ষণিকভাবে আরজিবিতে রূপান্তরিত হবে | এর পরে আপনাকে যা করতে হবে তা হ'ল গণনা শৈলীর মানটি অ্যাক্সেস করা is

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

সি ++ বাস্তবায়ন সম্ভবত @ মোহেন কোডের চেয়ে ভাল পারফরম্যান্স সহ। এটি হিউয়ের জন্য একটি [0-6] ব্যাপ্তি ব্যবহার করে, বিভাজন এবং 6 দ্বারা গুণকে এড়িয়ে চলেছে এবং এস এবং এল পরিসীমা [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

[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

@ মহসেনের কোডটির পিএইচপি বাস্তবায়ন (টেস্ট সহ!)

এটি পুনরায় পোস্ট করার জন্য দুঃখিত। তবে আমি সত্যিই অন্য কোনও বাস্তবায়ন দেখিনি যা আমার প্রয়োজন মানের দেয়।

/**
 * 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.