Математика преобразования HSL в RGB

При преобразовании из HSL в RGB математика кажется относительно простой, особенно при преобразовании оттенков серого, поскольку значения RGB — это яркость, умноженная на 255.

Однако возьми этот гекс #eeeeee, Это значение RGB rgb(238,238,238) и это представление HSL hsl(0.00, 0.00, 0.93),

Каждая ссылка на конверсию, которую я нашел, просто делает это:

// Hard coded values for brevity
$hue = 0.00;
$saturation = 0.00;
$lightness = 0.00;

if ($saturation == 0)
{
$red = $green = $blue = $lightness;
}
else
{
// Or run the math
}

$rgb = [round($red * 255), round($green * 255), round($blue * 255)];

В случае #eeeeee мы знаем следующее

$red = $green = $blue = 0.93;

И все значения RGB === 238.

Математика во всех конверсиях, которые я видел, не складывается.

0.93 * 255 = 237.15

(как примечание rgb(237,237,237) производит гекс #ededed)

После округления у нас остается 237. Таким образом, мы меняем результат, чтобы использовать ciel, Ну, это работает для этого случая, но нарушает много других преобразований.

В этом преобразовании есть шаг, который я пропускаю (и кажется, что это остальной мир). Кто-нибудь знает, как точно рассчитать значения RGB из HSL?

1

Решение

На основании комментария @Lithis сразу стало ясно, что проблема заключается в точности значений HSL. Как было указано в комментарии:

238 / 255 = 0.9333333 recurring

Увеличение точности с плавающей точкой в ​​преобразовании создает ожидаемые шестнадцатеричные коды. Так что вместо:

0.93 * 255 = 237.15

Мы работаем с

0.93333 * 255 = 237.99915

Что гораздо более приемлемый результат, чем 237.15

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector