[SDL] Obtenir la couleur d'un pixel dans une SDL_Surface

Résolu
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 1 avril 2005 à 22:05
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 - 9 juin 2005 à 11:54
Bonjour tout le monde!
Voilà je cherche une fonction capable de lire la couleur d'un pixel dans une SDL_Surface, j'ai cherché dans SDL_video.h mais rien qui ressemble à SDL_GetPixelColor...
Svp aidez moi! :(

____________________
**Rouliann**
Life is short, program more!
A voir également:

13 réponses

Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
2 avril 2005 à 09:21
Ou peut-être y a-t-il une méthode possible sans utiliser la SDL...

____________________
**Rouliann**
Life is short, program more!
1
licorna Messages postés 6 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 6 juillet 2005 1
9 avril 2005 à 12:17
Pour récupérer la couleur du pixel (5,10), tu as les 2 manières :

1) Tu peux utiliser la fonction dédiée :



Uint8 r, g, b;

SDL_GetRGB(5*surface->w+(10+1), surface->format, &r, &g, &b);



2) Tu peux lire directement les données de la surface :



SDL_LockSurface(surface); // Vérouillage de la surface

Uint8* pPixels = surface->pixels; // Récupération d'un pointeur vers les pixels de la surface

Uint8 r, g, b; // Variables servant à stocker la couleur du pixel choisi

r = *(pPixels+4*(5*surface->w+(10+1));

g = *(pPixels+4*(5*surface->w+(10+1))+1);

b = *(pPixels+4*(5*surface->w+(10+1))+2);

SDL_UnlockSurface(surface); //Dévérouillage de la surface



Ainsi, il faut bien comprendre qu'un pixel codé sur 32 bits est en fait
représenté sous forme d'un paquet de 4 octets en mémoire.


Dans ces 2 exemples, surface->w est la largeur de la surface en
pixels. De plus, dans le 2°, r, g et b sont récupérées en prenant la
valeur inscrite dans l'adresse en mémoire de chaque composante (dans
cet exemple, j'ai pris le cas d'une surface où les pixels sont codés
sur 32 bits, d'où le "4*" survenant dans le code).

J'espère que ça t'auras éclairé.
1
licorna Messages postés 6 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 6 juillet 2005 1
8 avril 2005 à 22:49
Pour récupérer la couleur d'un pixel d'une surface, il suffit d'utiliser la fonction :


<code class="FUNCDEF">void SDL_GetRGB
(Uint32
pixel, SDL_PixelFormat *fmt, Uint8 *r, Uint8 *g, Uint8 *b);

</code>



   Elle
place dans les pointeurs correspondants la valeur des 3 composantes du
pixel sp&#233;cifi&#233;. fmt doit &#234;tre un pointeur sur le champ "format"
 ta SDL_Surface.


0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 avril 2005 à 08:16
Et le "pixel" ? j'ai vu un exemple de cette fonction mais elle ne récupérai que la couleur du premier pixel mais pour moi l'idéal aurait été d'avoir une boucle de ce style :
for(y=0; y<surface->h; y++)
{
for(x=0; x<surface->w; x++)
{
//récupération des 3 composantes de couleur aux coord x et y
}
}

Est-ce que tu sais si c'est possible et si oui, comment fait-on ?

En tout cas merci d'avoir répondu j'étais désespéré! lol

____________________
**Rouliann**
Life is short, program more!
0

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

Posez votre question
licorna Messages postés 6 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 6 juillet 2005 1
9 avril 2005 à 10:21
Ce que tu veux faire est tout à fait possible avec une boucle semblable à celle-ci :



for(pixel=0; pixel<(surface->w)*(surface->h); pixel++)

SDL_GetRGB(pixel,surface->format,&r,&g,&b);



Cependant,
l'exécution d'une telle boucle pour la récupération de tous les pixels
d'une surface risque de s'avérer lent. Tu peux donc directement
récupérer la couleur des pixels de la surface en allant tout chercher
dans la SDL_Surface elle-même : en effet,

surface->pixels te donnera un pointeur de type *void
sur les données relatives à la couleur de tous les pixels de la surface
(stockées de manière séquentielle, cf. documentation de la SDL).

Attention, avant de pouvoir accéder au champ "pixels" de la SDL_Surface, celle-ci doit avoir été vérouillée ave la fonction :

SDL_LockSurface
(SDL_Surface *surface)

Tu devras ensuite la dévérouiller avec :

SDL_UnlockSurface
(SDL_Surface *surface)
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 avril 2005 à 10:29
bin ca revien au meme si les données sont stockées de manière séquentielle non? il faudrai faire :

int pixel = surface->pixel;

et incrémenter pixel
jusqu'au point spécifique dont je veux la couleur...

____________________
**Rouliann**
Life is short, program more!
0
licorna Messages postés 6 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 6 juillet 2005 1
9 avril 2005 à 11:19
Non, je pense que tu n'as pas compris, ou que
je me suis mal exprimé : l'argument "pixel" de la fonction SDL_GetRGB
est un n° de pixel de la surface (compris entre 0 et (w*h)-1 ) alors
que le champ "pixels" (avec un 's') de la structure SDL_Surface est un
pointeur sur les données relatives aux pixels d'une surface : autrement
dit, il s'agit là de l'adresse en mémoire de ces données.

Les 2 solutions que je t'ai donné plus haut sont donc totalement différentes :

- une fait appel à une fonction de renvoi de la couleur spécifique;

- l'autre permet simplement d'accéder aux données présentes en mémoire.
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 avril 2005 à 11:22
Hum... je saisis pas encore complètement... Comment on fait pour avoir la couleur du pixel se trouvant en (5,10) par exemple ?

____________________
**Rouliann**
Life is short, program more!
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 avril 2005 à 13:49
Merci beaucoup je vais tester ça dans la journée et je reviendrais te dire si ça marche! ;)
En tout cas merci!!!

