У меня есть код, который преобразует значения RGB в значения HSL, а также HSL в RGB.
Это работает нормально, однако, у меня есть палитра цветов, которая может работать в RGB или HSL.
Проблема в том, что они оба используют целочисленные значения ..
Поэтому, если я конвертирую RGB в HSL, я получаю дроби, которые нужно округлить. Когда я конвертирую обратно в RGB, значения не совпадают с прежними — число обычно равно единице (значение 123 может стать 124 после перехода RGB> HSL> RGB).
Я нахожу это странным, потому что в Photoshop они имеют одинаковый палитр цветов — вы можете выбирать между RGB и HSB, и когда вы конвертируете назад и вперед, значения RGB остаются согласованными, и они используют целочисленные значения, когда вы выбираете в обоих режимах.
Как они этого добиваются?
Цветовые пространства не имеют одинакового размера для целых значений.
HSL имеет черный (ноль яркости), плюс белый (яркость 100), а также 359 * 100 * 98 других цветов (поскольку ноль оттенка такой же, как и оттенок 360), что составляет 3 518 202 целых тройных числа.
RGB имеет 256 * 256 * 256 или 16 777 216 целочисленных троек, поэтому несколько значений RGB могут отображаться на одно и то же значение HSL — в соотношении от 4,7 до 1.
Для обеспечения согласованности при смене режимов выбора вам может потребоваться сохранить значения HSL как значения с плавающей запятой внутри, но показать целочисленные значения в средстве выбора. Поддержание значений RGB как плавающей запятой внутри может также помочь.
Еще одна проблема, которую я видел в цветном программном обеспечении, заключается в круглый Значения RGB, полученные из преобразования HSL в RGB к ближайшему целому числу в диапазоне от 0 до 255. Я считаю это проблематичным, поскольку это означает, что значения rgb от 1 до 254 содержат 1/255-ю часть диапазона, а ноль и 255 — только половину 1 /. 255-й диапазон каждый. Альтернативой, которую я предпочел, было сопоставление значений компонента RGB с плавающей запятой от 256 до 255 (или 255,9999, если хотите) и получение целого числа результирующего компонента цвета. Таким образом, целочисленные значения компонентов от 0 до 255 получают (1/256) -й диапазон каждого.
В конце концов, если вы хотите, чтобы пользователи могли вводить значение HSL, которое они использовали ранее, и получать точно такой же цвет, вам нужно разрешить значения HSL с десятичными знаками.
Других решений пока нет …