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 comme cela mais les valeurs de hauteur et de largeur de ma texture doivent être des puissances de deux et je ne connais pas par avance la taille de ma fenêtre.
- 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 :
Mais je n'obtiens aucune donnée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 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);
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.
Partager