是否有用于获取图标的Windows 7颜色的API?

Mat*_*zen 7 c# wpf windows-7

可能重复:
Windows 7 Tasbar图标突出显示颜色

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

是否有获取该颜色的API?

还是有替代方案吗?

she*_*fly 3

[编辑:根据要求编辑 C# 代码]

好吧,在 C# 中,实际上可以或多或少像我给出的链接那样完成,但实际上没有理由进行所有掩码和移位,因为您已经可以System.Drawing.Color在 C# 中直接访问 a 的 ARGB 值。(哦,顺便说一句,我不确定是否要平均 Alpha 值,我选择了“是”。)

如果您的源数据位于ints中,则您始终可以使用带有单个参数的Color函数来转换值。(它还支持从单个值创建它,如示例代码所示。)Color.FromArgbintreturn

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
        );
    }
Run Code Online (Sandbox Code Playgroud)

循环、求和、除法版本:

    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
        );
    }
Run Code Online (Sandbox Code Playgroud)

好吧,我会看看如何调整颜色的亮度?其中涵盖了几种不同的方法。

我不太确定 Windows 7 使用什么模型来执行此操作,但基本上可以使用不同的模型从色彩空间中选择颜色,特别是 HSL 和 HSV(http://en.wikipedia.org/wiki/HSV)。 org/wiki/HSL_and_HSV)都可以用来增加和减少颜色的感知亮度,而不会改变太多。

重新阅读你的问题后,我想我可能误解了。如果您实际上打算平均一块颜色,我会尝试一下:http://blog.soulwire.co.uk/code/actionscript-3/extract-average-colours-from-bitmapdata。不过,看起来它是通过 RGB 来实现的,而且我还不够熟悉,不知道这是否会产生良好的结果(例如,它不能很好地提高或降低颜色的亮度以按比例调整颜色) ...)

因此,如果这不能给您带来好的结果,我建议尝试将所有颜色转换为 HSV 或 HSL,将这些值平均在一起,然后转换回 RGB。