Bitmap et pixel

Résolu
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011 - 12 juin 2009 à 01:25
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 - 15 juin 2009 à 12:44
Bonsoir,
quelqu'un connaiterait-il la facon dont il faut s'y prendre pour charger un BMP de 320*240

et recuperer la couleur en R G B (0 a 255) de chacun de ces pixel dans un tableau style :
int x,y;
int couleurR[320][240];

for(x = 0;x < 320;x++)
{
for(y = 0;y<240;y++)
{
couleurR[x][y] = Red Couleur a ce pixel;
etc...
}
}

merci d'avance.

9 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
12 juin 2009 à 08:50
Salut
Au lieu de récupérer les valeurs pixel par pixel, utilise la fonction GetBitmapBits().
GetBitmapBits (hBmpImg,W*H*4,ucBits);

Dans ucBits sera copier tous les pixels de ton image:
ucBits[0], bleu du pixel 0
ucBits[1], vert du pixel 0
ucBits[2], rouge du pixel 0
ucBits[3], transparence di pixel 0
ucBits[4], bleu du pixel 1.....
A+
____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 juin 2009 à 19:07
Oui mais selon MSDN GetBitmapBits() est dépassée et devrait être remplacée par GetDIBits(). Il existe une autre solution pour récupérer les bits du bitmap. On le charge avec LoadImage() en mettant LR_CREATEDIBSECTION en dernier paramètre comme ceci par exemple:
HBITMAP hbitmap=(HBITMAP) LoadImage(0, "c:\\image.bmp",IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
On récupère ensuite les données du bitmap y compris les valeurs des bits en utilisant GetObject().
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 juin 2009 à 02:30
Salut,
Sous Windows, une solution consiste à créer un HDC avec CreateCompatibleDC() et lui associer ton bitmap avec SelectObject(). Ainsi, tu pourras utiliser GetPixel() pour récupérer les valeurs RGB de chaque point en spécifiant ses coordonnées.
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
12 juin 2009 à 21:15
HBITMAP hbitmap=(HBITMAP) LoadImage(0, "c:\\scheme.bmp",IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
CreateCompatibleDC(Bitmap);
SelectObject(Bitmap,hbitmap);
COLORREF Colors;

puis dans ma boucle
Colors = GetPixel(Bitmap,i,j);

et je convertie comme sa :
Colors & 0x000000FF;
(Colors & 0x0000FF00) >> 8;
(Colors & 0x00FF0000) >> 16;

mais a l'affichage, rien n'apparait ( je precise qu'il sagit d'une image que j'ai recuperer de la webcam et que je remplace certaine couleur par une autre.
le truc c'est que quand je rentre la couleur moi meme, sa marche exemple
0 255 0
mais quand je met les couleur du bitmap sa ne fonctionne pas !
Merci
0

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

Posez votre question
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
12 juin 2009 à 21:17
aussi le probleme vient peut etre que la couleur de la webcam est 16bits et celle du bitmap 24 :\
mais la conversion me parait bonne.
je vais faire un test en 256.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 juin 2009 à 21:52
Attention, CreateCompatibleDC() prend en paramètre un HDC ou 0 pour l'écran.
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
12 juin 2009 à 22:04
oui mais j'ai HDC Bitmap;
0
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
13 juin 2009 à 02:56
J'ai reussis ! mais... mon image 240 * 320 ( j'ai converti les couleurs de mon bmp 24b en 255 255 255) mais l'image se repete et se superpose sur mon affichage qui fait pourtant bien 320 x 240.
une idée ?

LPBYTE lpBits = new BYTE[4*320*240];
HBITMAP hbitmap=(HBITMAP) LoadImage(0, "c:\\scheme.bmp",IMAGE_BITMAP,0,0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
GetBitmapBits (hbitmap,240*320*4,lpBits);


int i,j;
for(i = 0; i < 240; i++)
{
for(j=0; j<320; j++)
{

TblImage[ID_Bmp].points[i][j].R = lpBits[4*320*(239-i)+4*j+2];
TblImage[ID_Bmp].points[i][j].G = lpBits[4*320*(239-i)+4*j+1];
TblImage[ID_Bmp].points[i][j].B = lpBits[4*320*(239-i)+4*j];

}
}
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
15 juin 2009 à 12:44
Si tu l'a converti en 24 bits par pixel, il faut multiplier par 3 et non par 4
Pour accéder au bits x=30 et y=90, il faut faire:
ucBits[(x+y*Width)*3]
A+
____________________________________________________________________________
Mon site internet :  
http://ImAnalyse.free.fr
0
Rejoignez-nous