有没有获取Windows 7图标颜色的API?

7

可能重复:
Windows 7任务栏图标高亮颜色

Windows 7使用某种算法以某种方式检测Windows 7任务栏中固定项的平均颜色。请注意,当您悬停在一个项目上时,发光的颜色与图标相同。

是否有API可以获取该颜色?

或是否有其他替代方法?


我可能一开始误解了你的帖子,所以我编辑了我的答案...但是为了确认,你是在寻找一些可以给出图标中所有颜色的平均值的东西吗?还是一些可以调整特定颜色“发光”亮度的东西? - shelleybutterfly
我正在寻找一种可以给出图标中所有颜色平均值的方法。你提供的代码非常完美。但是,它是用C++编写的,我需要C#代码。 - Mathias Lykkegaard Lorenzen
1个回答

3

[编辑:按要求提供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
        );
    }

我建议您查看如何调整颜色的亮度?,其中涵盖了几种不同的方法。
我不确定Windows 7使用哪种模型来执行此操作,但基本上有不同的模型可以用来从颜色空间中选择颜色,并且特别是HSL和HSV (http://en.wikipedia.org/wiki/HSL_and_HSV) 都可以用于增加和减少颜色的感知亮度,而不会改变它太多。
经过重新阅读您的问题,我认为我可能误解了。如果实际上您想平均一组颜色,我建议尝试这个:从BitmapData中提取平均颜色。看起来它是通过RGB执行的,但是我不熟悉是否产生良好的结果(例如,它不能很好地提高或降低颜色的亮度以调整颜色的比例...)
因此,如果那不能给您好的结果,我建议将所有颜色转换为HSV或HSL之一,然后将这些值平均在一起,最后再转换回RGB。

代码是用C++编写的。你能否提供C#资源的链接? - Mathias Lykkegaard Lorenzen
1
呵呵,实际上我相信那是ActionScript,但请给我几分钟,我会看看我能做什么。 :) 它应该非常相似。 - shelleybutterfly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接