Вопрос или проблема
Я нашел множество постов о цвете в терминалах bash – но мне было интересно, есть ли способ подробно распечатать цветовой код вместе с примером этого цвета в порядке оттенка.
Сейчас, если вы захотите напечатать сетку цветов в bash, вы получите что-то в роде:
Где это выглядит так:
- от черного к синему
- от самого темного синего к более светло синему
- чуть зеленоватый синий к еще более светло синему
… - с темно-красного к фиолетово-синему
… - с зеленого к светло-синему-голубому
- … и так далее
Как вы видите, кажется, что цвета перескакивают в порядке, и я это понимаю – используется метод генерации цветов на основе HEX (R,G,B), где идет проход по цветам 0-256 для каждой колонки.
Наверное, мой вопрос: есть ли библиотека или что-то, что может расположить цвета в порядке их появления по оттенку. Это значит, что идет от черного к белому и включает цвета так, как если бы она отображала спектр?
РЕДАКТИРОВАНИЕ:
Пример кода сетки цветов:
#!/bin/bash
function colorgrid()
{
end=250
for((red=0; red <= end; red+=75)); do
for((green=0; green <= end; green+=75)); do
for style in 0 "1;3"; do
for((blue=0; blue <= end; blue+=5)); do
printf "\e[$style;38;2;$red;$green;${blue}mH"
done
printf "\e[0m\n"
done
done
done
}
Я думаю, это то, что вы ищете:
#!/bin/bash
hsltorgb () {
local hue=$1
local light=$2
local c x m
read c x m < <(awk -v H="$hue" -v L="$light" '
function abs(v) { return (v < 0) ? -v : v } # Определить abs()
BEGIN {
C = (1 - abs(2*L/100 - 1)) * 1; # S=1 (полная насыщенность)
X = C * (1 - abs((H/60) % 2 - 1));
m = L/100 - C/2;
print C, X, m;
}'
)
local r=0 g=0 b=0
if (( hue < 60 )); then
r=$c; g=$x; b=0
elif (( hue < 120 )); then
r=$x; g=$c; b=0
elif (( hue < 180 )); then r=0;
g=$c; b=$x
elif (( hue < 240 )); then r=0;
g=$x; b=$c
elif (( hue < 300 )); then r=$x;
g=0; b=$c
else
r=$c; g=0; b=$x
fi
printf "%d;%d;%d" $(awk -v r=$r -v g=$g -v b=$b -v m=$m \
'BEGIN { printf "%d %d %d", (r+m)*255, (g+m)*255, (b+m)*255 }')
}
huegrid () {
local width=80 # Количество цветов в строке
local height=20 # Количество строк
for ((y=0; y<height; y++)); do
for ((x=0; x<width; x++)); do
hue=$((360 * x / width)) # Оттенок от 0 до 360
light=$((100 - (y * 100 / height))) # Яркость от 100% до 0%
rgb=$(hsltorgb "$hue" "$light")
printf "\033[48;2;%sm " "$rgb"
done
echo -e "\033[0m"
done
}
huegrid
Это работает, используя HSL для определения следующего цвета, так как это более линейное представление цветовой матрицы. Затем мы конвертируем HSL в RGB для отображения в терминале.
Высота и ширина могут быть изменены для получения большей или меньшей детализации в результирующей цветовой матрице.
Ответ или решение
Вопрос, касающийся отображения цветовых кодов в Bash-терминалах в порядке их оттенка, действительно актуален для многих IT-специалистов, стремящихся к более логичным и эстетически приятным визуализациям цветовой палитры. Традиционно при помощи стандартных инструментов Bash можно вывести на экран таблицу цветов, однако расположение цветов в таком выводе часто кажется хаотичным, переходящим от черного к синему, затем к более светлому синему и так далее, вместо плавного изменения через весь спектр оттенков.
Теория
Основная проблема заключается в использовании методологии RGB (Red, Green, Blue) для генерации цветов. В RGB палитре цвет определяется комбинацией трех базовых цветов, что не всегда дает интуитивное восприятие последовательности изменения оттенков. Это связано с тем, что изменение значений RGB не линейно отражает переходы оттенков, как например это делает цветовая модель HSL (Hue, Saturation, Lightness).
Цветовая модель HSL определяет цвет по его оттенку (Hue), насыщенности (Saturation) и светлоте (Lightness). Это более натуралистичный подход, который лучше подходит для восприятия человеком, позволяя восстанавливать последовательные изменения оттенка в более линейной форме. Основное преимущество—возможность управления оттенком отдельно от других характеристик цвета, что делает модель HSL предпочтительной для задач по запросу об организованном выводе цветокодов по оттенкам.
Пример
Чтобы трансформировать задачу генерации палитры цветов по оттенку, мы можем воспользоваться функцией преобразования из HSL в RGB и наложить ее на печать цвета в Bash. Рассмотрим следующее Bash-скрипт:
#!/bin/bash
hsltorgb () {
local hue=$1
local light=$2
local c x m
read c x m < <(awk -v H="$hue" -v L="$light" '
function abs(v) { return (v < 0) ? -v : v }
BEGIN {
C = (1 - abs(2*L/100 - 1)) * 1;
X = C * (1 - abs((H/60) % 2 - 1));
m = L/100 - C/2;
print C, X, m;
}'
)
local r=0 g=0 b=0
if (( hue < 60 )); then
r=$c; g=$x; b=0
elif (( hue < 120 )); then
r=$x; g=$c; b=0
elif (( hue < 180 )); then
r=0; g=$c; b=$x
elif (( hue < 240 )); then
r=0; g=$x; b=$c
elif (( hue < 300 )); then
r=$x; g=0; b=$c
else
r=$c; g=0; b=$x
fi
printf "%d;%d;%d" $(awk -v r=$r -v g=$g -v b=$b -v m=$m \
'BEGIN { printf "%d %d %d", (r+m)*255, (g+m)*255, (b+m)*255 }')
}
huegrid () {
local width=80
local height=20
for ((y=0; y<height; y++)); do
for ((x=0; x<width; x++)); do
hue=$((360 * x / width))
light=$((100 - (y * 100 / height)))
rgb=$(hsltorgb "$hue" "$light")
printf "\033[48;2;%sm " "$rgb"
done
echo -e "\033[0m"
done
}
huegrid
Применение
В этом сценарии мы определяем функцию hsltorgb
, которая преобразует значение оттенка (hue) и светлоты (lightness) в формат RGB, необходимый для терминалов. Затем эта функция используется в huegrid
для создания сетки цветов, где каждый цвет представлен в линейной последовательности изменения оттенков.
Таким образом, вы получите наиболее согласованно отсортированную палитру, которая поэтапно пройдет через весь диапазон цветов, что намного удобнее для оценки цветовых переходов и для разработки, где цветовая согласованность имеет значение, например в UI/UX дизайне.
Эффективность скрипта может быть варьирована изменением параметров width
и height
, которые контролируют детализацию и размер выводимой палитры соответственно.
Заключение
Таким образом, благодаря использованию модели HSL, реализованной в этом Bash-скрипте, можно создать логически упорядоченный вывод цветовой палитры по оттенку, что значительно улучшает восприятие и эстетику. Это решение будет полезным не только для программистов и дизайнеров, но и для всех, кто работает с визуализацией данных, требующих цветового кода.