Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PowerShell查找最近的System.Color实例_C#_Powershell - Fatal编程技术网

C# 使用PowerShell查找最近的System.Color实例

C# 使用PowerShell查找最近的System.Color实例,c#,powershell,C#,Powershell,我用C#编写了这段代码。我想帮助将其转换为一个惯用的PowerShell脚本,该脚本将以rgb或十六进制颜色定义作为输入,并将前3或5个匹配项输出到控制台,包括颜色名称和rgb值。我对PowerShell非常陌生,如果这要求太高,我很抱歉 private static void FindMyColor() { System.Drawing.Color targetColor = System.Drawing.Color.FromArgb(red: 0, green

我用C#编写了这段代码。我想帮助将其转换为一个惯用的PowerShell脚本,该脚本将以rgb或十六进制颜色定义作为输入,并将前3或5个匹配项输出到控制台,包括颜色名称和rgb值。我对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));
    }
private static void FindMyColor()
{
System.Drawing.Color targetColor=System.Drawing.Color.FromArgb(红色:0,绿色:128,蓝色:0);
var myStuff=EnumerateColors(targetColor:targetColor).OrderBy(tpl=>tpl.Item1.ToList();
int a=0;//在此处暂停调试器。
}
专用静态双GetColorDistance(System.Drawing.Color lhs、System.Drawing.Color rhs)
{
双和=立方体(lhs.R-rhs.R)+立方体(lhs.G-rhs.G)+立方体(lhs.B-rhs.B);
返回Math.Pow(总和,1.0/3.0);
}
私有静态双多维数据集(int值)
{
返回值(双倍)(值*值*值);
}
专用静态System.Collections.Generic.IEnumerable枚举颜色(System.Drawing.Color targetColor)
{
var candidateColors=EnumerateSystemColors();
foreach(candidateColors.Keys中的字符串colorName)
{
var color=candidateColors[关键字:colorName];
双色距离=GetColorDistance(lhs:color,rhs:targetColor);
返回新元组(colordance、colorName、color);
}
}
私有静态System.Collections.Generic.Dictionary EnumerateSystemColors()
{
var properties=typeof(System.Drawing.Color)
.GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Flatterhierarchy);
返回properties.ToDictionary(p=>p.Name,p=>(System.Drawing.Color)p.GetValue(null,null));
}

为什么不将此代码作为类型添加到add type?并在powershell中使用它作为
[myclass]::GetColorDistance(..)
-有关更多详细信息,请参阅此处


为什么不将此代码作为类型添加到add type?并在powershell中使用它作为
[myclass]::GetColorDistance(..)
-有关更多详细信息,请参阅此处


为了完整起见,这里有一个PowerShell版本,可以找到最接近的颜色

首先,我们检索类型上声明为静态命名属性的所有颜色:

$namedColors=[Drawing.Color]|获取成员-静态-成员类型属性|
foreach{[Drawing.Color]::($名称)}
为了确定两种颜色之间的距离,我们可以为三个RGB维度定义一个自定义函数:

函数测量色差([Drawing.Color]$a[Drawing.Color]$b){
$sum='R'、'G'、'B'| foreach{[Math]::Pow($a.$\u-$B.$\u,2)}| measure-sum
[数学]::四舍五入([数学]::Pow($sum.sum,0.5),2)
}
为了更容易指定目标颜色,我们可以定义一个帮助函数来创建颜色值:

函数新颜色([字节]$r=0,[字节]$g=0,[字节]$b=0,[字节]$a=255){
[Drawing.Color]::FromArgb($a,$r,$g,$b)
}
最后,为了找到最接近的颜色,我们可以获得每个命名颜色与目标之间的距离,并返回按该距离排序的顶部颜色:

函数匹配颜色([Drawing.Color]$targetColor,[int]$top=5){
$distance=@{n='distance';e={Measure colorddistance$targetColor$}
$distance=$namedColors |选择对象$distance,Name
$Distance |排序对象距离|选择对象-第一个$top
}
调用
MatchColor(新颜色-g 128)
将显示前五个结果:

距离名称
-------- ----
0绿色
28暗绿色
49.33森林绿
99.03海格林
99.37暗绿色

为了完整起见,这里有一个PowerShell版本,可以找到最接近的颜色

首先,我们检索类型上声明为静态命名属性的所有颜色:

$namedColors=[Drawing.Color]|获取成员-静态-成员类型属性|
foreach{[Drawing.Color]::($名称)}
为了确定两种颜色之间的距离,我们可以为三个RGB维度定义一个自定义函数:

函数测量色差([Drawing.Color]$a[Drawing.Color]$b){
$sum='R'、'G'、'B'| foreach{[Math]::Pow($a.$\u-$B.$\u,2)}| measure-sum
[数学]::四舍五入([数学]::Pow($sum.sum,0.5),2)
}
为了更容易指定目标颜色,我们可以定义一个帮助函数来创建颜色值:

函数新颜色([字节]$r=0,[字节]$g=0,[字节]$b=0,[字节]$a=255){
[Drawing.Color]::FromArgb($a,$r,$g,$b)
}
最后,为了找到最接近的颜色,我们可以获得每个命名颜色与目标之间的距离,并返回按该距离排序的顶部颜色:

函数匹配颜色([Drawing.Color]$targetColor,[int]$top=5){
$distance=@{n='distance';e={Measure colorddistance$targetColor$}
$distance=$namedColors |选择对象$distance,Name
$Distance |排序对象距离|选择对象-第一个$top
}
调用
MatchColor(新颜色-g 128)
将显示前五个结果:

距离名称
-------- ----
0绿色
28暗绿色
49.33森林绿
99.03海格林
99.37暗绿色