häufigste Bildschirmfarbe auslesen C++ 

Status
Für weitere Antworten geschlossen.

RimShot

Registered +
Registriert
Sep. 2007
Beiträge
162
Hallo
Ich möchte ein Programm schreiben, welches die Bildschirmfarben ausliest, und dann schaut, welche Farbe am häufigsten vorkommt.
Es soll so was ähnliches wie Ambilight geben.
Dazu muss natürlich nicht der ganze Bildschirm ausgelesen werden, sonder nur der Rand.

folgende Ideen:
  • Farbwerte auslesen und zwischenspeichern
  • nur die Ränder betrachten; Koordinaten angeben
  • Farbwerte vergleichen, nach dem am häufigsten vorkommenden suchen

Den folgenden Code habe ich bereits:

Code:
#include 
#include 
using namespace std;

int main(void){
HDC dc = GetDC(0); //WinAPI Funktion, liest Farben 
for(int i=0;i/ Koordinaten y
for(int j=0;j/ Koordinaten x
COLORREF c = GetPixel(dc,j,i);
cout / ausgabe der Pixelwerte
}
}
ReleaseDC(0,dc);
return 0;
}

Das hat aber mehrere Probleme:

  • Nur vorgegebene Auflösung
  • ganzer Bildschirm ausgelesen
  • kein Vergleich der Farben

Den Code habe ich nicht selbst geschrieben... denke aber man könnte darauf aufbauen.
Ich erwarte jetzt nicht, dass mir jemand hier ein fertiges Programm schickt :P, aber ich würde mich freuen, wenn mir jemand die Befehle und deren Verwendung sagen könnte, mit denen ich den Rest erreiche :)
Vielen Dank schon mal fürs lesen!
 
ich hätte mal eine idee wie du die häufigste farbe herausfinden kannst. du musst einfach alle rgb werte addieren und dann durch die anzabl pixel teilen und schon hast du die durchschnittsfarbe
zu deiber anderen frage. du kannst z.b. 2 schlaufen schreiben, welhe halt nur die ränder auslesen und dann die rgb werte in ein array schreien. in dem kannst du dann die werte addieren und durch die anzahl elemente teilen
Posted via Mobile Device
 
Hier ist mal ein Beispiel für ein "einfaches Ambi-Light":

Code:
#include 
#include 

using namespace std;

int main(void)
{
//Wieviel Pixel-Spalten sollen links/rechts berücksichtigt werden?
const int BREITE = 150;


//Durchschnittsfarbe Links
int Farbe_Links_R = 0;
int Farbe_Links_G = 0;
int Farbe_Links_B = 0;
//Durchschnittsfarbe Rechts
int Farbe_Rechts_R = 0;
int Farbe_Rechts_G = 0;
int Farbe_Rechts_B = 0;

HDC dc = GetDC(0);
int scrBreite = GetSystemMetrics(SM_CXSCREEN);
int scrHoehe = GetSystemMetrics(SM_CYSCREEN);

//Linke Durchschnittsfarbe berechnen
long tmp_r = 0;
long tmp_g = 0;
long tmp_b = 0;
for(int x = 0; x < BREITE; x++)
{
for(int y = 0; y < scrHoehe; y++)
{
COLORREF Farbe = GetPixel(dc,x,y);
tmp_r += GetRValue(Farbe);
tmp_g += GetGValue(Farbe);
tmp_b += GetBValue(Farbe);
}
}
Farbe_Links_R = tmp_r / (BREITE * scrHoehe);
Farbe_Links_G = tmp_g / (BREITE * scrHoehe);
Farbe_Links_B = tmp_b / (BREITE * scrHoehe);

//Rechte Durchschnittsfarbe berechnen
tmp_r = 0;
tmp_g = 0;
tmp_b = 0;
for(int x = scrBreite - BREITE; x < scrBreite; x++)
{
for(int y = 0; y < scrHoehe; y++)
{
COLORREF Farbe = GetPixel(dc,x,y);
tmp_r += GetRValue(Farbe);
tmp_g += GetGValue(Farbe);
tmp_b += GetBValue(Farbe);
}
}
Farbe_Rechts_R = tmp_r / (BREITE * scrHoehe);
Farbe_Rechts_G = tmp_g / (BREITE * scrHoehe);
Farbe_Rechts_B = tmp_b / (BREITE * scrHoehe);

ReleaseDC(0,dc);
cout  cout  getchar();
return 0;
}
Durch die Konstante BREITE kann man noch den linken und rechten Bildschirmrand verändern.
Es wird u.a. die Bildschirmhöhe und -breite ermittelt, und am Ende wird für jeden Farbkanal der Mittelwert berechnet.

