7 Stimmen

Gibt es eine API, um die Windows 7 Farbe eines Symbols zu erhalten?

Möglicher Duplikat:
Windows 7 Tasbar Icons Highlight Farbe

Windows 7 verwendet einen Algorithmus, um auf irgendeine Weise die durchschnittliche Farbe eines angehefteten Elements in der Windows 7 Taskleiste zu erkennen. Beachten Sie, wie beim Überfahren eines Elements die Leuchtfarbe dieselbe ist wie das Symbol.

Gibt es eine API, um diese Farbe zu erhalten?

Oder gibt es eine Alternative?

3voto

shelleybutterfly Punkte 3168

[Bearbeiten: C#-Code wie angefordert]

Also gut, in C# könnte es tatsächlich mehr oder weniger wie der von mir gegebene Link gemacht werden, aber es gibt wirklich keinen Grund, alle Maskierungen und Verschiebungen zu machen, da Sie bereits direkt auf die ARGB-Werte einer System.Drawing.Color in C# zugreifen können. (Übrigens, ich war mir nicht sicher, ob der Alphawert gemittelt werden sollte, ich habe mit "ja" entschieden.)

Wenn Ihre Ausgangsdaten in int statt Color ist, können Sie die Werte immer mit der Funktion Color.FromArgb mit einem einzigen int-Argument umwandeln. (Es unterstützt auch das Erstellen aus individuellen Werten, wie in den return-Anweisungen des Beispielcodes gezeigt.)

Die LINQ-Version erscheint mir viel einfacher zu verstehen, aber ich habe die andere gegeben, da es im Wesentlichen ein C#-Port des ursprünglichen Codes ist, den ich verlinkt habe.

LINQ-Version:

    public Color DurchschnittsfarbenMitLINQ(Color[] zuDurchschnittlicheFarben)
    {
        // auf die LINQ-Art und Weise
        int Alphadurchschnitt = (int)zuDurchschnittlicheFarben.Average(c => c.A);
        int Rotdurchschnitt = (int)zuDurchschnittlicheFarben.Average(c => c.R);
        int Gruendurchschnitt = (int)zuDurchschnittlicheFarben.Average(c => c.G);
        int Blaudurchschnitt = (int)zuDurchschnittlicheFarben.Average(c => c.B);

        return Color.FromArgb(
            Alphadurchschnitt, Rotdurchschnitt, Gruendurchschnitt, Blaudurchschnitt
        );
    }

Schleifen-, Summierungs- und Aufteilungs-Version:

    public Color DurchschnittsfarbenMitFor(Color[] zuDurchschnittlicheFarben)
    {
        int AlphaSumme = 0;
        int RotSumme = 0;
        int GruenSumme = 0;
        int BlauSumme = 0;

        foreach (Color einzelfarbe in zuDurchschnittlicheFarben)
        {
            AlphaSumme += einzelfarbe.A;
            RotSumme += einzelfarbe.R;
            GruenSumme += einzelfarbe.G;
            BlauSumme += einzelfarbe.B;
        }

        double AnzahlVonFarben = zuDurchschnittlicheFarben.Length;

        int Alphadurchschnitt = (int)(AlphaSumme / AnzahlVonFarben);
        int Rotdurchschnitt = (int)(RotSumme / AnzahlVonFarben);
        int Gruendurchschnitt = (int)(GruenSumme / AnzahlVonFarben);
        int Blaudurchschnitt = (int)(BlauSumme / AnzahlVonFarben);

        return Color.FromArgb(
            Alphadurchschnitt, Rotdurchschnitt, Gruendurchschnitt, Blaudurchschnitt
        );
    }

Nun, ich würde mir einmal Wie passe ich die Helligkeit einer Farbe an? ansehen, das verschiedene Möglichkeiten hierfür abdeckt.

Ich bin mir nicht ganz sicher, welches Modell Windows 7 verwendet, um dies zu tun, aber grundsätzlich gibt es unterschiedliche Modelle, die Sie verwenden können, um eine Farbe aus dem Farbraum auszuwählen, und insbesondere HSL und HSV (http://en.wikipedia.org/wiki/HSL_and_HSV) können beide verwendet werden, um die wahrgenommene Helligkeit der Farbe zu erhöhen und zu verringern, ohne sie zu sehr zu verändern.

Beim erneuten Lesen Ihrer Frage glaube ich, dass ich sie möglicherweise missverstanden habe. Wenn Sie tatsächlich meinen, einen Block von Farben zu durchschnittlichen, würde ich dies ausprobieren: http://blog.soulwire.co.uk/code/actionscript-3/extract-average-colours-from-bitmapdata. Es sieht so aus, als ob es dies über RGB macht, und ich bin mir nicht sicher genug, um zu wissen, ob das gute Ergebnisse liefert (zum Beispiel schafft es es nicht gut, die Helligkeit einer Farbe zu erhöhen oder zu verringern, um die Farben proportional anzupassen...)

Also, wenn Sie damit keine guten Ergebnisse erzielen, würde ich empfehlen, alle Farben entweder in HSV oder HSL umzuwandeln, diese Werte zu mitteln und dann wieder in RGB umzuwandeln.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X