What is the best way to convert a System.Drawing.Color to a similar System.ConsoleColor?
What is the best way to convert a System.Drawing.Color to a similar System.ConsoleColor?
Unfortunately, even though the Windows console can support RGB colors, the Console class only exposes the ConsoleColor enumeration which greatly limits the possible colors you can use. If you want a Color structure to be mapped to the "closest" ConsoleColor, that will be tricky.
But if you want the named Color to match a corresponding ConsoleColor you can make a map such as:
var map = new Dictionary<Color, ConsoleColor>();
map[Color.Red] = ConsoleColor.Red;
map[Color.Blue] = ConsoleColor.Blue;
etc...
Or if performance is not that important, you can round trip through String. (Only works for named colors)
var color = Enum.Parse(typeof(ConsoleColor), color.Name);
EDIT: Here's a link to a question about finding color "closeness".
Easy one...
Public Shared Function ColorToConsoleColor(cColor As Color) As ConsoleColor
Dim cc As ConsoleColor
If Not System.Enum.TryParse(Of ConsoleColor)(cColor.Name, cc) Then
Dim intensity = If(Color.Gray.GetBrightness() < cColor.GetBrightness(), 8, 0)
Dim r = If(cColor.R >= &H80, 4, 0)
Dim g = If(cColor.G >= &H80, 2, 0)
Dim b = If(cColor.B >= &H80, 1, 0)
cc = CType(intensity + r + g + b, ConsoleColor)
End If
Return cc
End Function
The distinct default "white-on-blue" color of PowerShell.exe before version 6 (and any ConsoleWindowClass window) is actually DarkYellow on DarkMagenta if you check $Host.UI.RawUI. This is because the ConsoleColor enum values are just indices into the console color table, which is configurable (see this answer about DarkYellow).
Here are the hex RGB values for the default console color table:
Value Hex RGB Name
0 #000000 Black
1 #000080 DarkBlue
2 #008000 DarkGreen
3 #008080 DarkCyan
4 #800000 DarkRed
5 #012456 DarkMagenta
6 #EEEDF0 DarkYellow
7 #C0C0C0 Gray
8 #808080 DarkGray
9 #0000FF Blue
10 #00FF00 Green
11 #00FFFF Cyan
12 #FF0000 Red
13 #FF00FF Magenta
14 #FFFF00 Yellow
15 #FFFFFF White