Probleme avec la recuperation de la couleur d'un pixel

Résolu
Alucards Messages postés 40 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 3 septembre 2008 - 15 janv. 2006 à 18:32
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 !!!!!!!!!!!!!!!!!!!..............................

8 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
16 janv. 2006 à 19:45
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].

@++
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
15 janv. 2006 à 20:43
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++;
}
}

@++
0
Alucards Messages postés 40 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 3 septembre 2008
15 janv. 2006 à 22:32
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 !!!!!!!!!!!!!!!!!!!..............................
0
Alucards Messages postés 40 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 3 septembre 2008
15 janv. 2006 à 22:36
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 !!!!!!!!!!!!!!!!!!!..............................
0

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

Posez votre question
mondrone Messages postés 246 Date d'inscription mercredi 5 janvier 2005 Statut Membre Dernière intervention 11 mars 2012
16 janv. 2006 à 11:01
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="">
0
KeniiyK Messages postés 326 Date d'inscription vendredi 13 août 2004 Statut Membre Dernière intervention 2 novembre 2007 2
16 janv. 2006 à 11:20
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
0
Alucards Messages postés 40 Date d'inscription mercredi 26 mars 2003 Statut Membre Dernière intervention 3 septembre 2008
16 janv. 2006 à 18:32
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 !!!!!!!!!!!!!!!!!!!..............................
0
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
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 !!!!!!!!!!!!!!!!!!!..............................
0
Rejoignez-nous