このコードを C# で動作させました。これを、rgb または 16 進数の色の定義を入力として取り、色名と rgb 値を含む上位 3 または 5 つの一致をコンソールに出力する、慣用的な PowerShell スクリプトに変換する手助けをしたいと思います。私は PowerShell を初めて使用します。質問が多すぎる場合は申し訳ありません。
private static void FindMyColor()
{
System.Drawing.Color targetColor = System.Drawing.Color.FromArgb(red: 0, green: 128, blue: 0);
var myStuff = EnumerateColors(targetColor: targetColor).OrderBy(tpl => tpl.Item1).ToList();
int a = 0; // Pause the debugger here.
}
private static double GetColorDistance(System.Drawing.Color lhs, System.Drawing.Color rhs)
{
double sum = Cube(lhs.R - rhs.R) + Cube(lhs.G - rhs.G) + Cube(lhs.B - rhs.B);
return Math.Pow(sum, 1.0/3.0);
}
private static double Cube(int value)
{
return (double) (value * value * value);
}
private static System.Collections.Generic.IEnumerable<Tuple<double, string, System.Drawing.Color>> EnumerateColors(System.Drawing.Color targetColor)
{
var candidateColors = EnumerateSystemColors();
foreach (string colorName in candidateColors.Keys)
{
var color = candidateColors[key: colorName];
double colorDistance = GetColorDistance(lhs: color, rhs: targetColor);
yield return new Tuple<double, string, System.Drawing.Color>(colorDistance, colorName, color);
}
}
private static System.Collections.Generic.Dictionary<string, System.Drawing.Color> EnumerateSystemColors()
{
var properties = typeof(System.Drawing.Color)
.GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.FlattenHierarchy);
return properties.ToDictionary(p => p.Name, p => (System.Drawing.Color)p.GetValue(null, null));
}