Farbtastic преобразует HSL обратно в RGB или Hex

Изменить: решение для публикации

Я хотел создать образцы цветов на основе цвета, выбранного в Farbtastic. Я сделал свои расчеты по значению HSL, потому что это проще и дает лучшие результаты.

Получив значение HSL от Farbtastic, я добавил яркости, чтобы создать новый цвет. Новый цвет находится в формате HSL, и мне нужно переключить его обратно на RGB или Hex, чтобы отобразить его и сохранить для последующего использования. Некоторые браузеры отображают HSL, но я не верю, что все мобильные браузеры и т. д. будут это делать.

Проблема заключалась в том, чтобы преобразовать переменную 'newcolor' обратно в RGB или Hex после завершения вычисления.

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

Обратите внимание, что скрипт, помеченный как ответ, работает для целых чисел. Поскольку Фарб возвращал дробные значения, я внес небольшие правки, опубликованные выше.

Авторы тем Wordpress: если вы используете тему Options Framework для Wordpress и хотите использовать Farbtastic поэтому вы можете использовать значения HSL, см. этот форк от Elihorn, который содержит нужные вам файлы. В этом наборе файлов мне нужно было добавить "wp_enqueue_style('farbtastic');" в строке, где мы поставили скрипт в очередь. Файл .JS для farbtastic не нужно включать, потому что он уже есть в WP. Вам также нужно поставить Jquery в очередь, конечно, вероятно, в верхней части functions.php.

Для части 2 этого вопроса (проблема с дубликатами) см.: значения из функции, используемые несколько раз


person Jennifer Michelle    schedule 03.08.2012    source источник


Ответы (2)


Я решил разделить функции и немного переписать их, чтобы они работали правильно.
В итоге получилось так:

function hsl2rgb(h, s, l) {
    var m1, m2, hue;
    var r, g, b
    s /=100;
    l /= 100;
    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;
}

Он вызывается, делая:

//the HSL values to use
var h = 30;
var s = 20;
var l = 70;

//call the function into a variable, returns an object rgb = {r:163, g:174, b:196}
var rgb = hsl2rgb(h, s, l);

//can now be accessed with rgb.r etc, and remember that the last two are percentages

Вот ДЕМОНСТРАЦИЯ

Если ваша переменная newcolor является строкой, вам нужно будет сделать:

var colorArray = newcolor.split(','),
    h = colorArray[0],  //  0.10434092941291336
    s = colorArray[1],  //  1
    l = colorArray[2];  //  0.756

чтобы получить значения HSL в правильные переменные.

person adeneo    schedule 03.08.2012
comment
Спасибо Аденео, попробую! Дело может быть в веревке. Два дня на этом пока, eep. - person Jennifer Michelle; 04.08.2012
comment
Может ли он работать с такими числами, как: var h = 0,09888999543019379, s = 0,8260000610351563, l = 0,8119999999999999 ? Что изменить, чтобы получить правильный оттенок? - person Jennifer Michelle; 04.08.2012
comment
Это должно работать с этими значениями, но я думаю, что это дало бы вам что-то очень близкое к черному? - person adeneo; 04.08.2012
comment
Да, но я хотел сказать, что Farbtastic возвращает проценты в виде дробных значений. Таким образом, яркость 0,5 равна вашим 50. Я немного зациклился на оттенке. Я думаю, что смогу решить ее, когда буду меньше уставать... может быть. Я думаю, вы дали мне инструменты, которые мне нужны, чтобы закончить это. :) - person Jennifer Michelle; 04.08.2012
comment
Сделаны мелкие правки и опубликовано решение. Отличная работа по ремонту этого Adeneo, большое спасибо. - person Jennifer Michelle; 04.08.2012

У Майкла Джексона это преобразование, наряду с другими преобразованиями цветов, в JavaScript, на его сайт.

function hslToRgb(h, s, l) {
    var r, g, b;

    if (s == 0) {
        r = g = b = l; // achromatic
    } else {
        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 [r * 255, g * 255, b * 255];
}
person dommer    schedule 03.08.2012
comment
Я также пробовал это, но я не знаю, что написать в первой функции для ее вызова. Я думал, что в Farbtastic будет встроенная функция. - person Jennifer Michelle; 04.08.2012
comment
Я считаю, что Майкл Джексон мертв, поэтому я действительно не думаю, что у него больше что-то есть, и шутить о его цвете кожи после его смерти нехорошо. В любом случае, я добавил код к вашему ответу, так как мы действительно не знаем, как долго этот сайт будет работать после его ухода. Игра слов (конечно), я знаю, что это не тот чувак, +1 за то, что нашел функцию, которая должна работать. - person adeneo; 04.08.2012
comment
newcolor = hslToRgb(newcolor) Просто возвращает NaN. Выходное текстовое поле отлично отображает новый цвет, так что это не должно быть проблемой. Аналогичная функция есть в Farbtastic, но я тоже не могу понять, как ее вызвать. - person Jennifer Michelle; 04.08.2012
comment
Текстовое поле для отображения нового цвета показывает 0,10434092941291336,1,0,756. Если я вставляю это число, то функция hslToRgb работает, но когда я ввожу переменную newcolor, она перестает работать. - person Jennifer Michelle; 04.08.2012