Основное назначение цветовой модели RGB (красный, зеленый, синий) - восприятие, представление и отображение изображений в электронных системах, таких как телевизоры и компьютеры.
HSL (Hue Saturation Lightness) - это альтернативная цветовая модель, разработанная в 1970-х годах исследователями компьютерной графики для более тесного соответствия с тем, как человеческое зрение воспринимает цветообразующие свойства
Вот вики-статьи для RGB и HSL . Обычно графические программы выполняют вычисления в HSL, а затем преобразовывают в предпочтительный формат для большинства экранов: RGB.
Задача состоит в том, чтобы написать функцию / программу, которая принимает HSL в качестве входа и выводит RGB.
Вы можете выбрать предпочтительное представление для ввода / вывода, если оно согласовано между ними.
Например, они могут быть массив / кортеж с 3 -х элементами или объект с 3 - мя свойств по имени h
, s
и l
, но я буду принимать другие умные варианты, как получение HSL в виде целого числа (потери точности) и вывод цветовых оттенков целого числа.
Можно предположить, что ввод безопасен по диапазону и формату, оба из которых вы можете решить. Я настоятельно рекомендую либо диапазоны 0-1 0-1 0-1
либо 0-360 0-100 0-100
для hsl, 0-1 0-1 0-1
либо 0-255 0-255 0-255
для rgb.
В каждом ответе требуется указать оба из вышеперечисленных и вносить различные варианты в свои ответы, если вы особенно ими гордитесь, даже если в них не меньше символов, чем в других ваших вариантах. Поместите самый маленький сверху.
Псевдо-тесты для 0-360 0-100 0-100
→0-255 0-255 0-255
h s l → r g b
0 0 0 → 0 0 0
90 56 17 → 43 68 19
202 19 39 → 81 104 118
72 55 26 → 88 103 30
Формулы для конвертации можно найти здесь :
Это хороший способ визуализации преобразования:
источник
H
от0-360
это[0,360)
, было бы лучше , как написано0-359
?a-b
нотации неверно само по себе при работе с нецелыми значениями, но я бы сказал, что можно сделать вопрос более читабельным. Если кто-то еще будет жаловаться, я переосмыслю это, так что спасибо за указание на это[0,360)
тогда :)Ответы:
JavaScript (ES6),
989594 байтаПринимает H в [0,360) и S / L в [0,1) . Выводит R , G и B как массив из 3-х чисел в [0,1) .
Контрольные примеры
Этот фрагмент преобразует результаты обратно в [0,255] .
Показать фрагмент кода
Как?
Код инициализации
Основной код
Перестановки (0, C, X)
Немного сложная часть заключается в создании правильной перестановки (0, C, X) в соответствии с углом компонента оттенка. Как показано на следующем рисунке, каждое значение столбца выбирается из одной и той же циклической последовательности периода 6 , начиная с разных смещений. В приведенном выше коде мы используем - ~ H вместо просто + H, потому что нам нужно привести H к целому числу. Отсюда смещения (5,3,1) вместо (0,4,2) .
источник
H
в[0,6)
и выводе в[0,1]
экономии некоторых байт?Mathematica, 155 байт
Попробуйте онлайн!
источник
Hue
HSB (AKA HSV) не HSL (см. рисунки 2a и 2b на связанной странице Википедии).RGBColor
существует, ноHSLColor
нет. > _>Python 2 , 32 байта
Попробуйте онлайн!
Эта функция фактически встроена в Python через
hls_to_rgb
внутреннюю частьcolorsys
библиотеки. Входные данные формата - это диапазон HLS 0-1 (вместо HSL оба являются общими аббревиатурами для одной и той же вещи (хотя HSL является более распространенным)). И мой выводит значения RGB в кортеже в диапазоне от 0 до 1.кредиты
Спасибо Джонатану Аллану за указание на то, что мне просто нужно его импортировать (а затем еще больше помочь мне уменьшить количество байтов).
источник
from colorsys import hls_to_rgb
с тех пор дает нам функцию, которую можно использовать повторно. Редактировать - сделать это 21 какfrom colorsys import*
.import colorsys
для 15!C ++,
228221 байт-7 байт благодаря Захари
Оба аргумента являются массивами, которые имеют минимальный размер 3 элемента (то есть
float hsl[3]
иint rgb[3]
Ладно. Теперь, как это работает? Что это за длинный массив?
Ну, это не длинный массив, это
int
массив. Шутка в сторону, массив показывает, на сколько позиций мы сдвигаем вправо CX и 0, когда мы хотим выбрать правильную перестановку, + 2. Помните, как выбираются R ', G' и B '?Допустим, у нас есть «нормальный» порядок, который {C, X, 0}
Теперь, когда выбрана первая перестановка (т. Е. {C, X, 0}), вам не нужно сдвигать, что в точности аналогично сдвигу вправо на 0. Таким образом, первые 3 элемента массива равны 0,0 и 0
Для второй перестановки ({X, C, 0}) нам нужно сдвинуть вправо C на 1, а сдвиг влево X на -1, поэтому четвертый, пятый и шестой элементы массива равны 1, -1 и 0
И так далее...
В случае 3-й и 4-й перестановок мне нужно сдвинуть влево 0 на 2, поэтому сдвиг вправо на -2. Поскольку существует более 2 отрицательных чисел, я скорее добавляю 2 к каждому элементу в массиве и вычитаю 2 во время выполнения (по соображениям игры в гольф, чтобы в массиве были только целые числа).
источник
Python 2 ,
119112 байтПопробуйте онлайн!
Принимает вход как
H=[0,6[, S=[0,1], L=[0,1]
источник
HTML + JavaScript (ES6), 8 + 88 = 96 байт
Вводит в виде угла и двух процентов. Я оцениваю фрагмент HTML
<p id=p>
и функцию стрелки JavaScript. Я не знаю, какие браузеры используют округления, поэтому мои ответы могут немного отличаться от ваших.источник
Swift 4, 218 байт
Принимает значения HSL в диапазоне [0,1] в качестве аргументов и возвращает массив, содержащий значения RGB в том же диапазоне:
Идея состоит в том, чтобы сначала преобразовать входные данные из HSL в HSB, а затем использовать конструктор HSB встроенного цветового объекта в Какао для получения значений RGB.
Версия UIKit точно такой же длины, так как единственными заменами являются:
Cocoa
→UIKit
NSColor
→UIColor
Ungolfed:
Следующий фрагмент кода может быть использована для тестирования, путем замены значения
h
,s
иl
:К сожалению, я не могу предоставить ссылку на онлайн-песочницу, поскольку все они работают на Linux, который не включает Какао.
источник
GLSL (GL_ES)
160 144 134131 байтОттенок находится в диапазоне 0-6 (сохраняет 3 байта)
Sat, light и rgb - 0-1.
Попробуйте это на книге шейдеров
Использовал инструмент выбора цвета на экране печати, чтобы проверить вывод, который был правильным,
за исключением небольшой ошибки на 202 19 39 → 81 104 118, которая давала 80 104 118
источник
R , 88 байт
Попробуйте онлайн!
Эта функция принимает в качестве входных данных значения H, S и L в качестве значений диапазона 0-1 и выводит значения RGB в виде значений диапазона 0-255. Он преобразует представление HSL в представление HSV, затем использует
hsv()
для преобразования представления HSV в цвет R (т. Е. Шестнадцатеричное представление - #rrggbb), а затем используетcol2rgb()
для преобразования цвета R в значения RGB.источник
Желе ,
3932 байта-1 благодаря caird coinheringaahing (
%2
простоḂ
)-1 и / или вдохновение для -4 благодаря caird coinheringaahing тоже!
Полная программа, принимающая три аргумента командной строки:
L
,H
,S
В диапазонах[0,1)
,[0,6)
и ,[0,1)
соответственно ,который печатает список, дающий формат RGB как
[R, G, B]
с каждым из трех значений в диапазоне[0,1]
Примечание:
H
можно также обернуть, как если[0,360)
быПопробуйте онлайн!
Как?
источник