Математика преобразования 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