Am Ende erhält man dann einen Farbwert im RGB-Format. z.B. lautet die Ausgabe:
Durchschnittsfarbe Links: (R,G,B) 0, 255, 255
dann ist die Durchschnittsfarbe am linken Rand: CYAN
 
Zuletzt bearbeitet von einem Moderator:
Hi
Vielen Dank
Dein Code hatte noch ein paar Fehler. Jedenfalls ging es bei mir noch nicht.
Jetzt habe ich ihn etwas umgeschrieben. Jetzt gibt er zwar etwas aus, aber die Farben stimmen irgendwie noch nicht.
Er gibt z.T. seltsame Farbwerte aus.
z.B. :
L 203, 202, 201
R 969, 967, 966

Der Code sieht so aus:

Code:
#include 
#include 

using namespace std;

int main(void)
{
//Wieviel Pixel-Spalten sollen links/rechts berücksichtigt werden?
const int BREITE = 150;


//Durchschnittsfarbe Links
int Farbe_Links_R = 0;
int Farbe_Links_G = 0;
int Farbe_Links_B = 0;
//Durchschnittsfarbe Rechts
int Farbe_Rechts_R = 0;
int Farbe_Rechts_G = 0;
int Farbe_Rechts_B = 0;

HDC dc = GetDC(0);
int scrBreite = GetSystemMetrics(SM_CXSCREEN);
int scrHoehe = GetSystemMetrics(SM_CYSCREEN);

//Linke Durchschnittsfarbe berechnen
long tmp_r = 0;
long tmp_g = 0;
long tmp_b = 0;
for(int x = 0; x < BREITE; x++)
{
for(int y = 0; y < scrHoehe; y++)
{
COLORREF Farbe = GetPixel(dc,x,y);
tmp_r += GetRValue(Farbe);
tmp_g += GetGValue(Farbe);
tmp_b += GetBValue(Farbe);
}
}
Farbe_Links_R = tmp_r / (BREITE * scrHoehe);
Farbe_Links_G = tmp_g / (BREITE * scrHoehe);
Farbe_Links_B = tmp_b / (BREITE * scrHoehe);

//Rechte Durchschnittsfarbe berechnen
tmp_r = 0;
tmp_g = 0;
tmp_b = 0;


for( (scrBreite - BREITE); x < scrBreite; x++)
{
for(int y = 0; y < scrHoehe; y++)
{
COLORREF Farbe = GetPixel(dc,x,y);
tmp_r += GetRValue(Farbe);
tmp_g += GetGValue(Farbe);
tmp_b += GetBValue(Farbe);
}
}
Farbe_Rechts_R = tmp_r / (BREITE * scrHoehe);
Farbe_Rechts_G = tmp_g / (BREITE * scrHoehe);
Farbe_Rechts_B = tmp_b / (BREITE * scrHoehe);

//Evtl. std::cout verwenden?! sollte aber eingebunden sein, s.o.

ReleaseDC(0,dc);
cout  cout  getchar();
return 0;
}

Vielen Dank für deine Hilfe! Hat mich echt weiter gebracht!
 
ja, ein Fehler bei meinem Code:
es heisst: #include aber richtig ist:
Code:
#include
(also ohne ".h")

und bei dir fehlt in der Schleife für den rechten Rand eigentlich nur das:
Code:
for ([B]int x =[/B] (scrBreite - BREITE); ...

sonst hat alles bei mir funktioniert. Anscheinend stimmt deine Mittelwert-Berechnung nicht. Hast du vlt noch die Anzahl der Schleifendurchläufe geändert?
Oder hast du vergessen die tmp-Variablen wieder auf Null zu setzen?

jedenfalls funzt auch dein Quellcode bei mir (mit der "int x = " Ergänzung in der Schleife)
 
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

Zurück
Oben Unten