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

GTK+ avec C & C++ Discussion :

Utiliser les gdkpixbuf


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 45
    Par défaut Utiliser les gdkpixbuf
    http://gtk.developpez.com/faq/?page=gdkpixbuf


    Dans la fonction :

    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
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar red, guchar green, guchar blue)
    {
      guchar *pixel=NULL;
      gint channel=0;
      gint width=0;
     
      if (!pixbuf) return FALSE;
      if (x<0 || y<0) return FALSE;
      if (x>gdk_pixbuf_get_width(pixbuf)) return FALSE;
      if (y>gdk_pixbuf_get_height(pixbuf)) return FALSE;
     
      pixel=gdk_pixbuf_get_pixels(pixbuf);
      channel=gdk_pixbuf_get_n_channels(pixbuf);
      width=gdk_pixbuf_get_width(pixbuf);
     
      pixel[(x*channel)+(y*width*channel)]   = red;
      pixel[(x*channel)+(y*width*channel)+1] = green;
      pixel[(x*channel)+(y*width*channel)+2] = blue;
     
      return TRUE;
    }
    Récupérer width ne marche pas à tous les coups !

    Je viens de le tester, et il y a un décalage à chaque ligne qui devient de plus en plus important à mesure que l'on se déplace vers le bas de la fenêtre.

    J'ai corrigé le problème en modifiant la fonction en allant chercher le rowstride de l'image :
    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
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar red, guchar green, guchar blue)
    {
        guchar *pixels=NULL, *p=NULL;
        gint n_channels=0;
        gint width=0, rowstride=0;
     
        if (!pixbuf) return FALSE;
        if (x<0 || y<0) return FALSE;
        if (x>gdk_pixbuf_get_width(pixbuf)) return FALSE;
        if (y>gdk_pixbuf_get_height(pixbuf)) return FALSE;
     
        pixels=gdk_pixbuf_get_pixels(pixbuf);
        n_channels = gdk_pixbuf_get_n_channels (pixbuf);
        rowstride = gdk_pixbuf_get_rowstride (pixbuf);
     
        p = pixels + y * rowstride + x * n_channels;
     
        printf("%d\n", n_channels);
     
        p[0] = red;
        p[1] = green;
        p[2] = blue;
     
        return TRUE;
    }

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    J'allais demander quelle était la question avant de réaliser que le but du post était de signalé un bug dans la doc présente sur le site Il faut effectivement utiliser la row-stride et pas la largeur (width) pour accéder au tableau de pixels. Il faudrait que qqu'un corrige ça

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 311
    Billets dans le blog
    5
    Par défaut
    Sans contredire ce qui est écrit et malgré que ce soit moi l'auteur de la fonction originale je cherche à comprendre pourquoi il y aurait un décalage à chaque ligne.

    le rowstride est égale au nombre de pixels sur une ligne multiplié par le nombre de canaux.

    Donc écrire y*rowstride ou y*width*channel revient au même.

    Pour moi, mais je peux me tromper, les deux fonctions se valent. Quelqu'un verrait-il la coquille ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Oui, le rowstride te permet d'ajouter du "padding" (des octets à ignorer) à la fin de chaque ligne. Donc les deux valeurs que tu cites ne sont pas forcément égales, d'où l'intérêt d'avoir un attribut "rowstride" pour savoir la largeur exacte d'une ligne.

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 311
    Billets dans le blog
    5
    Par défaut
    Aie ca me fait mal ce que tu dis. Ca remet toute ma programmation en question. Il me semblait que le tableau de guchar contenu dans un GdkPixbuf était linéaire, sans ajout de quelconques octets à ignorer en fin de chaque ligne. Faut que je relise la doc de plus prêt moi

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 311
    Billets dans le blog
    5
    Par défaut
    Et voila!!!

    La description dans la doc l'explique très bien :
    ... Rows in the image are stored top to bottom, and in each row pixels are stored from left to right. There may be padding at the end of a row. The "rowstride" value of a pixbuf, as returned by gdk_pixbuf_get_rowstride(), indicates the number of bytes between rows.
    Je souffre le martyre

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  3. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47
  4. Merci d'utiliser les TAG
    Par Cian dans le forum Etudes
    Réponses: 0
    Dernier message: 07/08/2003, 17h46
  5. Utiliser les frames
    Par laury dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/05/2003, 10h14

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