Lire les pixels d'une SDL_Surface

Lire les pixels d'une SDL_Surface - C++ - Programmation

Marsh Posté le 23-03-2005 à 17:29:26    

Bonjour,
J'aimerais bien parvenir a interpreter les "pixels" (lire leur valeur rgb) d'une SDL_Surface, seulement y'as un truc que je comprend pas,  
Si par exemple j'ai obtenu ma surface via un LoadBMP , ben la tout va bien, mais j'essaye avec par exemple SDL_CreateRGBSurface, ou TTF_RenderText_Solid, ben la je ne lis que des 0 ou des 1  :??:  
exemple:
 
si je fais :  

Code :
  1. fond = SDL_LoadBMP("template.bmp" );
  2.     pix =static_cast<unsigned char *>(fond->pixels);
  3.     for(int df = 0;df < fond->w*fond->h*3;df++)
  4.     cout<<">>>"<<(int)pix[df]<<endl;


 
ben la pas de stress, j'ai bien les meme valeur rgb que dans la bmp, et si je fais:
 

Code :
  1. SDL_Color col;
  2. //...
  3. col.r=50;
  4. col.g=50;
  5. col.b=50;
  6. lcfont = TTF_OpenFont("./font/FreeMono.ttf", 14);
  7. if (!lcfont) fprintf(stderr, "Impossible de charger la police:%s\n", SDL_GetError());
  8. fond = TTF_RenderText_Solid(lcfont, "A",col);
  9.     pix =static_cast<unsigned char *>(fond->pixels);
  10.     for(int df = 0;df < fond->w*fond->h;df++)
  11.     cout<<">>>"<<(int)pix[df]<<endl;


 
Ben la, je voudrais lire des 50 la ou le texte apparait, et des zero ailleurs (vous voyez ce que je veux dire?) seulement, je n'ai que des zero et des "1" , et je comprend pas ce que ca represente? de plus on dirait que y'as pas autant de pixel que w*h, vu que dans le 2ème cas, si je met (df<fond->w*fond->h*3) comme condition du for, ca fait un seg fault.
Quelque peut il m'eclairer ?  :jap:

Reply

Marsh Posté le 23-03-2005 à 17:29:26   

Reply

Marsh Posté le 23-03-2005 à 19:30:35    

bon ok je crois que j'ai trouver,
grace a : http://sdldoc.csn.ul.ie/sdlpixelformat.php
 
apperement les 0 et 1 etaient des indices, tout simplement  :)

Reply

Marsh Posté le 23-03-2005 à 21:22:33    

TTF_RenderText_Solid t'a surement renvoyé une surface 8 bits utilisant une palette de couleurs (2 apparement).
 
Tu peux vérifier çà en regardant si fond->format->BitsPerPixel == 8. Si oui, tu peux aller jeter un oeil dans fond->format->palette :

Code :
  1. typedef struct{
  2.          int ncolors;
  3.          SDL_Color *colors;
  4.        } SDL_Palette;

Pour faire ce genre de parcour de buffer image comme tu fais, utilise une fonction getpixel qui se comporte différemment suivant le type de surface.
 
Dans ca cas, tu obtiens apparement une surface 8 bits, ce qui explique le fait que tu ais fond->w*fond->h valeurs et non pas fond->w*fond->h*3 (pour avoir les triplets RGB).
 
Tu peux écire les fonctions toi-même avec la doc ( http://sdldoc.csn.ul.ie/guidevideo.php#AEN112) ou bien utiliser SGE par exemple : http://www.digitalfanatics.org/cal/sge/ et sge_GetPixel (http://www.digitalfanatics.org/cal/sge/docs/pixels.html#sge_GetPixel)
 
Voilà, @+


Message édité par Evadream -jbd- le 23-03-2005 à 21:25:02
Reply

Marsh Posté le 23-03-2005 à 23:35:25    

ok, merci d'avoir répondu, ca confirme ce que je pensait, et merci aussi pour ce complément d'informations.   :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed