Farbtastic konwertuje HSL z powrotem na RGB lub Hex

Edytuj: Rozwiązanie księgowania

Chciałem stworzyć próbki kolorów na podstawie koloru wybranego w Farbtastic. Wykonałem obliczenia na wartości HSL, ponieważ jest to łatwiejsze i daje lepsze wyniki.

Po uzyskaniu wartości HSL od Farbtastic dodałem jasność, aby stworzyć nowy kolor. Nowy kolor ma format HSL i muszę go przełączyć z powrotem na RGB lub Hex, aby go wyświetlić i zapisać do późniejszego wykorzystania. Niektóre przeglądarki wyświetlają HSL, ale nie wierzę, że zrobią to wszystkie przeglądarki mobilne itp.

Problem polegał na przekonwertowaniu zmiennej „newcolor” z powrotem na RGB lub Hex po zakończeniu obliczeń.

// collect parent ids for farb
$(".farbtastic").parent().each(writeColorpanel);

function writeColorpanel (i, elem) {
    var picker = $.farbtastic(elem);  //farb object
    picker.linkTo(onColorChange); //a farb function
}  

    function onColorChange(color) {

    // retrieve hsl value, do calculations and place in hidden input.
    var hslcolor = $.farbtastic('#example_colorpicker_picker').hsl;

    // brighten by 40%
    var brightness = 1.4 * (Math.round(hslcolor[2]*10000)/10000);
    if (brightness>1) { brightness = 1 };
    if (brightness<0) { brightness = 0; }

    // create the new brighter color
    var newcolor = hslcolor;
    newcolor[2]=brightness;

    //convert to rgb (safer than trusting all mobile browsers to display HSL)
    var rgb = hsl2rgb(newcolor);

    //apply the color to swatches
    var firstSwatch = $('#section-example_colorpicker').find('.square1');
    firstSwatch.css( {'background-color': color } );
    var secondSwatch = $('#section-example_colorpicker').find('.square2');
    secondSwatch.css('background-color', 'rgb('+rgb.r+','+rgb.g+','+rgb.b+')');

}

function hsl2rgb(hsl) {
    var h = hsl[0], s = hsl[1], l = hsl[2];
    var m1, m2, hue;
    var r, g, b
    h = (Math.round( 360*h )/1);
    if (s == 0)
        r = g = b = (l * 255);
    else {
        if (l <= 0.5)
            m2 = l * (s + 1);
        else
            m2 = l + s - l * s;
        m1 = l * 2 - m2;
        hue = h / 360;
        r = Math.round(HueToRgb(m1, m2, hue + 1/3));
        g = Math.round(HueToRgb(m1, m2, hue));
        b = Math.round(HueToRgb(m1, m2, hue - 1/3));
    }
    return {r: r, g: g, b: b};
}

function HueToRgb(m1, m2, hue) {
    var v;
    if (hue < 0)
        hue += 1;
    else if (hue > 1)
        hue -= 1;

    if (6 * hue < 1)
        v = m1 + (m2 - m1) * hue * 6;
    else if (2 * hue < 1)
        v = m2;
    else if (3 * hue < 2)
        v = m1 + (m2 - m1) * (2/3 - hue) * 6;
    else
        v = m1;

    return 255 * v;
}

Zauważ, że skrypt oznaczony jako odpowiedź działa dla wartości liczb całkowitych. Ponieważ Farb zwrócił wartości ułamkowe, dokonałem niewielkich zmian, opublikowanych powyżej.

Autorzy motywów Wordpress: Jeśli używaszOpcje ramowe dla Wordpress i chcesz użyć Farbtastic, abyś mógł używać wartości HSL, zobacz toWidelec Elihorna, który zawiera potrzebne pliki. W tym zestawie plików musiałem dodać „wp_enqueue_style („ farbtastic ”);” w wierszu, w którym umieściliśmy skrypt. Plik .JS dla farbtastic nie musi być dołączony, ponieważ WP już go posiada. Będziesz też musiał oczywiście zerknąć na Jquery, prawdopodobnie na początku funkcji.

W części 2 tego pytania (problem z duplikatami) zobacz:Zwraca różne wartości z wielokrotnie używanej funkcji

questionAnswers(2)

yourAnswerToTheQuestion