Créer un DC temporaire, dessiner dedans et récuperer les pixels

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 20 déc. 2005 à 18:39
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 21 déc. 2005 à 16:09
Bonjour à tous,

je voudrais arriver à dessiner (opérations basiques du GDI) dans un DC temporaire, qui n'a pas pour vocation d'etre affiché.
Ce DC devra pouvoir etre très gros (plus grand que la résolution de l'écran, pour que ca ressemble un peu à un DC d'imprimante)
Après le dessin, j'aimerai récuperer un tableau de pixel, afin de l'analyser.

Voilà ce que j'ai essayé (en vain) :
--> Créer un DC (le problème c'est qu'on doit passer "DISPLAY" ou "WINSPOOL" à CreateDC et que j'ai rien réussi à faire avec CreateCompatibleDC)
--> Créer un bitmap compatible (mais ici, la largeur et la hauteur doivent etre supérieur à la résolution de l'écran, donc pas de CreateCompatibleDC(CreateDC("DISPLAY", ...)) )
--> Faire mes dessins (fillrect, lineTo, ...)
--> Tenter de récuperer les pixels avec GetDIBits (et plus précisement, la fonction GetBmpData de YMCA), mais j'obtiens toujours du noir (tableau rempli avec des 0)

Comment faire ?

Merci de votre aide

Nico

3 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 déc. 2005 à 19:00
HDC hScreen = GetDC(0);
HDC hdc = CreateCompatibleDC(hScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hScreen, x, y);
ReleaseDC(0, hScreen);
SelectObject(hdc, hbmp);

// Utilisation de hdc comme un DC normal

DeleteDC(hdc);
DeleteObject(hbmp);
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
21 déc. 2005 à 10:51
on m'a conseillé d'utiliser CreateDIBSection

voila ce que je fais :

BITMAPINFO bmInfo;
memset(&bmInfo.bmiHeader, 0, sizeof(BITMAPINFOHEADER));
bmInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth = 6714; // big size
bmInfo.bmiHeader.biHeight = 4662;
bmInfo.bmiHeader.biPlanes = 1;
bmInfo.bmiHeader.biBitCount = 24;


LPVOID pBit32;
HBITMAP hBmp = CreateDIBSection(0, &bmInfo, DIB_RGB_COLORS, &pBit32, NULL, 0);
HDC sdc = GetDC(NULL);
HDC memDc = CreateCompatibleDC(sdc);
HBITMAP holdobj = (HBITMAP) SelectObject(memDc, hBmp);


HBRUSH hBrush = CreateSolidBrush (RGB(255,0,0));
RECT rect = {2,0,20,200};
FillRect (memDc, &rect, hBrush) ;
DeleteObject (hBrush) ;


SelectObject(memDc, holdobj);
DeleteDC(hdc);
ReleaseDC(NULL, sdc);

mais bon, j'ai l'impression que pBit32 contient que des 0, alors qu'il devrait plutot y avoir du rouge ....

Qu'est-ce qui n'est pas bon ?

Merci de ton aide
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
21 déc. 2005 à 16:09
Bon, j'ai fait autrement

vive les DC
0
Rejoignez-nous