Récupération des pixels d'un DC

hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 - 16 déc. 2005 à 14:41
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 19 déc. 2005 à 18:46
Bonjour,
Je dispose d'un DC où je voudrais récuperer le tableau de byte correspondant aux pixels qui le composent.

Je me suis fortement inspiré de la source de YMCA, mais cela ne marche pas, je récupère que du noir.
Où me suis-je trompé ?

SIZE GetBmpSize(HBITMAP hBmp)
{
BITMAP bmpInfo;
GetObject(hBmp, sizeof(bmpInfo), &bmpInfo);
SIZE size;
size.cx = bmpInfo.bmWidth;
size.cy = bmpInfo.bmHeight;
return size;
}

LPVOID GetBmpData(HDC hdc, HBITMAP hBmp)
{
SIZE sizeBmp = GetBmpSize(hBmp);
if(sizeBmp.cy < 0)
return NULL;
DWORD dwSize = 4*sizeBmp.cx*sizeBmp.cy;
LPVOID lpMem = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if(lpMem == NULL)
return NULL;
BITMAPINFO bi;
ZeroMemory(&bi, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biWidth = sizeBmp.cx;
bi.bmiHeader.biHeight = sizeBmp.cy;
bi.bmiHeader.biCompression = BI_RGB;
int nResult = GetDIBits(hdc, hBmp, 0, sizeBmp.cy, lpMem, &bi, DIB_RGB_COLORS);
if(nResult != 0)
return lpMem;
VirtualFree(lpMem, 0, MEM_RELEASE);
return NULL;
}

// APPEL
int width = GetDeviceCaps(hdc, HORZRES);
int height = GetDeviceCaps(hdc, VERTRES);
HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height);
HBITMAP oldBmp = (HBITMAP)SelectObject(hdc, hbmp);
LPVOID lpDataBmp = GetBmpData(hdc, hbmp);
if(lpDataBmp != NULL)
{
SIZE sizeBmp = GetBmpSize(hbmp);
for (int y = sizeBmp.cy; y >=0 ; y--) // je commence par la dernière ligne
{
for(int x = 0; x < sizeBmp.cx; x++)
{
LPDWORD lpByte = (LPDWORD)lpDataBmp + sizeBmp.cx * y + x;
DWORD p = *lpByte; // je regarde la valeur de la couleur, qui vaut toujours 0
}
}
}
VirtualFree(lpDataBmp, 0, MEM_RELEASE);
SelectObject(hdc, oldBmp);
DeleteObject(hbmp);

Merci de votre aide

5 réponses

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
16 déc. 2005 à 22:12
C normal




HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height);
HBITMAP oldBmp = (HBITMAP)SelectObject(hdc, hbmp);

La tu creéé un HBITMAP vide.



LPVOID lpDataBmp = GetBmpData(hdc, hbmp);

La tu en tire un tableau mais vide.



C la ou tu remplis ton tableau (a la place de getpixel)



De memoire tu voulais pas te passer des BITMAP dans tes precedent post (ou je confond) ??



Sinon tu as un autres exemple (avec les bitmap et des tableaux)

http://www.codeguru.com/cpp/g-m/bitmap/specialeffects/article.php/c1779/



Sur leur site a la partie c++ / graphicmultimedia/ bitmap et palette tu
en trouvera des dizaines (JAMAIS ils utilisent setpixel et getpixel).
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
17 déc. 2005 à 19:57
En gros, pour remplir mon tableau, faudrait que je fasse un bitblt ? ou autre chose ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
18 déc. 2005 à 11:33
DSl je t 'avais confondu avec quelqu'un, du coup je voit plus trop le but de ton code !



http://www.cppfrance.com/forum.v2.aspx?ID=618463



Pour remplir ton tableau



Soit tu cherche a remplacer la commande SetPixel pour remplir toi meme
le tableau juste avec des operation de pointeur (tu le remplis de pixel
en RGB)

>>LPDWORD lpSrc = (LPDWORD)lpDataBmp+sizeSrc.cx*y+x

>> *lpSrc =....



Soit tu recupere un DC deja existant et donc deja plein, il fallait donc le recuperer et non le creer.



Et une foit le tableau rempli, la tu pourra le recopier dans un DC pour pouvoir le "bitbliter"
0
hilairenicolas Messages postés 398 Date d'inscription jeudi 30 octobre 2003 Statut Membre Dernière intervention 15 juin 2007 2
19 déc. 2005 à 14:28
alors, ce que je fais moi c'est ca :

int width = GetDeviceCaps(hdc, HORZRES);
int height = GetDeviceCaps(hdc, VERTRES);
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP memBM = CreateCompatibleBitmap(hdc, width, height);
HBITMAP oldBmp = (HBITMAP) SelectObject ( memDC, memBM );
LPVOID lpDataBmp = GetBmpData(memDC, memBM);

Et si j'ai bien compris, SelectObjet me remplis le memBM, (et en couleur, dixit msdn), donc pourquoi j'ai que du noir ? pourquoi que des 0 à l'adresse pointée par lpDataBmp ? Ou est l'erreur ? (je précise que mon DC est DT_RASPRINTER)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
19 déc. 2005 à 18:46
HDC memDC = CreateCompatibleDC(hdc);

Tu creé un HDC vide.



HBITMAP memBM = CreateCompatibleBitmap(hdc, width, height);

tu créé un HBITMAP qui ne contient rien



HBITMAP oldBmp = (HBITMAP) SelectObject ( memDC, memBM );

tu selectionnes le bitmap vide dans le DC vide



LPVOID lpDataBmp = GetBmpData(memDC, memBM);

Tu recupere donc un tableau vide. Ou veut tu voir de la couleur ??

Affiche une image dans memDC si tu veut avoir quelque chose.



En supposant ke hdc possede quelque chose essaye

LPVOID lpDataBmp = GetBmpData(hdc, memBM);
0
Rejoignez-nous