IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[FAQ][SDL] Comment récupérer les pixels d'une surface ?


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Par défaut [FAQ][SDL] Comment récupérer les pixels d'une surface ?
    Voici une question à ajouter dans la FAQ en relation avec http://jeux.developpez.com/faq/sdl/?...odifier_pixels

    Pour récupérer un pixel, on peut accéder directement aux pixels grâce au membre pixels de la structure SDL_Surface qui est un pointeur sur les données de pixels.

    La fonction suivante sert à récupérer le pixel (x, y) d'une SDL_Surface (tiré de la doc officielle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Uint32 GetPixel(SDL_Surface* surface, int x, int y)
    {
        int bpp = surface->format->BytesPerPixel;
        /*  p est l'addresse du pixel que l'on veut récupérer */
        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
     
        switch(bpp)
        {
        case 1:
            return *p;
     
        case 2:
            return *(Uint16 *)p;
     
        case 3:
            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                return p[0] << 16 | p[1] << 8 | p[2];
            else
                return p[0] | p[1] << 8 | p[2] << 16;
     
        case 4:
            return *(Uint32 *)p;
     
        default:
            return 0;  /* Ne devrait pas arriver, mais supprime les avertissements du compilateur */
        }
    }

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    A noter qu'il y a la version là pour récuperer chaque composante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    /**
     * @brief détermine la couleur au position (x,y) d'une surface SDL
     *
     * @param surface la surface SDL
     * @param x la position horizontale
     * @param y la position verticale
     * @return la couleur au format Uint32
     */
    static Uint32 SDL_LireCouleurAux(const SDL_Surface* surface, int x, int y)
    {
      int bpp = surface->format->BytesPerPixel;
     
      Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
     
      switch(bpp)
      {
          case 1:
          return *p;
          case 2:
          return *(Uint16 *)p;
          case 3:
          if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
            return p[0] << 16 | p[1] << 8 | p[2];
          else
            return p[0] | p[1] << 8 | p[2] << 16;
          case 4:
          return *(Uint32 *)p;
          default:
          return 0;
      }
    }
     
     
    /**
     * @brief détermine la couleur au position (x,y) d'une surface SDL
     *
     * @param surface la surface SDL
     * @param x la position horizontale
     * @param y la position verticale
     * @param r là ou sera écrit la valeur correspond au rouge du pixel
     * @param g là ou sera écrit la valeur correspond au vert du pixel
     * @param b là ou sera écrit la valeur correspond au bleu du pixel
     */
    static void SDL_LireCouleur(const SDL_Surface * surface, int x, int y, Uint8 * r, Uint8 * g, Uint8 * b)
    {
     
      SDL_GetRGB(SDL_LireCouleurAux(surface, x, y), surface->format,
                 (Uint8*)   r, (Uint8*) g, (Uint8*) b);
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    /**
     * @brief écrit la couleur au position (x,y) d'une surface SDL
     *
     * @param surface la surface SDL
     * @param x la position horizontale
     * @param y la position verticale
     * @param pixel la nouvelle couleur au format Uint32
     */
    void SDL_EcrireCouleurAux(SDL_Surface* surface, int x, int y, Uint32 pixel)
    {
      int bpp = surface->format->BytesPerPixel;
      Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
     
     
      switch(bpp)
      {
          case 1:
          *p = pixel;
          break;
     
          case 2:
          *(Uint16 *)p = pixel;
          break;
     
          case 3:
          if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
          {
            p[0] = (pixel >> 16) & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = pixel & 0xff;
          }
          else
          {
            p[0] = pixel & 0xff;
            p[1] = (pixel >> 8) & 0xff;
            p[2] = (pixel >> 16) & 0xff;
          }
          break;
     
          case 4:
          *(Uint32 *)p = pixel;
          break;
      }
    }
     
    /**
     * @brief écrit la couleur au position (x,y) d'une surface SDL
     *
     * @param surface la surface SDL
     * @param x la position horizontale
     * @param y la position verticale
     * @param r la composante rouge du pixel
     * @param g la composante verte du pixel
     * @param b la composante bleu du pixel
     */
    void SDL_EcrireCouleur(SDL_Surface* surface, int x, int y, int r, int g, int b)
    {
      SDL_EcrireCouleurAux(surface, x, y,
                           SDL_MapRGB(surface->format, r, g, b));
    }
    Reprise de mon projet :

    http://subversion.developpez.com/pro...rc/ImageIO.cpp

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Petite correction orthographique...

    Il faut remplacer les au par à la dans les commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     * @brief détermine la couleur à la position (x,y) d'une surface SDL
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/07/2006, 05h18
  2. [VB.Net] Comment récupérer les proprietes d'une image ?
    Par Cirdan Telemnar dans le forum VB.NET
    Réponses: 2
    Dernier message: 29/06/2006, 16h15
  3. [ServerSocket][URL] Comment récupérer les arguments d'une URL?
    Par nramariavelo dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 20/06/2006, 14h46
  4. Réponses: 3
    Dernier message: 22/03/2006, 09h47
  5. Réponses: 3
    Dernier message: 10/03/2006, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo