Ein naiver Ansatz wäre es, einfach die Durchschnittsfarbe für den Bereich zu ermitteln. Etwas geschickter würde das evtl. noch, wenn man die Pixel die näher zum Rand liegen dabei stärker gewichtet. Was aber eine recht gute Näherung sein dürfte, stützt sich auf Aphtons Idee, welche letztlich ein sog.
Histogramm beschreibt - in dem Fall eines über die ganzen Farben. Wenn man von diesem dann noch die obersten ~10% mittelt, dürfte das recht gut werden.
Histogramme sind in der Grafikverarbeitung recht üblich, meist aber für R, G und B separat. Dabei ist dann die Verwaltung der Datenstruktur weit einfacher und schneller, falls das o.g. Methode ausschließt. Ein Array[0..2, 0..255] of Cardinal, 1. Dimension 0-2 für
RGB, und 2. Dimension für den Wert den die Farbanteile je annehmen können.
Mal Pseudocode wie man so ein Histogramm aufbaut:
Delphi-Quellcode:
for y := 0 to Bild.Height-1 do
begin
for x := 0 to Bild.Width-1 do
begin
inc(Array[0, Bild.Pixel[x, y].R]);
inc(Array[1, Bild.Pixel[x, y].G]);
inc(Array[2, Bild.Pixel[x, y].B]);
end;
end;
Der Wert von z.B. "Array[1, 128]" gibt dann also an, wie viele Pixel den Grünanteil 128 haben. Aus diesen 3 Listen kann man nun wieder die obersten 10% mitteln, und daraus eine Farbe zusammensetzen.
Eine weitere Variante wäre es das ganze von
RGB nach
HSV zu konvertieren. Dann nimmt man sich nur die Hue-Werte, für die Saturation und Value einen Mindestwert überschreiten, da diese dann die meiste Farbigkeit und Leuchtkraft beitragen. Aus diesen ermittelten Hue-Werten erstellt man wiederum ein Histogramm, uuuuund mittelt einen Teil am oberen Ende.
Hierbei erhält man allerdings nur eine Farbe, keine Indikation für die Helligkeit. Diese würde ich dann aus den Randpixeln gemittelt herleiten, um einen guten Anschluss an den Bildrand zu bekommen.
Ich habe selbst noch keine der Dinge getestet, und es ist vermutlich sinnvoll alles Mögliche in diese Richtung mal auszuprogrammieren und zu begutachten, da hier ja das subjektive Empfinden den größten Faktor bei der Beurteilung der Güte stellt - und das ist ja bekanntlich nicht immer mit rechnerisch sinnvollen Verfahren gleichzusetzen
Auch spielt eine große Rolle ob die Anzeige vom Bild und dem Ambilight durch das selbe Medium (yeah) geschieht oder nicht. Wenn du z.B. um deinen Monitor verteilte
RGB-LEDs ansteuerst, kann es durchaus nötig sein die Farben (bzw. die Farbkanäle) noch weiter zu verarbeiten um einen guten und ähnlichen Farbeindruck herzustellen. (Anhebung von Blau z.B., was bei LEDs meist eine geringere Leuchtkraft hat als Rot und Grün.)
Interessante Sache! Ich fühle mich fast schon genötigt mal was ähnliches in Angriff zu nehmen
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)