Probleme avec la recuperation de la couleur d'un pixel [Résolu]

Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
- - Dernière réponse : Alucards
Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
- 16 janv. 2006 à 21:11
salut ,



voila j'ai un loader de texture bmp/tga/pcx/jpg qui fonctionne nikel.

j'arrive a charger mes textures et les afficher.

une fois charger elles sont sous la forme d'un



unsigned char* imagedata[ width * height * conposant];



je voudrait recuperer la valeur R G B de chaque pixel et la stoker dans un tableau a 2 dimension :



rgb Img [ height][ width] ;



je connais height width j'ai donc pu creer mon tableau a 2D dynamiquement.



etj'ai un code du type :



for ( int i = 0; i < height; i++)

{

for ( int j =0; j < width; j++)

{

rgb color = GetPixelColor(i,j);

Img[i][j].r = color.r;

Img[i][j].g = color.g;

Img[i][j].b = color.b;

}

}



bref mon probleme se situe dans la fonction GetPixelColor(i,j) ou il
faut creer un index pour parcourir le tableau a 1 dimension et le faire
correspondre au tableau a 2d voila



si quelqu'un peut m'aider ca serait sympa merci d'avance
Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
3
Merci
salut,




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/opengl/glfunc03_16jo.asp

imagedata est un tableau a 2 dimensions de la taille spécifiée dans type.
pour toi GL_UNSIGNED_BYTE.

typedef BPP unsigned char
BPP imagedata[width][heigth].

@++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
salut,

je suis pas sur d'avoir bien compris ta question mais pour rajouter un index ne suffit-t-il pas de rajouter une variable ?

int k = 0;
for ( int i = 0; i < height; i++)
{
for ( int j =0; j < width; j++)
{
rgb color = GetPixelColor(i,j);
Img[i][j].r = color.r;
Img[i][j].g = color.g;
Img[i][j].b = color.b;
k++;
}
}

@++
Commenter la réponse de cs_patatalo
Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
0
Merci
ben en fait ma texture une fois chargée est sous forme d'un unsigned char* imagedata[width * height * bitparpixel];



bref je doit fabriquer un index pour parcourir mon imagedata lire mes 3 donnees RGB et les stoker dans un tableau a 2 dimension:



j'ai coder ceci mais je suis pas tres sur car je sais pas comment se
decode ma texture une fois chargee ( c a d si on lit d'abord la
premiere ligne puis les autres ou alors la premiere colonne et les
autres)



unsigned char * ptr;

for ( int i = 0; i < height; i++)

{

for ( int j =0; j < width; j++)

{

int index = 3 * ( j + i * width); // je multiplie par 3 car je lis les donées 3 par 3 (RGB)



ptr = imagedata[index];

Img[i][j].r = ptr[0];

Img[i][j].g = ptr[1];

Img[i][j].b = ptr[2];



}

}



je bosse sur un systeme de heightmap avec image en niveaux de gris ou
l'altitude d'un point est calculer en fonction du niveau de gris du
pixel ; et pour ca j'ai besoin de connaitre la valeur RGB de chaque
pixel de mon imagedata et comment la parcourir voila

Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
Commenter la réponse de Alucards
Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
0
Merci
donc j'ai fait un test avec une image uni color et a mon plus grand
desarroi il y a des altitudes ca me creer des montagnes et tout le
tralala alors que ca devrait etre plat



je comprend pas pkoi

Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
Commenter la réponse de Alucards
Messages postés
246
Date d'inscription
mercredi 5 janvier 2005
Statut
Membre
Dernière intervention
11 mars 2012
0
Merci
Si j'ai bien compris ton problème, tu trouve dans ton tableau imagedata[] les données présentées en série (Ra Ga Ba Rb Gb Bb Rc Gc Bc ...) et tu voudrais les stocker dans des tableaux respectifs pour R G et B c'est bien ça ? Et tu bloque à la construction de l'index de parcours de ton tableau imagedata ? (Ce n'est pas pour répéter, mais j'ai eu du mal à suivre ce que tu demandais, je dois pas encore être bien éveillé )

Ce qui me gène le plus c'est la manière dont tu calcul index :
int index = 3 * ( j + i * width);
Au passage, c'est du C++ ? Est-ce normal que à chaque ittération il y ai une redéfinition de la variable ? (Je ne sais pas je ne fait que du C)

Sinon pour revenir au problème, en fait j'aurais mis tout simplement un index+=3, car le but du jeu est de le parcourir 3 cases par 3 cases non ?

Enfin après je n'ai peutêtre rien compris à ta demande ou alors je me gourre complètement !
<hr size="2" width="100%"> Qui ne tente rien...

Ne risque pas d'avoir grand chose !!!

<hr siz="">
Commenter la réponse de mondrone
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
0
Merci
int index=0;
unsigned char * ptr;
for ( int i = 0; i < height; i++)
{
for ( int j =0; j < width; j++)
{
ptr = imagedata[index];
Img[i][j].r = ptr[0];
Img[i][j].g = ptr[1];
Img[i][j].b = ptr[2];

index+=3;

}
}

KeniiyK
Commenter la réponse de KeniiyK
Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
0
Merci
mondrome tu as tout compris ^^



Color_t Heightmap::GetColor(CTexture* Image, int i, int j)

{

int index = 3 * (i * Image->width + j);



Color_t* _color = (Color_t*) malloc(sizeof(Color_t));

unsigned char* ptr = &Image->ImageData[index];

_color->r = ptr[0];

_color->g = ptr[1];

_color->b = ptr[2];



return (*_color);

}
float Heightmap::Elevation(int i, int j)

{

Color_t pt_color = GetColor(&ImageMap, i,j);

float height = 255 - (pt_color.r + pt_color.g + pt_color.b) / 3;

return (height * EchelleVert);



}

voila mes 2 fonctions, une pour calculer la couleur du pixel et l'autre
pour la mettre en niveau de gris afin de fabriquer une altitude entre 0
et 255;

et voici ma boucle d'initialisation de mon tableau:



for( int i = 0; i < ligne; i++)

{

for( int j = 0; j < colonne;j++)

{

Map[i][j].x = j * pas;

Map[i][j].y = i * pas;

Map[i][j].z = Elevation(i,j);

}

}



ma facon de calculer l'index fonctionne j'ai trouvé; mon probleme se situe au niveau de mon imagedata mainteant.



voila la fonction qui me creer une texture

glGenTextures(1, &Texture.texID[0]);




glBindTexture(GL_TEXTURE_2D, Texture.texID[NO_FILTER]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);

glTexImage2D(GL_TEXTURE_2D, 0, 3, Texture.width, Texture.height, 0, Texture.type, GL_UNSIGNED_BYTE, Texture.ImageData);



et donc je ne sais pas comment lire le Imagedata; exemple mon loader
tga fabrique une image qui est un unsigned char*imagedata [width *
height * bpp] que je passe en parametre a glTexImage2D(); ( la ligne
orange)



maintenant je voudrais savoir comment sont rangées les donnees dans imagedata.

si ca commence par le bas de mon image ou le haut si c'est stokee ligne de pixel par ligne de pixel ou par colonne ? voila








Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
Commenter la réponse de Alucards
Messages postés
40
Date d'inscription
mercredi 26 mars 2003
Statut
Membre
Dernière intervention
3 septembre 2008
0
Merci
wahou genial merci a toi c'est exactement ce dont j'avais besoin,
maintenant je sais comment lire mon imagedata, et merci pour le lien ca
va beaucoup m'aider

encore merci
Tous les chemins mènent au RHUM !!!!!!!!!!!!!!!!!!!..............................
Commenter la réponse de Alucards