【问题标题】:Is there an API for getting the Windows 7 color of an icon? [duplicate]是否有用于获取 Windows 7 图标颜色的 API? [复制]
【发布时间】:2011-10-31 13:33:39
【问题描述】:

可能重复:
Windows 7 Tasbar Icons Highlight Color

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

是否有获取该颜色的 API?

或者有其他选择吗?

【问题讨论】:

  • 一开始我可能误解了你的帖子,所以我编辑了我的答案......但是为了验证,你正在寻找能够为你提供图标中所有颜色平均值的东西?或者可以调整特定颜色的“发光”亮度的东西?
  • 我正在寻找能够为我提供图标中所有颜色平均值的东西。您提供的代码非常完美。但是,它是在 C++ 中的。我需要 C# 代码。

标签: c# wpf windows-7


【解决方案1】:

[编辑:按要求编写 C# 代码]

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

如果您的源数据在 ints 而不是 Color 中,您始终可以使用函数 Color.FromArgb 与单个 int 参数转换值。 (它还支持从单个值创建它,如示例代码的returns 所示。)

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。

【讨论】:

  • 代码是 C++。您能否改为链接到 C# 资源?
  • 呵呵其实我相信那是ActionScript,但给我几分钟,我会看看我能做什么。 :) 应该很相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多