Windows 7使用某种算法以某种方式检测Windows 7任务栏中固定项的平均颜色。请注意,当您将鼠标悬停在某个项目上时,其发光颜色与图标相同。
是否有用于获取该颜色的API?
或者有替代方案吗?
答案 0 :(得分:3)
[编辑:按要求提供C#代码]
好吧,在C#中,实际上可能或多或少地像我给出的链接那样完成,但实际上没有理由做所有的屏蔽和转移,因为你已经可以访问了一个System.Drawing.Color
的ARGB值直接在C#中。 (哦,顺便说一句,我不确定是否要平均Alpha值,我选择了“是”。)
如果您的源数据位于int
而不是Color
,则您始终可以使用函数Color.FromArgb
转换值,并使用单个int
参数。 (它还支持从单个值创建它,如示例代码的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
);
}
好吧,我会查看How do I adjust the brightness of a color?,其中涵盖了几种不同的方法。
我不确定Windows 7使用的是哪种型号,但基本上可以使用不同的模型从颜色空间中选择颜色,特别是HSL和HSV(http://en.wikipedia.org/wiki/HSL_and_HSV )可以用来增加和减少颜色的感知亮度而不会过多地改变颜色。
重新阅读你的问题后,我想我可能会误解。如果你的意思是平均一块颜色,我会给它一个镜头:http://blog.soulwire.co.uk/code/actionscript-3/extract-average-colours-from-bitmapdata。看起来它似乎是通过RGB来做的,而且我不熟悉它是否会产生良好的效果(例如,它不能很好地提高或降低颜色的亮度来按比例调整颜色......)
因此,如果这不能给你带来好的结果,我建议尝试将所有颜色转换为HSV或HSL,将这些值平均在一起,然后转换回RGB。