Durchschnittsfarbe eines Bildschirmausschnitts

06/12/2008 17:36 mondesser#1
Moin moin,

ich bin zur Zeit dabei ein Ambilight für meinen Pc zu bauen.
Das funktioniert auch schon ganz gut. Aber das Errechnen der Durchschnittsfarbe eines Bildschirmausschnitts dauert viel zu lange.
Selbst wenn ich nur jeden 20ten Pixel prüfe dauert es noch 40-50ms für 4 Bildausschnitte mit der Größe 200*800. Das ist leider zu langsam um eine Verzögerungsfreie Farbänderung der Lampen zu erreichen. Die Farbe der Lampen lagt immer ein bisschen hinterher, das sieht ziemlich scheiße aus :D
Im Moment errechne ich die Farbe relativ simpel:
Es werden die r,g und b Werte jedes xten Pixels addiert und am ende durch die Anzahl der Pixel geteilt.
Die Farbwerte hole ich momentan mit der WinApi Funktion GetPixel.
Nun ist die Frage, gibt es irgendeinen schnelleren mathematischen Weg die Durchschnittsfarbe zu berechnen?
Gibt es einen schnelleren Weg an die Pixel zu kommen? Vielleicht schon bevor sie angezeigt werden?


Für alle die sich unter einem Ambilight nichts vorstellen können:

06/12/2008 18:58 mr.rattlz#2
Das würde _eventuell_ etwas schneller gehen, wenn du einen Screenshot erstellst (im Speicher) und dann auf den Speicherbereich ohne Umschweife über irgendwelche Funktionen zugreifst. Das Ganze dann noch Geschwindigkeitsoptimiert und dein nächstes Problem wird dann sein wie du eine Kopie des Bildschirminhalts in möglichst geringer Zeit bekommst.
06/12/2008 19:15 wadimwadim#3
Dann müsste er aber ziemlich viele screenshots erstellen, was dazu führt, dass es wahrscheinlich noch langsamer wird und der arbeitsspeicher extrem überfüllt wird.
06/12/2008 19:41 rEdoX#4
Einen Screenshot vom gesamten Bildschirm zu erstellen dauert unter Windows lange (~ 50 ms), deshalb immer kleine Teile des Bildschirms kopieren. (~ 15 ms)

Wie lange die Berechnung jetzt dauert kann ich nicht genau sagen, ist aber eine Moeglichkeit.
06/12/2008 19:56 reijin#5
wie währe es nur den außenbereich einzulesen? hab zwar auf die schnelle kein beispiel parat, aber das währe doch eine idee?
06/12/2008 20:10 wadimwadim#6
Quote:
wie währe es nur den außenbereich einzulesen? hab zwar auf die schnelle kein beispiel parat, aber das währe doch eine idee?
GUT, vielleicht noch den Bildschirm in 4 Teile aufteilen, dann wäre die ganze Sache noch etwas genauer.
06/12/2008 20:10 wadimwadim#7
Quote:
wie währe es nur den außenbereich einzulesen? hab zwar auf die schnelle kein beispiel parat, aber das währe doch eine idee?
GUT, vielleicht noch den Bildschirm in 4 Teile aufteilen, dann wäre die ganze Sache noch etwas genauer.
06/13/2008 11:36 mondesser#8
Quote:
Originally Posted by wadimwadim View Post
GUT, vielleicht noch den Bildschirm in 4 Teile aufteilen, dann wäre die ganze Sache noch etwas genauer.
Ich lese nur die Außenbereiche, deswegen ja 4 Ausschnitte á 200*800 pixel.

Habe überlegt, ob es möglich ist, direkt auf den Graka Buffer zuzugreifen und dort den gerade dargestellten Frame abzugreifen? Das währe quasi das Selbe, als wenn ich ein Screenshot erstelle und dann im Speicher darauf zugreife. Nur ohne das ich ein Screenshot erstellen muss. Dann bin ich nur wieder auf einer sehr systemnahen Ebene, was ich eigentlich vermeiden wollte.
06/21/2008 21:27 Arhey#9
Ja das wär schon besser und um einiges schneller weil die Daten erreichen CPU/Ram zumindest was Darstellung angeht um einiges später als die Graka -> Kabel zum Monitor.

Es sollte möglich sein die Daten kurz bevor die die Graka verlassen zum Kabel abzufangen und es daraus zu berechnen. (ähnlich wie Programme die HD Filme vom Kopierschutz befreien)
Hab aber kein Plan wie man das umsetzen kann aber die Idee könnte ja eventuel weiter helfen.
06/23/2008 16:58 mondesser#10
Joa, bin im Moment noch dabei die Hardware neu zu machen, hatte keine Lust mehr auf Kabelsalat, also versuche ich mich an richtigen Platinen ^^ Danach werd ich dann versuchen den FrontBuffer auszulesen.