farbe eines Pixels auslesen?

  • C++

  • zarder
  • 2497 Aufrufe 5 Antworten

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

  • farbe eines Pixels auslesen?

    Hi

    ich würde gerne die Farbe eines Pixels auslesen. Dieser Pixel sollte genau unter dem cursor sein (d.h. auch wenn sich der cursor nicht im Programmfenster befindet).

    ich wäre sehr glücklich, wenn mir da jemand helfen könnte! Perfekt wäre ein ganzer Code-schnipsel, ich wäre aber auch schon zufrieden wenn mir jemand die befehle mit dem richtigen header eintrag verraten könnte.:)
    [COLOR="LemonChiffon"]Wer das lesen kann, hat den Kontrast zu hoch eingestellt![/color]
  • also die position des cursors kannst du auf jeden fall mit getCursorPos herausfinden, näheres dazu hier: GetCursorPos Function ()
    wie du jetzt aber die farbe des Pixels herausfindest, da kann ich dir nicht wirklich weiterhelfen. es gibt eine getPixel Methode, die kannst du aber nur auf Bitmaps anwenden. Ein Workaround wäre es vielleicht, den aktuellen Bildschirm in einer Bitmap zu speichern und dann die Methode darauf anzuwenden. Hier ist die Beschreibung: Bitmap.GetPixel-Methode (System.Drawing)
    [COLOR="Green"]"A dream you dream alone is only a dream. A dream you dream together is reality"[/color]

    John Lennon

    [SIZE=1],,,[/SIZE][SIZE=1]*̡͌l̡*,,,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,,*̡͌l̡*,,,,,,,,,,*̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ *̡͌l̡*_,,,,,,,,̡̡ ̴̡ı̴̴̡ ,,,,,,,,*̡͌l̡*,,[/SIZE][SIZE=1],,,[/SIZE][SIZE=1],,,,,,̡̡ ̴̡ı̴̴̡ ,[/SIZE][SIZE=1],,[/SIZE]
    [SIZE="1"][COLOR="Purple"]Up 1[/color][/SIZE] [SIZE="1"] [COLOR="Olive"]Up 2_The_Beatles_Red_Album[/color][/SIZE]
  • ...das wär ne Idee.

    ich hab nur die befürchtung, dass das zu langsam wäre. Das sollte nämlich recht schnell sein, sodass die Farben auch bei filme oder spielen ausgelesen werden können.

    haut das mit der geschwindigkeit hin?
    [COLOR="LemonChiffon"]Wer das lesen kann, hat den Kontrast zu hoch eingestellt![/color]
  • Ist garnicht so schwer...

    Du holst dir wie Ralph Peter schrieb mit GetCursorPos() die Position der Maus.

    Dann brauchst du den Handle auf den Desktop:

    Quellcode

    1. HWND desktopHandle = GetDesktopWindow();


    Als nächstes brauchst du des Device Context vom Desktop:

    Quellcode

    1. HDC dc = GetWindowDC(desktopHandle);


    und nun kannst du dir das Pixel an der Mausposition auslesen:

    Quellcode

    1. COLORREF ref = GetPixel(dc, mouse.x, mouse.y);


    auf die RGB werte vom COLORREF kommst du über die Funktionen "GetRValue(ref), GetGValue(ref), GetBValue(ref)"

    Das sollte es sein... Viel Spaß damit :)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • ich hab jetzt mal fogendes zusammengebastelt

    PHP-Quellcode

    1. #include <cstdlib>
    2. #include <iostream>
    3. #include <windows.h>
    4. #include <time.h>
    5. using namespace std;
    6. int main()
    7. {
    8. int c;
    9. c = 1;
    10. while (c=1){
    11. POINT pos;
    12. GetCursorPos(&pos);
    13. int x =pos.x;
    14. int y =pos.y;
    15. //cout << x <<" | "<< y << endl;
    16. HWND desktopHandle = GetDesktopWindow();
    17. HDC dc = GetWindowDC(desktopHandle);
    18. COLORREF ref = GetPixel(dc, pos.x, pos.y);
    19. int r,g,b ;
    20. r = GetRValue(ref);
    21. g = GetGValue(ref);
    22. b = GetBValue(ref);
    23. std::cout << r <<" "<<g<<" "<<b<<" "<<std::endl;
    24. //Sleep(500/1000 );
    25. }
    26. }
    Alles anzeigen


    ud beim kompilieren kotzt mir das Programm folgende Fehlermeldung vor die füße:

    permission denied.
    id returned 1 exit status
    [Build error][dateiname.exe]Error 1

    ein wenig googeln hat ergeben, dass es möglicherweise irgendwas mit den bibliotheken zu tun hat.

    was soll ich tun?


    PS: vielen Dank für eure tips! @ zerd: hast du das studiert?
    [COLOR="LemonChiffon"]Wer das lesen kann, hat den Kontrast zu hoch eingestellt![/color]
  • Was für einen compiler benutzt du? Diese Fehlermeldung sagt ja mal garnichts aus....

    Ich habe die Vermutung das du bei den Linker-Settings keine Windows anwendung eingestellt hast. Ich bin mir nicht sicher ob man das Desktop-Handle bei einer Konsolenanwendung bekommen kann... (Ist nur eine idee, habe evs nie selber probiert)

    Außerdem könnte es sein das dein compiler meckert weil du eine Endlosschleife programmiert hast. wobei das wohl eher ein Laufzeitfehler werden könnte.

    Also ich habe meinen code mit dem Visual Studio in einer Windows anwendung ausprobiert und dort funktioniert es.... Schade das dein compiler keine hilfreichen meldungen ausspuckt...

    Permission denied klingt für mich danach als ob die exe verwendet wird und nicht überschrieben werden kann... aber ergibt auch nich so viel sinn....


    Kann dir sonst im Moment nicht weiterhelfen... falls du was findest sag bitte woran es lag, interessiert mich jetzt auch :)

    ps: Ich programmiere schon was länger und kann mit der MSDN umgehen ;) Aber studieren tu ich auch
    pps: Es könnte auch sein das du noch LIBs mit dazu linken musst die die ganzen funktionen brauchen und die VS2005 automatisch dazu linkt, ich hab ewig keinen anderen compiler benutzt, deshalb weiß ich das nicht so genau... wenn du das testen willst kannst du die einzelnen Funktionen in der MSDN suchen und schauen welche abhängigkeiten die Funktionen haben (steht ganz unten auf der seite auf der die funktionen beschrieben werden)
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]