Récupération des pixels d'une fenêtre cachée

sebcmoa Messages postés 4 Date d'inscription lundi 6 décembre 2004 Statut Membre Dernière intervention 21 novembre 2008 - 21 nov. 2008 à 16:13
SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011 - 7 déc. 2008 à 11:39
Bonjour,


Je vous expose mon problème :


- J'utilise la fonction glReadPixels sur une fenêtre invisible. Cela me
retourne bien les données...mais problème connu...cette fonction est
bien trop lente.


- J'essaie donc de récupérer les données de la fenêtre d'une manière
plus rapide. J'ai besoin d'avoir la valeur RGBA de chaque pixel de la
fenêtre pour faire des traitements dessus par la suite.


- J'ai déjà tenté de créer une texture OPENGL et de récupérer les
données avec les fonctions glCopyTexImage2D suivi de glGetTexImage mais les performances ne sont
pas meilleures que glReadPixels!


- Je me suis donc tourné vers l'API windows et getDIBits. getDIBits
n'est pas censé me retourner les valeurs de ALPHA mais un getDIBits +
un glReadPixels de la valeur ALPHA reste plus rapide qu'un glReadPixels
sur les données RGBA.

J'ai donc tenté le code suivant que j'ai trouvé en fouillant la toile :

Code :
HDC hDCMem = CreateCompatibleDC(s->native.window.hDC);
HBITMAP hBmp = NULL;
HGDIOBJ hOld;
HDC hDC;
LRESULT res;

RECT rect;
int temp,i,j;
unsigned long * temp_pix = pixels;

BITMAPINFO bitmap_info;

bitmap_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmap_info.bmiHeader.biWidth = width;
bitmap_info.bmiHeader.biHeight = -(signed)height;
bitmap_info.bmiHeader.biPlanes = 1;
bitmap_info.bmiHeader.biBitCount = 32;
bitmap_info.bmiHeader.biCompression = BI_BITFIELDS;
bitmap_info.bmiHeader.biXPelsPerMeter = 0;
bitmap_info.bmiHeader.biYPelsPerMeter = 0;
bitmap_info.bmiHeader.biClrUsed = 0;
bitmap_info.bmiHeader.biClrImportant = 0;
GetWindowRect(s->native.window.hWND, & rect);

hBmp = CreateCompatibleBitmap(hDCMem,width,height);
hOld = SelectObject(hDCMem, hBmp);

GetDIBits(hDCMem,hBmp,0,height,NULL,&bitmap_info,DIB_RGB_COLORS);

res = SendMessage(s->native.window.hWND, WM_PRINT, (WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT);

res = GetDIBits(hDCMem,hBmp,0,height,pixels,&bitmap_info,DIB_RGB_COLORS);

SelectObject(hDCMem, hOld);
DeleteObject(hDCMem);

Mais je n'obtiens aucune donnée...


Quelqu'un aurait-il une petite idée de comment récupérer les données d'une fenêtre cachée?

Merci par avance.

1 réponse

SebLinck Messages postés 212 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 23 juin 2011
7 déc. 2008 à 11:39
Salut,
Avec cette méthode il semble que tu ne peut pas récupérer
les pixels des fenêtres cachées.

Cordialement,
Sébastien.
0
Rejoignez-nous