可能重复:
Windows 7任务栏图标高亮颜色
Windows 7使用某种算法以某种方式检测Windows 7任务栏中固定项的平均颜色。请注意,当您悬停在一个项目上时,发光的颜色与图标相同。
是否有API可以获取该颜色?
或是否有其他替代方法?
可能重复:
Windows 7任务栏图标高亮颜色
Windows 7使用某种算法以某种方式检测Windows 7任务栏中固定项的平均颜色。请注意,当您悬停在一个项目上时,发光的颜色与图标相同。
是否有API可以获取该颜色?
或是否有其他替代方法?
[编辑:按要求提供C#代码]
好的,在C#中,实际上可以更或多或少地像我给出的链接那样完成,但是没有必要进行所有掩码和移位操作,因为在C#中您已经可以直接访问 System.Drawing.Color
的ARGB值。 (哦,顺便说一下,我不确定是否平均了Alpha值,我选择了“是”。)
如果您的源数据是 int
而不是 Color
,则始终可以使用单个 int
参数的函数 Color.FromArgb
转换值。 (它还支持从个别值创建它,如示例代码的 return
所示。)
对我来说,LINQ版本看起来更容易理解,但我给出了另一个版本,因为它基本上是我链接的原始代码的C#移植。
LINQ版本:
public Color AverageColorsWithLINQ(Color[] ColorsToAverage)
{
// the LINQ way
int AlphaAverage = (int)ColorsToAverage.Average(c => c.A);
int RedAverage = (int)ColorsToAverage.Average(c => c.R);
int GreenAverage = (int)ColorsToAverage.Average(c => c.G);
int BlueAverage = (int)ColorsToAverage.Average(c => c.B);
return Color.FromArgb(
AlphaAverage, RedAverage, GreenAverage, BlueAverage
);
}
循环、求和和除法版本:
public Color AverageColorsWithFor(Color[] ColorsToAverage)
{
int AlphaTotal = 0;
int RedTotal = 0;
int GreenTotal = 0;
int BlueTotal = 0;
foreach (Color AColor in ColorsToAverage)
{
AlphaTotal += AColor.A;
RedTotal += AColor.R;
GreenTotal += AColor.G;
BlueTotal += AColor.B;
}
double NumberOfColors = ColorsToAverage.Length;
int AlphaAverage = (int)(AlphaTotal / NumberOfColors);
int RedAverage = (int)(RedTotal / NumberOfColors);
int GreenAverage = (int)(GreenTotal / NumberOfColors);
int BlueAverage = (int)(BlueTotal / NumberOfColors);
return Color.FromArgb(
AlphaAverage, RedAverage, GreenAverage, BlueAverage
);
}