LINUX.ORG.RU

А что по Canvas и его цветовому пространству.

 , oklab,


0

1

Кастуется @Vit, т.к. он уже занимался таким 12 лет назад. ИИ-шка брешет и лизоблюдничает (ловил её на грубых ошибках в формулах 5 раз и совершенно не доверяю). Конкретный вопрос такой: мне надо перегнать цвета в Oklab в полярной форме и произвести там некоторые действия, затем вернуть обратно и отрендерить в canvas. Сейчас цвета лежат в .css. Есть статьи раз (bottosson.github.io) и два (bottosson.github.io). Правильно ли я понимаю, что мне достаточно убрать # перед цветом, разобрать число на 3 пары по 2 символа, для каждого компонента применить функцию f из статьи два, затем применит функцию linear_srgb_to_oklab из статьи один и перевести в полярные координаты применив классические формулы, затем провести свои трансформации и, вернуться обратно в прямоугольные координаты, применить oklab_to_linear_srgb из статьи 1 и затем f_inv из статьи 2. Вернуть # и всё правильно посчитано будет. Я просто уже туплю и не хочу ошибиться.

★★★★★

Я не разбираюсь в JS, но несколько разбираюсь в цветовых пространствах и вебе. Поэтому я напишу несколько обобщенно.

Во-первых, стоит понимать, что в вебе цвет в hex может быть записан в трёх форматах: #rgb (тремя символами), #rrggbb (6 символов) и #rrggbbaa (8 символов, где последняя пара отвечает за альфа-канал — прозрачность). Также в принципе в качестве значения тебе могут передать строку любую строку по типу #zwzwzw, поэтому по-хорошему нужно валидировать значение — что это действительно валидный цвет в hex’е.

Сами по себе значения цветов в hex находятся в пределах пространства sRGB (нелинейный), но вот сам hex нужно перевести в RGB через функцию в условный массив из трёх значений для дальнейшей работы. Функции f_inv во втором доке ожидает что у тебя сегменты R,G,B будут в пределах от 0.0 до 1.0, грубо говоря.

В целом более корректный алгоритм примерно таков относительно этих двух статей:

  1. Получаем цвет в hex’е;
  2. Валидируем что это hex значение;
  3. Переводим hex в RGB пространство;
  4. Превращением в linear_srgb (функция f_inv);
  5. Перевод значений через linear_srgb_to_oklab;
  6. Манипуляции в oklab;
  7. Обратный перевод через oklab_to_linear_srgb;
  8. Конвертацию в non-linear sRGB (функция f);
  9. (?) clamp;
  10. Перевод в hex значение.

В данном случае у автора функции идут в обратном порядке (касательно понимания в шапке):

  • f_inv — переводит обычный sRGB -> linear.
  • f — переводит linear в sRGB.

Я немного плаваю в дальнейшем, но тут есть ещё один момент. В теории на выходе (перед обратным преобразованием в hex) может возвращаться «невалидный» RGB (за пределами диапазона по типу 0.0-1.0). Из-за этого он может неправильно отображается в местах, которые ожидают от тебя обычный sRGB, говоря просто.

Решением для этого в ряде библиотек (по работе с цветами) выступает использование clamp, который специально ограничивает диапазон значений. Пример реализации clamp можно посмотреть тут (там где clamp helper идёт): https://en.wikipedia.org/wiki/Module:LuminanceChroma_to_sRGB Clamp может выдавать тоже неидеальный результат (именно в плане смещения цвета, из-за сжатия диапазона), но он страхует от нежелательно поведения в ряде случаев.

p.s. Можно конечно написать всё это самому, используя нужные формулы и преобразования, но можно подумать о какой-то профильной библиотеке.

Ogden
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария