void* permet de passer un pointeur sur ce que tu veux
utilisation deGetDIBits pour obtenir les pixels d'un HBITMAP hBmp :
// tout d'abord on récupère des informations sur la taille du bitmap BITMAP bmpInfo; GetObject(hBitmap, sizeof(BITMAP), &bmpInfo);
// allocation mémoire. On va récupérer le bitmap en 32 bits/pixel pour simplifier // comme cela, on sera sur que chaque ligne du bitmap sera codé sur un nombre // d'octets multiple de 4. Si le bitmap n'est pas bottom-up (cas le plus fréquent) // mais top-down, bmpInfo.bmHeight est négatif. LPBYTE lpBits = new BYTE[4*bmpInfo.bmWidth*bmpInfo.bmHeight];
// initialisation structure BITMAPINFO BITMAPINFO bi; memset(&bi, 0, sizeof(BITMAPINFO)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = bmpInfo.bmWidth; bi.bmiHeader.biHeight = bmpInfo.bmHeight; bi.bmiHeader.biBitCount= 32; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biCompression= BI_RGB;
// récupération pixels HDC hdc = GetDC(NULL); GetDIBits(hdc, hBitmap, 0, bmpInfo.bmHeight, lpBits, &bi, DIB_RGB_COLORS); ReleaseDC(NULL, hdc);
ce code récupère donc les pixels en 32 bits par pixels (4 octets). les pixels sont stockés par ligne, de bas en haut et de gauche à droite couleurs du pixel (x,y) : R = lpPixel[4*bmpInfo.bmWidth*y+4*x] G = lpPixel[4*bmpInfo.bmWidth*y+4*x+1] B = lpPixel[4*bmpInfo.bmWidth*y+4*x+2]
tu pourrais récupér en 24 bits par pixels (3 octets) mais dans ce ca c'est plus compliqué la taille d'une ligne destockage doit être multiple de 4et il faut déterminer cette taille à partir de la largeur de l'image. en 4 octets, cette larceur est toujurs multiple de 4.
|