При преобразовании из 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?
На основании комментария @Lithis сразу стало ясно, что проблема заключается в точности значений HSL. Как было указано в комментарии:
238 / 255 = 0.9333333 recurring
Увеличение точности с плавающей точкой в преобразовании создает ожидаемые шестнадцатеричные коды. Так что вместо:
0.93 * 255 = 237.15
Мы работаем с
0.93333 * 255 = 237.99915
Что гораздо более приемлемый результат, чем 237.15
Других решений пока нет …