[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.