häufigste Bildschirmfarbe auslesen

  • C++

  • RimShot
  • 1701 Aufrufe 4 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • häufigste Bildschirmfarbe auslesen

    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:

    C-Quellcode

    1. #include <windows.h>
    2. #include <iostream>
    3. using namespace std;
    4. int main(void){
    5. HDC dc = GetDC(0); //WinAPI Funktion, liest Farben
    6. for(int i=0;i<1024;i++){ // Koordinaten y
    7. for(int j=0;j<1280;j++){ // Koordinaten x
    8. COLORREF c = GetPixel(dc,j,i);
    9. cout << (int)GetRValue(c) << " " << (int)GetGValue(c) << " " << (int)GetBValue(c) << "n"; // ausgabe der Pixelwerte
    10. }
    11. }
    12. ReleaseDC(0,dc);
    13. return 0;
    14. }
    Alles anzeigen


    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":

    C-Quellcode

    1. #include <windows.h>
    2. #include <iostream.h>
    3. using namespace std;
    4. int main(void)
    5. {
    6. //Wieviel Pixel-Spalten sollen links/rechts berücksichtigt werden?
    7. const int BREITE = 150;
    8. //Durchschnittsfarbe Links
    9. int Farbe_Links_R = 0;
    10. int Farbe_Links_G = 0;
    11. int Farbe_Links_B = 0;
    12. //Durchschnittsfarbe Rechts
    13. int Farbe_Rechts_R = 0;
    14. int Farbe_Rechts_G = 0;
    15. int Farbe_Rechts_B = 0;
    16. HDC dc = GetDC(0);
    17. int scrBreite = GetSystemMetrics(SM_CXSCREEN);
    18. int scrHoehe = GetSystemMetrics(SM_CYSCREEN);
    19. //Linke Durchschnittsfarbe berechnen
    20. long tmp_r = 0;
    21. long tmp_g = 0;
    22. long tmp_b = 0;
    23. for(int x = 0; x < BREITE; x++)
    24. {
    25. for(int y = 0; y < scrHoehe; y++)
    26. {
    27. COLORREF Farbe = GetPixel(dc,x,y);
    28. tmp_r += GetRValue(Farbe);
    29. tmp_g += GetGValue(Farbe);
    30. tmp_b += GetBValue(Farbe);
    31. }
    32. }
    33. Farbe_Links_R = tmp_r / (BREITE * scrHoehe);
    34. Farbe_Links_G = tmp_g / (BREITE * scrHoehe);
    35. Farbe_Links_B = tmp_b / (BREITE * scrHoehe);
    36. //Rechte Durchschnittsfarbe berechnen
    37. tmp_r = 0;
    38. tmp_g = 0;
    39. tmp_b = 0;
    40. for(int x = scrBreite - BREITE; x < scrBreite; x++)
    41. {
    42. for(int y = 0; y < scrHoehe; y++)
    43. {
    44. COLORREF Farbe = GetPixel(dc,x,y);
    45. tmp_r += GetRValue(Farbe);
    46. tmp_g += GetGValue(Farbe);
    47. tmp_b += GetBValue(Farbe);
    48. }
    49. }
    50. Farbe_Rechts_R = tmp_r / (BREITE * scrHoehe);
    51. Farbe_Rechts_G = tmp_g / (BREITE * scrHoehe);
    52. Farbe_Rechts_B = tmp_b / (BREITE * scrHoehe);
    53. ReleaseDC(0,dc);
    54. cout << "Durchschnittsfarbe Links: (R,G,B) " << Farbe_Links_R << "," << Farbe_Links_G << "," << Farbe_Links_B << ")\r\n";
    55. cout << "Durchschnittsfarbe Rechts: (R,G,B) " << Farbe_Rechts_R << "," << Farbe_Rechts_G << "," << Farbe_Rechts_B << ")\r\n";
    56. getchar();
    57. return 0;
    58. }
    Alles anzeigen

    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
    Wo ist Iphigenie?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von tarkus ()

  • 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:

    C-Quellcode

    1. #include <windows.h>
    2. #include <iostream>
    3. using namespace std;
    4. int main(void)
    5. {
    6. //Wieviel Pixel-Spalten sollen links/rechts berücksichtigt werden?
    7. const int BREITE = 150;
    8. //Durchschnittsfarbe Links
    9. int Farbe_Links_R = 0;
    10. int Farbe_Links_G = 0;
    11. int Farbe_Links_B = 0;
    12. //Durchschnittsfarbe Rechts
    13. int Farbe_Rechts_R = 0;
    14. int Farbe_Rechts_G = 0;
    15. int Farbe_Rechts_B = 0;
    16. HDC dc = GetDC(0);
    17. int scrBreite = GetSystemMetrics(SM_CXSCREEN);
    18. int scrHoehe = GetSystemMetrics(SM_CYSCREEN);
    19. //Linke Durchschnittsfarbe berechnen
    20. long tmp_r = 0;
    21. long tmp_g = 0;
    22. long tmp_b = 0;
    23. for(int x = 0; x < BREITE; x++)
    24. {
    25. for(int y = 0; y < scrHoehe; y++)
    26. {
    27. COLORREF Farbe = GetPixel(dc,x,y);
    28. tmp_r += GetRValue(Farbe);
    29. tmp_g += GetGValue(Farbe);
    30. tmp_b += GetBValue(Farbe);
    31. }
    32. }
    33. Farbe_Links_R = tmp_r / (BREITE * scrHoehe);
    34. Farbe_Links_G = tmp_g / (BREITE * scrHoehe);
    35. Farbe_Links_B = tmp_b / (BREITE * scrHoehe);
    36. //Rechte Durchschnittsfarbe berechnen
    37. tmp_r = 0;
    38. tmp_g = 0;
    39. tmp_b = 0;
    40. for( (scrBreite - BREITE); x < scrBreite; x++)
    41. {
    42. for(int y = 0; y < scrHoehe; y++)
    43. {
    44. COLORREF Farbe = GetPixel(dc,x,y);
    45. tmp_r += GetRValue(Farbe);
    46. tmp_g += GetGValue(Farbe);
    47. tmp_b += GetBValue(Farbe);
    48. }
    49. }
    50. Farbe_Rechts_R = tmp_r / (BREITE * scrHoehe);
    51. Farbe_Rechts_G = tmp_g / (BREITE * scrHoehe);
    52. Farbe_Rechts_B = tmp_b / (BREITE * scrHoehe);
    53. //Evtl. std::cout verwenden?! sollte aber eingebunden sein, s.o.
    54. ReleaseDC(0,dc);
    55. cout << "Durchschnittsfarbe Links: (R,G,B) " << Farbe_Links_R << "," << Farbe_Links_G << "," << Farbe_Links_B << "\r\n";
    56. cout << "Durchschnittsfarbe Rechts: (R,G,B) " << Farbe_Rechts_R << "," << Farbe_Rechts_G << "," << Farbe_Rechts_B << "\r\n";
    57. getchar();
    58. return 0;
    59. }
    Alles anzeigen


    Vielen Dank für deine Hilfe! Hat mich echt weiter gebracht!
  • ja, ein Fehler bei meinem Code:
    es heisst: #include <iostream.h> aber richtig ist:

    Quellcode

    1. #include <iostream>

    (also ohne ".h")

    und bei dir fehlt in der Schleife für den rechten Rand eigentlich nur das:

    Quellcode

    1. 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)
    Wo ist Iphigenie?