В обоих ответах здесь не упоминается Truecolor Поддержка ANSI для цвета 8 бит на канал. Это позволит получить цвет RGB, который изначально запросил OP.
Вместо ;5
используйте ;2
и укажите значения R, G и B (0–255) в следующих трех сегментах управления.
\x1b[38;2;40;177;249m
Чтобы проверить, поддерживает ли ваш терминал Truecolor:
printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"
На моей машине XTerm счастливо вывел правильный цвет; тем не менее, терминалы, созданные по образцу терминалов, предшествующих современному цвету RGB, как правило, не будут поддерживать истинный цвет — убедитесь, что вы знаете свою цель, прежде чем использовать этот конкретный вариант escape-кода.
Я также хотел бы отметить 38
и ;5
/;2
- Blue Ice упомянул, что 38
маршруты, а затем 5
изменения цвет. Это немного неправильно.
38
— это расширенный код цвета переднего плана xterm-256; 30
-37
— это просто 16-цветные коды переднего плана (с яркостью, контролируемой escape-кодом 1
в некоторых системах и предположительно поддерживаемыми 90
-97
нестандартными «яркими» кодами), которые поддерживаются всеми цветными терминалами, совместимыми с vt100/xterm. .
;2
и ;5
указывают формат цвета, в конечном итоге сообщая терминалу, сколько еще последовательностей нужно извлечь: ;5
указывает 8-битный формат (как упоминалось Blue Ice), требующий только еще 1 управляющий сегмент, и ;2
указывает полный 24-битный Формат RGB, требующий 3 сегментов управления.
Эти расширенные режимы технически «недокументированы» и полностью определяются реализацией. Насколько я знаю и могу исследовать, они не регулируются комитетом ANSI.
Для тех, кто так склонен, формат 5;
(256 цветов) начинается с 16 исходных цветов (как темных, так и светлых, то есть 30–37 и 90–97) в виде цветов 0–15.
Следующие 216 цветов (16-231) формируются значением RGB 3 бита на канал, смещенным на 16, упакованным в одно значение.
Последние 24 цвета (232-256) представляют собой оттенки серого, начиная с оттенка немного светлее черного и заканчивая оттенком немного темнее белого. Некоторые эмуляторы интерпретируют эти шаги как линейные приращения от (256 / 24
) на всех трех каналах, хотя я встречал некоторые эмуляторы, которые явно определяют эти значения.
Вот функция Javascript, которая выполняет такое преобразование, принимая во внимание все оттенки серого.
function rgbToAnsi256(r, g, b) {
// we use the extended greyscale palette here, with the exception of
// black and white. normal palette only has 4 greyscale shades.
if (r === g && g === b) {
if (r < 8) {
return 16;
}
if (r > 248) {
return 231;
}
return Math.round(((r - 8) / 247) * 24) + 232;
}
var ansi = 16
+ (36 * Math.round(r / 255 * 5))
+ (6 * Math.round(g / 255 * 5))
+ Math.round(b / 255 * 5);
return ansi;
}
Таким образом, вы можете рассчитать 256 цветов ANSI из начальных значений RGB, уменьшив их с 8 до 3 бит, чтобы сформировать закодированное значение 256, если вы хотите сделать это программно на терминалах, не поддерживающих Truecolor.
person
Qix - MONICA WAS MISTREATED
schedule
31.10.2014
\033[38;2;r;g;bm
), я не могу заставить его работать в моем gnome-терминале. - person t.pimentel   schedule 27.08.2014bash
. Управляющие последовательности ANSI интерпретируются вашим терминалом (gnome-terminal
,xterm
,konsole
и т. д.).bash
— это всего лишь оболочка (интерпретатор команд), запускаемая вашим терминалом. - person MestreLion   schedule 22.03.2015