Obtenir les bits d'un bitmap

aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008 - 20 déc. 2005 à 06:08
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 22 déc. 2005 à 09:00
Salut, j'essais d'obtenir les bits d'un bitmap avec la fonction
GetBitmapBits mais je ne sais pas trop comment les bitmap fonctionnent.



la partie qui m'embête c'est le nombre de bits à passer en paramètre d'entré (à cbBuffer).

LONG GetBitmapBits(
HBITMAP hbmp, // handle to bitmap
LONG cbBuffer, // number of bytes to copy
LPVOID lpvBits // buffer to receive bits
);

Je sais que mon image est de 300 pixels par 200 pixel.
J'ai essayé de faire ceci:

GetBitmapBits(MyBitmap, 300*200, lpBits);

mais lorsque je fais SetBitmapBits(MyBitmap2, 300*200, lpBits); et
que j'affiche ce bitmap, il n'apparait que les 1/4 de l'image.

J'ai donc essayé de multiplier le tout par 4 pour pouvoir copier tous les bits
(c'est ce que je croyais) mais là quand j'affiche je ne vois qu'un caré noir.

si quelqu'un peut bien m'expliquer comme ça fonctionne faite moi le savoir

merci


azt

7 réponses

Pamaury Messages postés 341 Date d'inscription jeudi 3 avril 2003 Statut Membre Dernière intervention 17 juin 2008 3
20 déc. 2005 à 09:34
Je ne suit pas sûr de ce que j'avance mais si
cbBuffer,
est en octets
il ne faut probablement pas simplement passer 300*200 car
->tu ne tiens pas compte du nombre d'octets stockant chaque pixel
->tu ne tiens pas compte du padding
J'ai remarqué que la structure
BITMAP
permettait d'obtenir ces info avec le membre:
bmWidthBytes
Mais je ne sais pas comment on obtiens cette structure
Essaye de chercher comment on l'obtiens

A m a u r y
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
20 déc. 2005 à 09:38
Dans mes sources, dans l'exemple de rotation de bitmap tu trouveras ton bonheur (enfin j'espère)
http://www.cppfrance.com/code.aspx?ID=23921
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 déc. 2005 à 09:40
pour récupérer la taille d'un bitmap (attention c'est bien BITMAP la structure et par HBITMAP) :

BITMAP info;

GetObject(hBitmap, sizeof(BITMAP), &info);



ensuite, pour récupérer les pixels du bitmap, il faut remplir une structure BITMAPINFO :

BITMAPINFO bi;

bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bi.bmiHeader.biWidth = info.bmWidth;

bi.bmiHeader.biHeight = info.bmHeight;

bi.bmiHeader.biPlanes = info.bmPlanes;

bi.bmiHeader.biBitCount = 24;

bi.bmiHeader.biCompression = BI_RGB;



(en
ce qui concerne biPlanes, ca sera plus facile d'accéder aux bits si on
force à 24 bits par pixel la récup, cependant, je ne sais pas si on
peut mettre une valeur différente de info.bmBitCount).



allocation mémoire pour récupérer les pixels

attention : la largeur d'une ligne en mémoire doit être multiple de 4 octets, avec bourrage si nécessaire

DWORD dwWidthBytes = (3*info.bmWidth+3)/4;

DWORD dwImageSize = dwWidthBytes*info.bmHeight;

LPBYTE lpBits = new BYTE[dwImageSize];



récupération:

HDC hdc = GetDC(NULL);

GetDIBits(hdc, hBitmap, 0, info.bmHeight, &lpBits, &bi, DIB_RGB_COLORS);



accès au pixel de coordonnées (x, y)

attention
: les bitmap sont des bottom-up, ie la ligne 0 est en bas et croit en
montant (sauf si la taille du bitmap est négative).



RED = lpBits[y*dwWidthBytes+3*x];

GREEN = lpBits[y*dwWidthBytes+3*x+1];

BLUE = lpBits[y*dwWidthBytes+3*x+2];





si
le bitmap a une pronfondeur autre que 24 bits par pixels, l'accès n'est
pas le même (ma source Paint donne les formule pour 1, 2, 4 et 8 bits
par pixel avec une palette de couleur)



pour information, le
tableau bmiColors de la structure BITMAPINFO donne la palette de
couleur du bitmap pour 1, 2, 4 ou 8 bits par pixel.



cf le post de YMCA >> http://www.cppfrance.com/forum.v2.aspx?id=214581
0
aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008
20 déc. 2005 à 18:45
ok, je vais essayer ça

mais c'est quoi la différence entre GetDIBits et GetBitmapBits.



merci
azt
0

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

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
20 déc. 2005 à 19:00
0
aztcaLISS Messages postés 91 Date d'inscription samedi 3 mai 2003 Statut Membre Dernière intervention 25 avril 2008
21 déc. 2005 à 21:22
j'utilise GetDIBits, sauf que ça ne fonctionne pas.

J'ai copié des bouts de vos codes et je les ai modifié en fonction de mes variables

mais la fonction GetDIBits me retourne 0.



Voici le code:



BITMAP info;

ZeroMemory(&info, sizeof(BITMAP));

GetObject(MyBitmap, sizeof(BITMAP), &info);



BITMAPINFO bi;

ZeroMemory(&bi, sizeof(BITMAPINFO));

bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bi.bmiHeader.biWidth = info.bmWidth;

bi.bmiHeader.biHeight = info.bmHeight;

bi.bmiHeader.biPlanes = 1;

bi.bmiHeader.biBitCount =32;

bi.bmiHeader.biCompression = BI_RGB;



lpBits = new BYTE[info.bmWidth*info.bmHeight*4];

memset(lpBits, 0, info.bmWidth*info.bmHeight*4);

HDC hdc = GetDC(NULL);



GetDIBits(hdc, MyBitmap, 0, info.bmHeight, &lpBits, &bi, DIB_RGB_COLORS);

azt
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
22 déc. 2005 à 09:00
GetDIBits(hdc, MyBitmap, 0, info.bmHeight, lpBits, &bi, DIB_RGB_COLORS);
0
Rejoignez-nous