Главная » Frontend » Как на javascript перевести цвет RGB в HEX и обратно?
2018/02/13Метки: , ,

Как на javascript перевести цвет RGB в HEX и обратно?

Во фронтенде иногда возникает необходимость конвертации цвета между форматами RGB/RGBA и HEX.

HEX — это сокращение от слова «hexadecimal», которое переводится на русский язык, как «шестнадцатеричный». Число в этом формате может занимать 16 бит (2 байта) памяти и записывается с помощью 16 символов: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, C, D, E, F.

RGB — это сокращение является краткой записью трех названий цветов палитры «red — green — blue» («красный — зеленый — синий»). Стандартный RGB формат может занимать 24 бита (3 байта) памяти. Для его записи используются те же символы, что и у чисел в HEX формате (кроме букв).

Приведем примеры готовых функций, которыми вы можете воспользоваться для выполнения перевода цвета из hex в rgb и наоборот.

RGB to HEX

Если значение передаётся отдельными компонентами, то есть в виде трёх чисел:

function componentToHex(c) {
    var hex = c.toString(16);
    return hex.length == 1 ? "0" + hex : hex;
}

function rgb2hex(r, g, b) {
    return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}

Более короткое решение с использованием побитового сдвига влево:

function rgb2hex(r, g, b) {
    return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

Если цвет в функцию будет передаваться в виде строки вида rgba(0, 255, 0, 0.5):

function rgb2hex(rgb) {
    var rgb = rgb.match(/^rgba?[\s+]?\([\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?,[\s+]?(\d+)[\s+]?/i);

    return (rgb && rgb.length === 4) ? "#" +
        ("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
        ("0" + parseInt(rgb[2],10).toString(16)).slice(-2) +
        ("0" + parseInt(rgb[3],10).toString(16)).slice(-2) : '';
};

Причём функция поддерживает цвет и без прозрачности, то есть без указания альфа-компоненты.

HEX to RGB

Значение передаётся в виде строки, например #00ff00, а результат в виде объекта с тремя компонентами:

function hex2rgb(c) {
    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(c);
    return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
    } : null;
}

Ещё один вариант с использованием побитового сдвига вправо:

function hex2rgb(c) {
    var bigint = parseInt(c.split('#')[1], 16);
    var r = (bigint >> 16) & 255;
    var g = (bigint >> 8) & 255;
    var b = bigint & 255;

    return 'rgb(' + r + ',' + g + ',' + b + ')';
}

Как видно, сделать конвертер rgb в hex совсем несложно.

Метки: Метки: , ,
Понравилась статья? — Ставь лайк!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

×
Новости и обзор новинок рынка строительной техники.
Подпишитесь на обновления нашей группы!