____________________
**Rouliann**
Life is short, program more!
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 avril 2005 à 16:07
Problème : au lieu d'avoir la valeur des 3 composantes r, g, et b, j'ai la même valeur dans chacune des variables et c'est la valeur de l'index... Pour que le prog fonctionne j'ai dû changer la ligne

Uint8* pPixels = surface->pixels;

en
Uint8* pPixels = (Uint8*) surface->pixels;

Je pense pas que ca vienne de là mais c'est la seule chose que j'ai changé...
Sinon pour la valeur de l'index on peut simplifier en:

index = *(pPixel+10+5*(font->w+2));

Moi je vais pouvoir me débrouiller avec ça mais j'aimerais bien savoir pourquoi je n'arrive pas à obtenir la valeur RGB.... :s

____________________
**Rouliann**
Life is short, program more!
0
licorna Messages postés 6 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 6 juillet 2005 1
10 avril 2005 à 12:28
Je ne comprends pas moi non plus pourquoi tu
n'obtiens pas les 3 valeurs voulues car j'ai testé et cela fonctionne
chez moi, à un détail près : avec mon PC (je ne sais pas si c'est une
généralité), les pixels ne sont pas codés dans l'ordre R, G, B mais
dans l'ordre B, G, R...
0
sergio78_ Messages postés 4 Date d'inscription samedi 8 janvier 2005 Statut Membre Dernière intervention 19 avril 2005
19 avril 2005 à 15:53
Salut,



je souhaite analyser une image prise par une camera, est-ce que je peux utiliser cette fonction à votre avis ?

Et comment je l'utilise réellement ?

Je pense ca serrait plus simple de se parler sur msn !

mon msn c'est : sergmarpsg@hotmail.com

@+
0
Rouliann Messages postés 115 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 23 août 2008 1
9 juin 2005 à 11:54
j'ai enfin compris pourquoi je n'avais que la valeur de l'index !!! :D
(completmen à la ramasse moi ^^ lol) c'est parce que j'utilisais des
images au format .gif !! hihi ^^

A+

==========
**Rouliann**
C++ For Fun!
0
Rejoignez-nous