Непрозрачный тон как шестнадцатеричное значение от значения rgba в Javascript - PullRequest
0 голосов
/ 14 мая 2019

Я хочу создать метод, который будет принимать значение rgba() и преобразовывать его в значение #hex, однако я не хочу, чтобы альфа-канал включался в оператор return. Это все же должно повлиять на результат.

Как пример:

  • Если бы я передал rgba(17, 160, 173, 1), я бы хотел #11a0ad (#rrggbb), а не #11a0adff (#rrggbbaa).
  • Если бы я передал rgba(17, 160, 173, 0.55), я бы хотел #7ccbd2 (#rrggbb), а не #11a0ad8c (#rrggbbaa).
// Examples
rgbaToHex(17, 160, 173, 1); // returns '#11a0ad'
rgbaToHex(17, 160, 173, 0.55); // returns '#7ccbd2'

По сути, я хочу исключить непрозрачность из моего возвращенного значения #hex, но непрозрачность исходного значения rgba() влияет на то, является ли возвращенное значение #hex оригинальным цветом или непрозрачным тоном оригинала. цвет (полученный из указанного альфа-канала).

Вот наглядный пример, который я извлек из графического интерфейса Sketch:

rgba to hex

Я подошел к решению этой проблемы, используя следующее уравнение:

// rgb(14, 14, 14) --> #0e0e0e
// rgba(14, 14, 14, 0.5)

  const colSpace = 255;

  const r = 14, g = 14, b = 14, a = 0.5;

  const rDiff = colSpace - r, // 241
        gDiff = colSpace - g, // 241
        bDiff = colSpace - b; // 241

  const opaqueR = Math.round(r + rDiff * a), // 135
        opaqueG = Math.round(g + gDiff * a), // 135
        opaqueB = Math.round(b + bDiff * a); // 135


  const opaqueRGB = `rgb(${opaqueR}, ${opaqueG}, ${opaqueB})`

  // rgb(135, 135, 135) --> #878787

GUI Sketch возвращает rgb(134, 134, 134) или #868686, когда вы передаете rgba(14, 14, 14, 0.5). Так что мое уравнение не так уж и далеко.

В приведенном выше уравнении берется разница между значениями цвета r, g и b и 255, затем умножается разница на альфа-канал.

Это уравнение хорошо работает, когда вы работаете в оттенках серого, а альфа-канал равен 50%. Но прерывается, когда вы передаете более сложное значение rgba() или другой альфа-канал.

Кто-нибудь решал эту проблему в Javascript раньше? Как я могу получить непрозрачный тон из значения rgba(), используя Javascript?

1 Ответ

0 голосов
/ 14 мая 2019

Вам нужна композиция из 2 цветов, поэтому используйте эту формулу:

const opaqueR = Math.round((1-a)*255+a*r)

И то же самое для других цветов. 255 здесь компонент background r, он будет работать с другими цветами bg.

...