[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
Dernière intervention
23 août 2008
- 1 avril 2005 à 22:05 - Dernière réponse : Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
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!
Afficher la suite 

Votre réponse

13 réponses

Meilleure réponse
licorna
Messages postés
6
Date d'inscription
samedi 14 août 2004
Dernière intervention
6 juillet 2005
- 9 avril 2005 à 12:17
3
Merci
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é.

Merci licorna 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

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

____________________
**Rouliann**
Life is short, program more!
Commenter la réponse de Rouliann
licorna
Messages postés
6
Date d'inscription
samedi 14 août 2004
Dernière intervention
6 juillet 2005
- 8 avril 2005 à 22:49
0
Merci
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.


Commenter la réponse de licorna
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 avril 2005 à 08:16
0
Merci
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!
Commenter la réponse de Rouliann
licorna
Messages postés
6
Date d'inscription
samedi 14 août 2004
Dernière intervention
6 juillet 2005
- 9 avril 2005 à 10:21
0
Merci
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)
Commenter la réponse de licorna
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 avril 2005 à 10:29
0
Merci
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!
Commenter la réponse de Rouliann
licorna
Messages postés
6
Date d'inscription
samedi 14 août 2004
Dernière intervention
6 juillet 2005
- 9 avril 2005 à 11:19
0
Merci
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.
Commenter la réponse de licorna
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 avril 2005 à 11:22
0
Merci
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!
Commenter la réponse de Rouliann
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 avril 2005 à 13:49
0
Merci
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!
Commenter la réponse de Rouliann
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 avril 2005 à 16:07
0
Merci
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!
Commenter la réponse de Rouliann
licorna
Messages postés
6
Date d'inscription
samedi 14 août 2004
Dernière intervention
6 juillet 2005
- 10 avril 2005 à 12:28
0
Merci
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...
Commenter la réponse de licorna
sergio78_
Messages postés
4
Date d'inscription
samedi 8 janvier 2005
Dernière intervention
19 avril 2005
- 19 avril 2005 à 15:53
0
Merci
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

@+
Commenter la réponse de sergio78_
Rouliann
Messages postés
115
Date d'inscription
samedi 20 décembre 2003
Dernière intervention
23 août 2008
- 9 juin 2005 à 11:54
0
Merci
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!
Commenter la réponse de Rouliann

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.