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 :

Exemple de programme qui change tous les pixels noirs d'un GdkPixbuf en rouge


Sujet :

GTK+ avec C & C++

  1. #21
    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
    Quand je te dis de faire attention aux warnings à la compilation et à l'exécution, la moindre des choses ça serait d'y prêter attention avant de redonner ton code. En particulier quand je lance ton programme, j'ai un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (a.out:5619): Gtk-CRITICAL **: gtk_image_get_pixbuf: assertion `image->storage_type == GTK_IMAGE_PIXBUF || image->storage_type == GTK_IMAGE_EMPTY' failed
    qui avertit que le pixbuf renvoyé va être NULL...

    La solution en l'occurrence va être d'utiliser gdk_pixbuf_new_from_file et de créer ton GtkImage à partir de ce GdkPixbuf.

  2. #22
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    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 308
    Billets dans le blog
    5
    Par défaut
    Je mets mon grain de sel dans la conversion . Tu déclares un GtkWidget *pixbuf; que tu utilises ensuite comme un GdkPixbuf. Forcément ca coince.

  3. #23
    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, j'ai pas trop râlé sur les warnings à la compilation, ils sont très moches, mais dans ce cas précis il n'indiquait pas vraiment de problème.

  4. #24
    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 correction erreur copier/coller
    Une version qui marche pour moi serait

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
     
    void modifierpixel(GtkWidget *pButton, gpointer data);
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
          GtkWidget *pHBox;
        GtkWidget *pImage;
          GdkPixbuf *pixbuf;
     
     
            GtkWidget *bouton;
     
     
        gtk_init(&argc,&argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 400);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
        pixbuf = gdk_pixbuf_new_from_file("image.bmp", NULL);
    pImage = gtk_image_new_from_pixbuf(pixbuf);
    g_assert (pixbuf != NULL);
     
      bouton = gtk_button_new_with_label("Modifier pixel");
     
        /* Creation de la GtkBox verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
     
        /* Creation de la GtkHox verticale */
        pHBox = gtk_vbox_new(FALSE, 0);
     
        /* Ajout de la GtkVBox dans la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
    guchar red, green, blue;
     
     
    gint x=0,y=0;
     
    gdkpixbuf_get_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
     
     
     
     
    gtk_box_pack_start(GTK_BOX(pVBox),pHBox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHBox),bouton, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_BOX(pVBox),pImage, TRUE, TRUE, 0);
     
          /* Connexions des signaux: */
     
     
     
        /* Connexion du signal "clicked" du GtkButton */
        g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(modifierpixel), (GtkWidget*) pVBox);
     
     
     
     
     
     
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
     
    /* Fonction callback executee lors du signal "clicked" */
    void modifierpixel(GtkWidget *pButton, gpointer data)
    {
     
     
     
     
    }
     
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue)
    {
      guchar *pixel=NULL;
      gint channel=0;
      gint 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;
     
      pixel=gdk_pixbuf_get_pixels(pixbuf);
      channel=gdk_pixbuf_get_n_channels(pixbuf);
      rowstride=gdk_pixbuf_get_rowstride(pixbuf);
     
      *red   = pixel[(x*channel)+(y*rowstride)];
      *green = pixel[(x*channel)+(y*rowstride)+1];
      *blue  = pixel[(x*channel)+(y*rowstride)+2];
     
      return TRUE;
    }
    NB: il faudrait corriger gdkpixbuf_get_colors_by_coordinates dans la FAQ

  5. #25
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    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 308
    Billets dans le blog
    5
    Par défaut
    Oui. On en avait déjà parlé d'ailleurs. Le rowstride est une nécessité ici.

  6. #26
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    Pour le warning je ne les pas vus car avec codeblock quant le programme arrive à compilé même si juste apres il y a un segmentation fault je ne vois pas de méssage d'erreur dans Builds logs.
    A par sa t'on code marche bien maintenant j'essaye de modifier les pixels de l'image avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    j'arrive à dessiner un carré mais je n'arrive pas à le colorier en rouge (bien que en noir sa marche):
    gdkpixbuf_get_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);

    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
    while(x!=200)
    {
     x++;
     if(x==199)
     {
         x=0;
         y++;
     }
     
     if(y==200)
     {
     
      x=200;
     }
        blue=0;
        red=255;
        green=0;
     
        gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    }
    Et puis j'aimerai savoir comment enregistrer les modifications.
    Et encore a par sa sa saire à quoi cette fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     g_assert (pixbuf != NULL);

  7. #27
    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
    Citation Envoyé par grex1 Voir le message
    Pour le warning je ne les pas vus car avec codeblock quant le programme arrive à compilé même si juste apres il y a un segmentation fault je ne vois pas de méssage d'erreur dans Builds logs.
    Les messages à l'exécution se trouvent probablement dans un autre log.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    T'es sûr que des arguments de la fonction ? Je ne serais pas surpris qu'il y ait un warning lors de la compilation lors de l'appel à cette fonction...

    Et puis j'aimerai savoir comment enregistrer les modifications.
    Y a une fonction gdk_pixbuf_save je crois.

    Et encore a par sa sa saire à quoi cette fonction?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     g_assert (pixbuf != NULL);
    C'est une assertion, ça arrête le programme si la condition n'est pas vérifiée.

  8. #28
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    Tu veut dire quoi par t'es sûr que des arguments de la fonction ? je ne vois pas de warning car je ne sais pas comment afficher l'autre log pendent l'exécution.
    Tout se que je vois ses que mon programme compile malgré que je n'arrive pas à affecter la bonne couleur:

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
     
    void modifierpixel(GtkWidget *pButton, gpointer data);
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar red, guchar green, guchar blue);
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
          GtkWidget *pHBox;
           GtkWidget *pLabel;
        GtkWidget *pImage;
          GdkPixbuf *pixbuf;
     
     
            GtkWidget *bouton;
     
     
        gtk_init(&argc,&argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 400);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     pLabel=gtk_label_new("");
        pixbuf = gdk_pixbuf_new_from_file("image.bmp", NULL);
    pImage = gtk_image_new_from_pixbuf(pixbuf);
    g_assert (pixbuf != NULL);
     
      bouton = gtk_button_new_with_label("Modifier pixel");
     
        /* Creation de la GtkBox verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
     
        /* Creation de la GtkHox verticale */
        pHBox = gtk_vbox_new(FALSE, 0);
     
        /* Ajout de la GtkVBox dans la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
    guchar red, green, blue;
     
     
    gint x=0,y=0;
     
    gdkpixbuf_get_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
     
    while(x!=200)
    {
     x++;
     if(x==199)
     {
         x=0;
         y++;
     }
     
     if(y==200)
     {
     
      x=200;
     }
        blue=0;
        red=255;
        green=0;
     
        gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    }
     
     
    	gtk_image_set_from_pixbuf(GTK_IMAGE(pImage), pixbuf);
    gtk_box_pack_start(GTK_BOX(pVBox),pHBox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHBox),bouton, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_BOX(pVBox),pImage, TRUE, TRUE, 0);
             gtk_box_pack_start(GTK_BOX(pVBox),pLabel, TRUE, TRUE, 0);
     
          /* Connexions des signaux: */
     
     
     
     
        /* Connexion du signal "clicked" du GtkButton */
        g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(modifierpixel), (GtkWidget*) pVBox);
     
    gchar *chaine = NULL;
    chaine = g_strdup_printf ("%d", blue);
     
        gtk_label_set_text(GTK_LABEL(pLabel),chaine);
     
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
     
    /* Fonction callback executee lors du signal "clicked" */
    void modifierpixel(GtkWidget *pButton, gpointer data)
    {
     
     
     
     
    }
     
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue)
    {
      guchar *pixel=NULL;
      gint channel=0;
      gint 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;
     
      pixel=gdk_pixbuf_get_pixels(pixbuf);
      channel=gdk_pixbuf_get_n_channels(pixbuf);
      rowstride=gdk_pixbuf_get_rowstride(pixbuf);
     
      *red   = pixel[(x*channel)+(y*rowstride)];
      *green = pixel[(x*channel)+(y*rowstride)+1];
      *blue  = pixel[(x*channel)+(y*rowstride)+2];
     
      return TRUE;
    }
     
    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;
    }

  9. #29
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar red, guchar green, guchar blue);
    C'est bien ce que je pensais, les derniers arguments de ta fonction ne sont pas des pointeurs.

  10. #30
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    je vient de corriger les pointeurs mais toujours le même problème.
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
     
    void modifierpixel(GtkWidget *pButton, gpointer data);
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
          GtkWidget *pHBox;
           GtkWidget *pLabel;
        GtkWidget *pImage;
          GdkPixbuf *pixbuf;
     
     
            GtkWidget *bouton;
     
     
        gtk_init(&argc,&argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 400);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     pLabel=gtk_label_new("");
        pixbuf = gdk_pixbuf_new_from_file("image.bmp", NULL);
    pImage = gtk_image_new_from_pixbuf(pixbuf);
    g_assert (pixbuf != NULL);
     
      bouton = gtk_button_new_with_label("Modifier pixel");
     
        /* Creation de la GtkBox verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
     
        /* Creation de la GtkHox verticale */
        pHBox = gtk_vbox_new(FALSE, 0);
     
        /* Ajout de la GtkVBox dans la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
    guchar red, green, blue;
     
     
    gint x=0,y=0;
     
    gdkpixbuf_get_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
     
    while(x!=200)
    {
     x++;
     if(x==199)
     {
         x=0;
         y++;
     }
     
     if(y==200)
     {
     
      x=200;
     }
        blue=0;
        red=255;
        green=0;
     
        gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    }
     
     
    	gtk_image_set_from_pixbuf(GTK_IMAGE(pImage), pixbuf);
    gtk_box_pack_start(GTK_BOX(pVBox),pHBox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHBox),bouton, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_BOX(pVBox),pImage, TRUE, TRUE, 0);
             gtk_box_pack_start(GTK_BOX(pVBox),pLabel, TRUE, TRUE, 0);
     
          /* Connexions des signaux: */
     
     
     
     
        /* Connexion du signal "clicked" du GtkButton */
        g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(modifierpixel), (GtkWidget*) pVBox);
     
    gchar *chaine = NULL;
    chaine = g_strdup_printf ("%d", blue);
     
        gtk_label_set_text(GTK_LABEL(pLabel),chaine);
     
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
     
    /* Fonction callback executee lors du signal "clicked" */
    void modifierpixel(GtkWidget *pButton, gpointer data)
    {
     
     
     
     
    }
     
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue)
    {
      guchar *pixel=NULL;
      gint channel=0;
      gint 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;
     
      pixel=gdk_pixbuf_get_pixels(pixbuf);
      channel=gdk_pixbuf_get_n_channels(pixbuf);
      rowstride=gdk_pixbuf_get_rowstride(pixbuf);
     
      *red   = pixel[(x*channel)+(y*rowstride)];
      *green = pixel[(x*channel)+(y*rowstride)+1];
      *blue  = pixel[(x*channel)+(y*rowstride)+2];
     
      return TRUE;
    }
     
    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;
    }
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
     
    void modifierpixel(GtkWidget *pButton, gpointer data);
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
    gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
          GtkWidget *pHBox;
           GtkWidget *pLabel;
        GtkWidget *pImage;
          GdkPixbuf *pixbuf;
     
     
            GtkWidget *bouton;
     
     
        gtk_init(&argc,&argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 200, 400);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     pLabel=gtk_label_new("");
        pixbuf = gdk_pixbuf_new_from_file("image.bmp", NULL);
    pImage = gtk_image_new_from_pixbuf(pixbuf);
    g_assert (pixbuf != NULL);
     
      bouton = gtk_button_new_with_label("Modifier pixel");
     
        /* Creation de la GtkBox verticale */
        pVBox = gtk_vbox_new(FALSE, 0);
     
        /* Creation de la GtkHox verticale */
        pHBox = gtk_vbox_new(FALSE, 0);
     
        /* Ajout de la GtkVBox dans la fenetre */
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
     
    guchar red, green, blue;
     
     
    gint x=0,y=0;
     
    gdkpixbuf_get_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
     
    while(x!=200)
    {
     x++;
     if(x==199)
     {
         x=0;
         y++;
     }
     
     if(y==200)
     {
     
      x=200;
     }
        blue=0;
        red=255;
        green=0;
     
        gdkpixbuf_set_colors_by_coordinates(pixbuf, x, y,&red,&green,&blue);
    }
     
     
    	gtk_image_set_from_pixbuf(GTK_IMAGE(pImage), pixbuf);
    gtk_box_pack_start(GTK_BOX(pVBox),pHBox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHBox),bouton, FALSE, FALSE, 0);
            gtk_box_pack_start(GTK_BOX(pVBox),pImage, TRUE, TRUE, 0);
             gtk_box_pack_start(GTK_BOX(pVBox),pLabel, TRUE, TRUE, 0);
     
          /* Connexions des signaux: */
     
     
     
     
        /* Connexion du signal "clicked" du GtkButton */
        g_signal_connect(G_OBJECT(bouton), "clicked", G_CALLBACK(modifierpixel), (GtkWidget*) pVBox);
     
    gchar *chaine = NULL;
    chaine = g_strdup_printf ("%d", blue);
     
        gtk_label_set_text(GTK_LABEL(pLabel),chaine);
     
     
        gtk_widget_show_all(pWindow);
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
     
     
     
    /* Fonction callback executee lors du signal "clicked" */
    void modifierpixel(GtkWidget *pButton, gpointer data)
    {
     
     
     
     
    }
     
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue)
    {
      guchar *pixel=NULL;
      gint channel=0;
      gint 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;
     
      pixel=gdk_pixbuf_get_pixels(pixbuf);
      channel=gdk_pixbuf_get_n_channels(pixbuf);
      rowstride=gdk_pixbuf_get_rowstride(pixbuf);
     
      *red   = pixel[(x*channel)+(y*rowstride)];
      *green = pixel[(x*channel)+(y*rowstride)+1];
      *blue  = pixel[(x*channel)+(y*rowstride)+2];
     
      return TRUE;
    }
     
    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;
    }

  11. #31
    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
    Essaie de réfléchir à ce que tu veux faire plutôt que de faire des changements plus ou moins au hasard en fonction de ce que je dis. La solution n'est pas de changer le prototype de gdkpixbuf_set_colors_by_coordinates. Est-ce que tu penses que c'est utile d'avoir un guchar *red dans cette fonction ? Que veux-tu faire avec cet argument ? comment le passerais-tu en argument si c'était une fonction que tu écrivais toi ?

  12. #32
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    http://fr.wikipedia.org/wiki/Liste_d...A9es_au_hasard
    Plus sérieusement caisse que je peut faire d'autre que me fiait un peu au hasard et à un connaisseur quant je ne comprend pas un dialecte orible qui s'appelle l'anglais?
    Et puis quant je dessine( http://dysconcept.tk/ ) et que j'ajoute du hasard avec une petite touche de logique généralement sa marche très bien.
    Pour le guchar je me suis déjà posé la question, se qui est bizarre ses que habituellement le type char c'est pour les chaines de caractaire.
    Mais pour pouvoir s'afficher dans un gtk_label_set_text sa doit être convertit avec g_strdup_printf .
    Mais comme je peut quant même faire des calcules avec ses variables je n'est pas chercher à en savoir plus.
    Pour le code de la fonction je comprend presque comment elle fonctionne sauf quant elle fait appelle à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdk_pixbuf_get_n_channels(pixbuf);
    Et comme je les déjà dit je connais pas l'anglais donc pour se renseigné ses pas évident.

  13. #33
    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
    Citation Envoyé par grex1 Voir le message
    http://fr.wikipedia.org/wiki/Liste_d...A9es_au_hasard
    Plus sérieusement caisse que je peut faire d'autre que me fiait un peu au hasard et à un connaisseur quant je ne comprend pas un dialecte orible qui s'appelle l'anglais?
    Euh là je te demande uniquement de réfléchir un peu à un appel de fonction en C et à des affectations, ça n'a rien à voir avec se plonger dans la doc de l'API de gtk+. Tu ne vas pas t'en sortir si tu bricoles des trucs un peu au hasard sans chercher à comprendre ce que tu fais. Ca m'apprendra à écrire du code d'exemple au lieu de forcer la personne à écrire le code elle même pour qu'elle soit obligée de comprendre ce qu'elle fait...

    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
     
    struct MaStruct {
        char a;
    };
     
    void ma_struct_set_a (struct MaStruct *ma_struct, XXXXXX valeur)
    {
        ma_struct->a = valeur;
    }
     
     
    struct MaStruct ma_struct;
    YYYYYY valeur;
    valeur = 5;
    ma_struct_set_a (&ma_struct, ZZZZZZ);
    La question que je te pose, c'est qu'est-ce qu'il faut mettre à la place des XXXX, YYYYY et ZZZZZ pour que quadn t'appelle la fonction ma_struct_set_a, ça change la valeur de "a" dans la structure. Les histoires de pointeur/pas pointeur dans la déclaration/l'appel de la fonction set_pixel, c'est un problème très très proche.

  14. #34
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    J'ai toujours eu beaucoup de mal avec les structures, bien qu'en téhoris je comprend les structures il me faut beaucoup de concentration pour tout mettre en ordre.
    T'on code est loin d'être évident car en plus d'utiliser une structure il faut fait appelle au pointers.
    J'ai jamais eu de difficulté à comprendre les pointers mais ajouté au structure sa devient compliqué pour tout mettre en ordre.
    Pour t'est xxxx yyyy zzzzz j'ai chercher à comprendre a quoi il correspond si ses un non de structure ou le mots struct a été retirré grasse à un typdef sa devrai donner un code de se style.
    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
     
    struct MaStruct {
        char a;
    };
     
    void ma_struct_set_a (struct MaStruct *ma_struct, XXXXXX *valeur)
    {
        ma_struct->a = valeur;
    }
     
     
    struct MaStruct ma_struct;
    YYYYYY  valeur;
    valeur = 5;
    ma_struct_set_a (&ma_struct, &ZZZZZZ);
    Si ses juste un pointer sur une variable(la variable valeur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    struct MaStruct {
        char a;
    };
     
    void ma_struct_set_a (struct MaStruct *ma_struct, *XXXXXX valeur)
    {
        ma_struct->a = valeur;
    }
     
     
    struct MaStruct ma_struct;
    *YYYYYY = &valeur;
    valeur = 5;
    ma_struct_set_a (&ma_struct, *ZZZZZZ);
    Mais se ne doit pas être un pointer car sinon tu n'aurrais pas mis le pointer plus la variable dans la même fonction.
    Sa ne servirai pas a grand chose car le poiter et la variable contienne les même valeur.

  15. #35
    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
    Il n'y a pas d'étoiles à rajouter dans ce que j'ai écrit.
    XXXXX => char
    YYYYY => char
    ZZZZZ => valeur

    Par contre, je te conseille fortement d'essayer de te familiariser un peu plus avec les pointeurs et les structures quand tu as un peu de temps, ça te sera utile tôt ou tard en C

  16. #36
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    Pour les pointers je pensse pas avoir de gros propleme il suffis d'envoyé l'adresse d'une variable avec & et de récupéré sa valeur dans la fonction avec *.
    Quant je fait des erreur avec les pointers ses surtout des érreurs d'inattention car j'oublie d'ajouter & ou * .
    Mais je suis dyslexique donc ses normal ses aussi pour sa que je préfère faire des copier coller plus tot que recopier tout le code car en écrivent je risque de faire des fautes sens m'en rendre conte.
    Par contre se qui me pose problème ses les structure mais comme avec la GTK on utilises des structures toute faites sa me pause pas tros de problème.
    Pour les type je vois pas à quoi s'a m' avance tout les types(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GdkPixbuf,gint,gint,guchar,guchar
    ) on bien été renseigné dans les prototype de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     gdkpixbuf_set_colors_by_coordinates
    Apres si tu veut parlé de la fonction (je ne vois pas de fonction set pxel) qui se trouve à l'intérieur de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdkpixbuf_set_colors_by_coordinates
    je n'est pas son prototype donc je vois pas le probleme.
    Peut être que on doit remplacer tout les get par des set car se n'est pas la même fonction que get_colors_by_coordinates mais si sa avais été le cas tu me l'aurai dit et je pense pas quil y est une erreur dans le code de la fonction qui se trouve dans la fac.

  17. #37
    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
    Je parlais de gdkpixbuf_set_colors_by_coordinates, j'ai pas vérifié son nom avant de le redonner Et l'exemple que je donne avait pour but de t'aider à comprendre ce qu'il faut utiliser comme type (pointeur/pas pointeur) pour les argument red, green, blue. Tu ne souhaites pas modifier la valeur de ces arguments, donc il n'y a aucune raison de passer des pointeurs sur des valeurs entières (des guchar dans notre cas).

  18. #38
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    Si en parlent d'argument tu veut parler des red green blue.
    Et bien j'ai justement envie de modifier leur valeur car le but ses d'arriver a transformer le carré en rouge.
    Quant je regarde dans le label je vois que les valeur on bien été modifier mais quant je les renvois à la fonction gdkpixbuf_set_colors_by_coordinates sa modifis bien les pixel mais pas dans la couleur qui m'intéraisse.
    Par contre pour voir qu'elle sont les valeurs des pixel de l'image avec gdkpixbuf_get_colors_by_coordinates sa marche bien donc j'y comprend rien pourtant j'ai bien envoyé les adresses au pointers de la même façon.

  19. #39
    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
    Tu ne veux pas modifier la valeur des variables que tu passes en argument... Tu veux utiliser ces arguments pour définir une nouvelle valeur pour un pixel donné de ton GdkPixbuf.
    Dans le cas de la fonction "get", tu veux modifier la valeur des variables que tu passes en argument vu que ton but est de lire la valeur de ce pixel et de renvoyer cette valeur via les variables red, green, blue que tu as passées en argument. Les 2 cas sont donc différents.

    Si tu veux résoudre ton problème en y allant au pif, mets un guchar red, guchar green, guchar blue dans le prototype de ta fonction "set_pixel", recherche comment voir les warnings de ton compilateur (il faut peut être ajouter -Wall comme paramètre pour le compilateur) et fais des corrections au hasard jusqu'à ce que l'appel à set_pixel ne fasse plus de warning...

  20. #40
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 119
    Par défaut
    J'ai corriger mon code sa marche et je pensse avoir compris t'on explication.
    Pour les red green blue ses normal de ne pas envoyé leur adresse car on ne veut pas les modifier on veut modifier le pixbuf et il n'ont rien avoir avec le pixbuf.
    Par contre se que j'ai pas compris ses pourquoi on utilise pas de &pixbuf quant on l'envoi à la fonction car on veut modifier le pixbuf et non une copie de se pixbuf et comme se pixbuf à été déclaré en dehors de la fonctions logiquement on devrais envoyé sont adresse à la fonction.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2015, 06h45
  2. Programme qui liste tous les accès à Internet
    Par snoopy69 dans le forum Sécurité
    Réponses: 3
    Dernier message: 31/08/2006, 12h06
  3. Formulaire qui contient tous les champs d'une table
    Par cakeby dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2006, 09h22
  4. Utilisateurs qui ont tous les droits.
    Par seal3 dans le forum Shell et commandes GNU
    Réponses: 14
    Dernier message: 15/02/2005, 20h41

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