Forum Clubic

Détecter la couleur d'un pixel

Bonjour,

En fait j’aimerais trouver une fonction qui me donne l’état courant d’un certain pixel de l’écran.
J’imagine que les fonctions seront différentes que l’on soit sous windows ou linux. On va donc commencer par window.

En fait, j’aimerais juste faire un programme qui détecte quelle image est à un certain endroit de l’écran à un certain moment(il n’yaura que deux possibilités, et un seul pixel me permet de les différencier).

Je sais pas si j’ai été bien clair. En fait pour résumer je vous demande si il existe une fonction window qui me retourne la couleur d’un pixel de l’écran (et non pas de la fenetre de mon prog…)

Il faut que tu créé un DC (device context), que tu créé un handle compatible bitmap (CreateCompatibleBitmap), que tu le convertis en DIB (GetDIBits) ainsi tu auras accès aux données de l’image.
La tu n’as plus qu’à extraire les composantes RGB et faire ta comparaison.

Ou lire directement avec GetPixel?
C’est clair que ca devrait être lent mais si c’est juste pour quelques pixels.

Oui, c’est ce que j’ai dit plus haut car GetPixel à besoin d’une DIB.

EDIT : ah tient, ce n’est plus le cas, ça fonctionne aussi avec un hdc. :ane:

Donc en étant un poil plus clair, cela va me donner quoi exactement??

Déjà toutes les API que vous me citez sont du FWK microsoft?

Ensuite, je veux bien me créer un DC et tous ce que vous me proposez, mais comment je vais récupérer l’image qui est active à l’écran afin de récupérer les composantes de mon pixel précis.

Merci de vos réponses, et de vos futurs éclairsissements parce que là…

Sinon renvoyez moi vers une librairie pis j’essayerais de me débrouiller seul, mais impossible de trouver quoi que ce soit sur le net a ce sujet…

GetDC( GetDesktopWindow() );

GetDC( GetDesktopWindow() );

me retourne un HDC qui n’est pas valide. Avant toute chose, j’aimerais savoir si il doit y avoir des initialisations ou autres?
Désolé de mes questions peut etre un peu stupide, mais je viens de GTk et je dois dire que je suis vraiment assez perturbé de me plonger là dedans…


Procedure.l CaptureScreen(Left.l, Top.l, Width.l, Height.l)
Protected dm.DEVMODE
Protected BMPHandle.l, srcDC.l, trgDC.l, oldBM.l

    srcDC = GetDC_(GetDesktopWindow_()); GetWindowDC_(0);CreateDC_("DISPLAY", "", "", dm)
    trgDC = CreateCompatibleDC_(srcDC)
    BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height)
    oldBM = SelectObject_( trgDC, BMPHandle)
    BitBlt_( trgDC, 0, 0, Width, Height, srcDC, Left, Top, #SRCCOPY)
    SelectObject_( trgDC, oldBM)
    DeleteDC_( trgDC)
    ReleaseDC_( BMPHandle, srcDC)
    ProcedureReturn BMPHandle
EndProcedure

Procedure CaptureWindow()
Protected WindowSize.RECT
Protected WinHndl.l, ScreenCaptureAddress.l

    WinHndl= GetDesktopWindow_()
    If WinHndl
        GetWindowRect_(WinHndl, @WindowSize)
        ScreenCaptureAddress = CaptureScreen(WindowSize\Left, WindowSize\Top, WindowSize\Right - WindowSize\Left, WindowSize\Bottom - WindowSize\Top)
        CreateImage(0, WindowSize\Right - WindowSize\Left, WindowSize\Bottom - WindowSize\Top)
        StartDrawing(ImageOutput(0))
        DrawImage(ScreenCaptureAddress, 0, 0)
        StopDrawing()
        SaveImage(0, "D:\Prog\Purebasic\Compilers\Screenshot.bmp")
    Else
        ProcedureReturn 0
    EndIf
    ProcedureReturn 1
EndProcedure

CaptureWindow()

Fait rapido et en purebasic, vu que ça utilise pas mal les API, ça devrait rester compréhensible.
A noter qu’en GTK 2.6.x, tu as gdk_screen_get_root_window ().

Bon alors je comprends pas tout à ce code. Je suis désolé si je parais etre un boulay, mais le purebasic je comprends pas tout.

Les appels de fonctions sont a quelques choses près ce que j’avais compris, mais là tu fais un CreateCompatibleBitmap avec deux variables width, et height pas initialisé.

Ce que moi j’ai compris en lisant la doc sur le site msdn, voilà ce que je fais :


HWND hwnd = GetDesktopWindow();
HDC hdc = GetDC(hwnd);
COLORREF color;
color = GetPixel(hdc, 400, 400);

Mais ce bout de code me renvoit tout le temp 0xffffffff, donc je me dis qu’il y’a quelque chose qui va pas dans ce que j’ai fait…

Merci de m’aider SVP

Ce ne sont pas des variables mais des paramètres qui sont envoyés depuis la fonction CaptureWindow().
Essaye avec ça :


            HDC hdc = GetDC(0);
            COLORREF color;
            color = GetPixel(hdc, 400, 400);
            ReleaseDC(hdc);

Ca marche nickel merci beaucoup! :clap: