aztcaLISS
Messages postés91Date d'inscriptionsamedi 3 mai 2003StatutMembreDernière intervention25 avril 2008
-
20 déc. 2005 à 06:08
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDerniè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
Pamaury
Messages postés341Date d'inscriptionjeudi 3 avril 2003StatutMembreDernière intervention17 juin 20083 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
SnOOpss
Messages postés571Date d'inscriptionsamedi 3 avril 2004StatutMembreDerniè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
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.