Gradient Colors in der Windows Konsole benutzen?
In folgendem Video bei 3:25 - 3:50 kann man sehen wie die Konsole Texte in Gradient Colors / Verlaufsfarben ausspuckt.
https://youtu.be/xBlYvX2Ff-s?t=205
Da ich dies selbst gerne in meinem Batch Skript / generell in meiner CMD haben / nutzen will frage ich mich wie die das gemacht haben. Hab selbst etwas recherchiert und ein paar dinge gefunden.
Das:
https://github.com/bokub/gradient-string
Und das:
https://devblogs.microsoft.com/commandline/24-bit-color-in-the-windows-console/
Mehr konnte ich darüber leider nicht in erfahrung bringen.
1 Antwort
Das ist nicht wirklich Gradientcolor, sondern Text Zeichen in verschiedenen Farben (geschickt angeordnet.
Die Console ist nicht wirklich dafür gemacht für bunten Farbenzauber. (was nicht bedeutet, das es nicht geht)
Die Nummer mit dem farbigen Zeichen gabs schon, als noch niemand an Windows oder Linux dachte. Farbige textbasierte Benutzeroberflächen für Dos wurden mit hilfe von ANSI-Escapesequenzen erstellt. (zB. der Norton-Commander 2.0)
Ansi-Escapesequenzen in Batch oder anderen Scriptsprachen waren auf Grund der Gefährlichkeit vieler Sequenzen fast 30 Jahre ins Abseits geraden..
Erst ab Win 10 wurde eine "sichere" Teminalemulation vorsichtig in Consolen integriert. (ab 1903 offiziell standardverhalten)
- https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797
- https://de.wikipedia.org/wiki/ANSI-Escapesequenz
- https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences
In Batch ist das Ganze etwas Tricky zu handhaben, da Batch nicht wirklich Zugang zu ASCII-Zeichen unterhalb 20hex (Leerzeichen) hat. ESC liegt mit 1Bhex unter 20.
Du kannst zwar folgende Zeile in eine Batch kopieren und dort ausführen...
rem tiefblauer Hintergrund
echo [48;5;18m Test
...mit etwas Glück kappiert Dein Editor das das Zeichen hinter obigem kleinen Fragezeichen der ESC-Char ist. In die Console kopieren geht jedoch nicht, da ESC auch bis zum Zeilenbegin löscht.
Wie auch immer als Batchprogrammierer muss man zaubern können:
SimpleColoringDemo.cmd
@echo off
chcp 65001 >nul &rem UTF8 codepage aktivieren (Umlaute anzeigen)
mode 128,50 &rem Fenstergröße
rem erzeuge Escape-Chararakter %ESC%
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
color 05
echo Ich bin normal über den "Color 05" -Befehl gefärbt...
rem setze 265Farben-Hintergrund und Lösche die Zeile auf 128 Zeichn Breite
echo %ESC%[48;5;18m%ESC%[128@Jetzt hatt das Farbfeld eine feste Breite
echo %ESC%[128@..Weiter...
echo %ESC%[128@..Weiter...
echo %ESC%[128@..Weiter...
rem die Farbwerte findest Du unter https://docs.microsoft.com/de-de/windows/console/console-virtual-terminal-sequences#text-formatting
rem vordrgrundFarbe auf LeuchtendGrün schalten
echo %ESC%[128@%ESC%[92mHallo ich wurde mit "%%ESC%%[92m" gefärbt...
rem Hintergrund mit dem 256Farben Befehl setzen
echo %ESC%[128@%ESC%[48;5;202mJetz ist auch noc ein 256Color-Palette Hintergrund hinzugekommen Sequenz:(%%ESC%%[48;5;202m)...
rem setze RGB-Hintergrund und RGB-Vordergrund
echo %ESC%[48;2;80;0;40m%ESC%[38;2;128;255;0mIch bin mit RGB-Sequenzen gefärbt
rem unterstreichen...
echo %ESC%[4mJetzt bin ich auch noch Unterstrichen.
echo:
echo %ESC%[7mund Negativ.
echo %ESC%[27mwieder Positv.
rem Neue Farben , Lösche vor dem Schreiben die zeiel auf 80 Zeichen Breite
echo %ESC%[48;2;40;0;0m%ESC%[38;2;0;255;255m
echo %ESC%[48;2;40;0;0m%ESC%[38;2;0;255;255m%ESC%[24mandere RGBFarben und Unterstreichung aus...
echo schluss mit dem Zauber ...%ESC%[0mab hier ist Alles wieder Normal
pause
AnsiColorDemo.cmd
@echo off
setlocal enableDelayedExpansion
chcp 65001 >nul & rem Umlaute anzeigen
mode 150,20
rem teste ob unter Win 10 (ab 1903) die neuen Consolfunktionen eingeschalten sind...
for /f "tokens=3 delims=." %%a in ('ver') do (
if %%a geq 18362 (reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD 0x0">nul && (
echo Neue Consolenfunktionen sind ausgeschaltet!) || goto :init
) else ( echo Benötige Windows 10 ab Version 1903)
)
timeout 3 >nul
exit /b
:init
rem erzeuge Escape-Char
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
set "saveCursorPos=%ESC%7"
set "loadCursorPos=%ESC%8"
set "CursOff=%ESC%[?25l"
set "CursOn=%ESC%[?25h"
:: Ende Vorbereitung
color 1f
echo 16 Colors
echo %saveCursorPos%
for /l %%a in (0,1,15) do (
rem Leerzeichen voranstellen
set "__num= %%a"
set "__num=!__num:~-4!"
echo %loadCursorPos%%ESC%[48;5;%%am!__num!%saveCursorPos%
)
echo %ESC%[44m6x6x6 Farbraum
rem Cursorposition ist noch immer am Ende der vorangehenden Schleife gespeichert!
rem Der Cursor befindet jedoch woanders... Diese Position für den Begin der neuen Schleife speichern.
rem !!! Die Cursorposition wird gespeichet bevor der Zeilenvorschub von echo ausgeführt wird!!!! (dieser --und alles Folgende-- wird von %loadCursor% Nichtig gemacht)
echo %saveCursorPos%
for /l %%r in (15,36,225) do (
for /l %%c in (1,1,36) do (
set /a "__num=%%r+%%c"
set "__numstr= !__num!"
echo %loadCursorPos%%ESC%[48;5;!__num!m!__numstr:~-4!%saveCursorPos%
)
echo %saveCursorPos%
)
echo %ESC%[1A%ESC%[44m24 Graustufen
echo %saveCursorPos%
for /l %%a in (232,1,255) do (
set "__num= %%a"
set "__num=!__num:~-4!"
echo %loadCursorPos%%ESC%[48;5;%%am!__num!%saveCursorPos%
)
echo %ESC%[44mRegenbogen
echo %saveCursorPos%
for /l %%a in (16,36,196) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (202,6,226) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (190,-36,46) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for /l %%a in (41,-5,21) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
for %%a in (20,55,53,16) do (echo %loadCursorPos%%ESC%[48;5;%%am %saveCursorPos%)
echo:
pause
exit /b
regenbogenPrompt.cmd
@echo off
rem prüfe ob Escape-Sequenzen erlaubt sind (Windows 10)
reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD 0x0">nul && (
echo Sorry ANSI-Escapesequenzen sind fur diese Console deaktiviert.
timeout 5 >nul
exit /b
)
rem Farbtabelle für Regenbogen erzeugen
set "colorTable=52,88,124,160,196,202,208,214,220,226,190,154,118,82,46,41,36,31,26,21,20,55,53"
set "fGroundClr=38"
set "bGroundClr=48"
set "__cIndex=0"
for %%a in (%colorTable%) do (
call set "cTable%%__cIndex%%=$e[%fGroundClr%;5;%%am"
set /a "__cIndex+=1"
)
set "string=cooler(&|<>) 10$$-RegenbogenPrompt $p"
set "string=Erzesels cooler 10$$-RegenbogenPrompt $p"
set "__strIndex=0"
set "lastColorIndex=-1"
::set "newPrompt=$e[7m"
:loop
call set "Char=%char%%%string:~%__strIndex%,1%%"
set /a "__strIndex+=1"
if "%char%"=="$" goto :loop
rem Tricky: $_=Linefeed braucht keine Farbe!
rem das Farbattribut wird jedoch vor jedes Zeichen/Platzhalter gesetzt und hochgezählt
rem erst vor dem Zeichen nach dem $_ ist ein Farbattribut nötig
rem deshalb -2 (...+1 = für $_ =-1 und +1 für das nächste Zeichen =0)
if "%char%"=="$_" set "lastColorIndex=-2"
if "%char%"=="" goto :raus
set /a "lastColorIndex+=1 , __dummy=lastColorIndex %% __cIndex"
call set "newPrompt=%newPrompt%%%cTable%__dummy%%%%char%"
set "Char="
goto loop
:raus
rem tausche Sonderzeichen gegen Prompt-Token
for %%a in ("&=$a","|=$b","(=$c",")=$f","<=$l",">=$g") do call set "newPrompt=%%newPrompt:%%~a%%"
set "fPrompt=prompt %newPrompt%$e[0m$g"
set "bPrompt=prompt $e[30m%newPrompt:$e[38;5;=$e[48;5;%$e[0m$g"
echo %bPrompt%|clip
title BPrompt
start "" /b cmd /k "%bPrompt%"
start "FPrompt" cmd /k "%fPrompt%"
gostTyper.cmd
@echo off
chcp 65001 >nul
setlocal enableDelayedExpansion
call :initAnsi
call :initMacro
rem Farbtabelle für den Regenbogen definieren
set "Regenbogen=,52,88,124,160,196,202,208,214,220,226,190,154,118,82,46,41,36,31,26,21,20,55,53,"
rem Regenbogen Spiegeln (letzte Farbe zuerst) (auch Variablennamen unterliegen der Kreativität XD)
for %%a in (%Regenbogen%) do (set "negobnegeR=,%%a!negobnegeR!")
rem mach nen Schmetteling draus
set "RegenbogenBfly=%Regenbogen%%negobnegeR%"
set "ShadesOfGray=237 238 239 240 241 242 243 244 245 246 247 248 249"
for %%a in (%ShadesOfGray%) do (set "notShadesOfGray=,%%a!notShadesOfGray%!")
rem mach nen Schmetteling draus
set "SoGrayBfly=%ShadesOfGray%%notShadesOfGray%"
set "NightBlue=17"
set "OrangeWave=202 208 214 220 214 208"
rem initilisiere für die angegebene Farbtabelle jeweils ein Array mit den Escape seqenzen für
rem Hintergrund Fabtabelle.B und Vordergrund Fabtabelle.F
for %%a in (RegenbogenBfly , ShadesOfGray , SoGrayBfly , NightBlue , OrangeWave) do ( call :initANSI_ColorArray %%~a)
)
rem Aufruf: verzögerung FarbeTabelleB/F ode =für Default "Text "
%#__gostType% 0 NightBlue.B ".so geht man mit ""Gänsefüßchen"" & $$ um und ..."
%#__gostType% 0 NightBlue.B "... so macht man ein Ausrufezeichen $x ....."
%#__gostType% 0 NightBlue.B """..?.+.*.~.§.@.µ.€.|.<.>.&.=.$p.$x.$$..........."""
%#__gostType% 2000 OrangeWave.F "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 OrangeWave.b "...$$x=$x.,.$$p=$p.,.$$$=$$.,.""""="".................."
%#__gostType% 2000 = "......................I......................."
%#__gostType% 2000 = "....................like......................"
%#__gostType% 2000 = "..................Scripting. ................."
%#__gostType% 0 RegenbogenBfly.B "......................I......................."
%#__gostType% 1000 RegenbogenBfly.B "....................like......................"
%#__gostType% 4000 RegenbogenBfly.B "..............Background Colors..............."
%#__gostType% 8000 SoGrayBfly.B ".............. some Gray ..............."
%#__gostType% 2000 RegenbogenBfly.F "......................I......................."
%#__gostType% 2000 RegenbogenBfly.F "....................like......................"
%#__gostType% 2000 RegenbogenBfly.F "..............Foreground Colors..............."
%#__gostType% 20000 ShadesOfGray.F ".............. more Gray ..............."
echo ende...
pause
exit /b
:::::: Helper Routines ::::::
:initANSI_ColorArray %1 VarName Colortable
set ".cIndex=0"
for %%a in (!%1!) do (
rem Arrays mit Farbsequenzen anlegen BackGround und ForeGround
set "CArray.%1.F.!.cIndex!=%ESC%[38;5;%%am"
set "CArray.%1.B.!.cIndex!=%ESC%[48;5;%%am"
set /a ".cIndex+=1"
)
set "%1.F.cIndex=%.cIndex%"
set "%1.B.cIndex=%.cIndex%"
exit /b
:initMacro
rem als estes wird der else-Zweig aufgelöst beim aufruf des Macros folgen die Argumente dem set argv=
rem im zweiten Schritt wird argv aufgelöst und die belegten Variablen getunnelt (wegen evt Sonderzeichen)
set #__gostType=for %%. in (1 2) do^
if %%.==2 (^
for /f "tokens=1,2*" %%a in ("^!argv^!") do (^
set __StringToSplit=%%~c^&^
call :draw __StringToSplit %%~a %%~b^
)^
) else set argv=
exit /b
:initAnsi
rem prüfe ob Escape-Sequenzen erlaubt sind (Windows 10 v1903)
rem nur der !!!DWord!!!-Wert ForceV2=0 deaktiviert, alles andere erlaubt Escapesequenzen (ansonsten scheinen ANSISequenzen inzwischen by default unterstützt zu werden)
for /f "tokens=3 delims=." %%a in ('ver') do (
if %%a geq 18362 (reg query "HKCU\Console" /v "ForceV2"|find "REG_DWORD 0x0">nul && (
echo Neue Consolenfunktionen sind ausgeschaltet!) || goto :initAnsiVars
) else ( echo Benötige Windows 10 ab Version 1903)
)
timeout 5 >nul
exit /b
)
:initAnsiVars
rem erzeuge ESC-Zeichen (ASCII 27)
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
rem Cursormacros:
set "saveCursorPos=%ESC%7"
set "loadCursorPos=%ESC%8"
set "CursOff=%ESC%[?25l"
set "CursOn=%ESC%[?25h"
set "resetColor=%ESC%[0m"
rem Cursor unsichtbar machen
echo %saveCursorPos%%CursOff%
exit /b
:::::: subroutines :::::
:draw
set "lastColorIndex=-1
set "%~1=!%~1:""="!"
rem Stringlänge-1 ermitteln
@(echo !%~1!)>"%temp%\%~n0.len"
for %%a in ("%temp%\%~n0.len?") do set /a "%~1.maxIndex=%%~za-3"
for /l %%. in (0,1,!%~1.maxIndex!) do (
set Char=!char!!%~1:~%%.,1!
rem kommt ein Platzhalter:
if "!char!" neq "$" (
rem für ein Ausrufezeichen?
if /i "!char!"=="$X" set "char=^!"
if /i "!char!"=="$P" set "char=%%"
if "!char!"=="$$" set "char=$"
set /a "lastColorIndex+=1 , __cNr=lastColorIndex %% %3.cIndex" 2>nul
rem Fabnummer in den als Laufvariable in den Arrayindex mogeln... (!array!index !! geht nicht)
for %%. in ("!__cNr!") do (
echo:%loadCursorPos%!CArray.%~3.%%~.!!char!%saveCursorPos%
)
rem Bremsschleife
for /l %%. in (1,1,%~2) do (call)
set "char="
)
)
echo:%resetColor%%saveCursorPos%
exit /b
@echo off
chcp 65001 >nul
for /f %%. in ('"echo prompt $E|cmd"') do set "ESC=%%."
echo:
rem setze RGB-Farben, ist für Violet-übergänge besser geeignet da in diesem Bereich die 6x6x6-Palette nich genug Abstufungen bietet
rem der Rest ist etwas probieren für den Start Rot und Blau auf 128 (halbe Leuchtkraft)
rem Rot in jeder Zeile einigermaßen gleichmäßig bis Zielwert reduzieren
echo %ESC%[38;2;128;0;128m ███ ████ ███ ███ ███ █████ █
echo %ESC%[38;2;105;0;128m█ █ █ █ █ █ █ ██ █ █ ████
echo %ESC%[38;2;80;0;128m█████ ███ █ █ █ █ ████ ██ █
echo %ESC%[38;2;55;0;128m█ █ █ █ █ █ █ █ █ █ █
echo %ESC%[38;2;30;0;128m█ █ ████ ███ ███ ███ █ ███ █ █ ██ %ESC%[0m &rem Farben zurücksetzten
Vielen dank für die Antwort, aber ich verstehe immer noch nicht ganz wie ich den jetzt das mit dem "Hunt Redeemer" Text replizieren kann.
ich meine bei der AnsiColorDemo.cmd bei dem 6x6x6 Farbraum gab es Farben die ich gerne nutzen wollen würde. Aber wie genau stelle ich das an?
Angenommen statt "Hunt Redeemer" würde ich jetzt einfach nur "Test" als ASCII art darstellen wollen aber eben mit solchen Farben wie im video / aus dem 6x6x6 Farbraum. Wie gehe ich da vor?