[Bearbeiten: C# Code wie gewünscht]
Ok, nun, in C# ist es eigentlich könnte mehr oder weniger wie der Link, den ich angegeben habe, gemacht werden, aber es gibt wirklich keinen Grund, die ganze Maskierung und Verschiebung zu machen, da man bereits auf eine System.Drawing.Color
(Oh, übrigens, ich war mir nicht sicher, ob ich den Alpha-Wert mitteln sollte, ich entschied mich für "ja").
Wenn sich Ihre Quelldaten in int
s stattdessen Color
können Sie die Werte jederzeit mit der Funktion Color.FromArgb
mit einem einzigen int
Argument. (Es kann auch aus einzelnen Werten erstellt werden, wie im Beispielcode gezeigt return
s.)
Die LINQ-Version sieht für mich viel verständlicher aus, aber ich habe die andere Version angegeben, da sie im Grunde eine C#-Portierung des Originalcodes ist, den ich verlinkt habe.
LINQ-Version:
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
);
}
Schleifen-, Summen- und Divisionsversion:
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
);
}
Nun, ich würde mich erkundigen Wie kann ich die Helligkeit einer Farbe einstellen? in dem verschiedene Möglichkeiten vorgestellt werden.
Ich bin mir nicht ganz sicher, welches Modell Windows 7 dafür verwendet, aber grundsätzlich gibt es verschiedene Modelle, mit denen Sie eine Farbe aus dem Farbraum auswählen können, 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 oder zu verringern, ohne sie zu sehr zu verändern.
Nachdem ich Ihre Frage noch einmal gelesen habe, glaube ich, dass ich etwas falsch verstanden habe. Wenn Sie tatsächlich meinen, einen Block von Farben zu mitteln, würde ich dies versuchen: http://blog.soulwire.co.uk/code/actionscript-3/extract-average-colours-from-bitmapdata . Es sieht allerdings so aus, als würde es über RGB gehen, und ich bin nicht vertraut genug, um zu wissen, ob das zu guten Ergebnissen führt (zum Beispiel leistet es keine gute Arbeit, die Helligkeit einer Farbe zu erhöhen oder zu verringern, um die Farben proportional anzupassen...)
Wenn Sie damit keine guten Ergebnisse erzielen, würde ich empfehlen, alle Farben entweder in HSV oder HSL zu konvertieren, aus diesen Werten einen Mittelwert zu bilden und dann wieder in RGB zu konvertieren.