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 :

Modifier une image dans une Box


Sujet :

GTK+ avec C & C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par d�faut Modifier une image dans une Box
    Bonjour,

    J'ai 2 images dans une Vbox et je souhaite modifier une image en rempla�ant certains de ces pixels par ceux de l'autre image.
    Mon probl�me vient lors de l'actualisation des images.
    Voici mon code

    le main :

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include "fonction.h"
     
     
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
        GtkWidget *pImage;
        GtkWidget *pImage_texture;
        GtkWidget * pbutton;
        Image_struc* image_st;image_st = g_malloc(sizeof(Image_struc));
     
        /*initialisation de gtk*/
        gtk_init(&argc, &argv);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
        /*La fenetre ne pourra pas etre redimmensionnable*/
        gtk_window_set_resizable(GTK_WINDOW(pWindow),FALSE);
     
        /// Definition de la position
        gtk_window_set_position(GTK_WINDOW(pWindow), GTK_WIN_POS_CENTER);
     
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 1024, 768);
        gtk_window_set_title(GTK_WINDOW(pWindow), "Ma fenetre");
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        pVBox = gtk_hbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox);
     
        ///* Chargement des images a partir d'un fichier */
        image_st->wid_image1=gdk_pixbuf_new_from_file_at_size("./image1.jpg",300,300,NULL);
         pImage = gtk_image_new_from_pixbuf(image_st->wid_image1);
         gtk_box_pack_start(GTK_BOX(pVBox), pImage, FALSE, FALSE, 5);
     
       // GdkPixbuf * image_charge=gdk_pixbuf_new_from_file_at_size("./image2.png",300,300,NULL);
     image_st->wid_image2=gdk_pixbuf_new_from_file_at_size("./tux.jpg",300,300,NULL);
        pImage_texture = gtk_image_new_from_pixbuf(image_st->wid_image2);
            gtk_box_pack_start(GTK_BOX(pVBox), pImage_texture, FALSE, FALSE, 5);
     
     
       pbutton=gtk_button_new_with_label("Action");
       gtk_box_pack_start(GTK_BOX(pVBox), pbutton, FALSE, FALSE, 5);
     
     
     
    /// callback
    g_signal_connect (G_OBJECT(pbutton), "clicked", G_CALLBACK (remplir_image), (gpointer*)image_st);
     
     
        /*affichage de tout*/
        gtk_widget_show_all(pWindow);
     
        /*fermeture de gtk*/
        gtk_main();
     
        return EXIT_SUCCESS;
    }
    // Le fichier fonction.c
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include "fonction.h"
     
     void put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue)
    {
      int width, height, rowstride, n_channels;
      guchar *pixels, *p;
     
      n_channels = gdk_pixbuf_get_n_channels (pixbuf);
     
      g_assert (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
      g_assert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
      //g_assert (gdk_pixbuf_get_has_alpha (pixbuf));
      g_assert (n_channels == 3);
     
      width = gdk_pixbuf_get_width (pixbuf);
      height = gdk_pixbuf_get_height (pixbuf);
     
      g_assert (x >= 0 && x < width);
      g_assert (y >= 0 && y < height);
     
      rowstride = gdk_pixbuf_get_rowstride (pixbuf);
      pixels = gdk_pixbuf_get_pixels (pixbuf);
     
      p = pixels + y * rowstride + x * n_channels;
      p[0] = red;
      p[1] = green;
      p[2] = blue;
      //p[3] = alpha;
    }
     
     
    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 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);
     
      *red   = pixel[(x*channel)+(y*width*channel)];
      *green = pixel[(x*channel)+(y*width*channel)+1];
      *blue  = pixel[(x*channel)+(y*width*channel)+2];
     
      return TRUE;
    }
     
     
    void remplir_image(GtkWidget *pButton, gpointer data){
     
        Image_struc* image_st;
        image_st=(Image_struc*) data;
        GdkPixbuf* image_texture_buf=image_st->wid_image1;
        GdkPixbuf *image_charge=image_st->wid_image2;
     
        guchar rouge, vert, bleu;
        gint x;gint y;
        for (x=0;x<2;x++)
        {
        for (y=0;y<5;y++)
     
                {
                    g_print("ici x= %d",x);
                     g_print("  ici y= %d\n",y);
                gdkpixbuf_get_colors_by_coordinates(image_texture_buf,x,y,&rouge, &vert, &bleu);
                put_pixel(image_charge, x,y,rouge,vert,bleu);
                }
        }
     
     
     
     
    }
    // Le fichier fonction.h
    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
     
     void put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue);
    gboolean gdkpixbuf_get_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar *red, guchar *green, guchar *blue);
     
    void remplir_image(GtkWidget *pButton, gpointer data);
     
    typedef struct
    {
     
       GdkPixbuf *wid_image1;
       GdkPixbuf *wid_image2;
       GtkWidget *GtkWidget_1;
       GtkWidget *GtkWidget_2;
    }
    Image_struc;
    Peut-etre que le probl�me vient du fait que j'utilise des GdkPixbuf comme interm�diaire...
    Merci de votre aide.

  2. #2
    Expert confirm�
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    F�vrier 2008
    Messages
    2 315
    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 315
    Billets dans le blog
    5
    Par d�faut
    Bonjour.

    Ta d�marche est la bonne. Cependant lorsque tu r�cup�res un GdkPixbuf depuis un GtkImage c'est une copie.
    Une fois que ton pixbuf est modifi� il te faut mettre � jour le GtkImage avec la fonction gtk_image_set_from_pixbuf();.
    Ensuite un gtk_widget_show_all(); sera peut �tre n�cessaire pour rafra�chir l'IHM.

  3. #3
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par d�faut
    Merci, j'ai r�ussi.
    En effet, il fallait mettre mon l'image directement dans ma Vbox depuis la structure sans passer par pImage_texture et mettre � jour avec ta fonction.

    Bonne journ�e

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [D�butant] Manipulation d'images : int�grer une image dans une image
    Par noscollections dans le forum VB.NET
    R�ponses: 2
    Dernier message: 17/10/2014, 11h51
  2. modifier la position d'une image dans une galerie
    Par VIRGINIE87 dans le forum Langage
    R�ponses: 8
    Dernier message: 17/02/2010, 23h53
  3. Mettre une Image dans une Image
    Par shadowhocine dans le forum SWT/JFace
    R�ponses: 2
    Dernier message: 19/12/2006, 18h40
  4. R�ponses: 3
    Dernier message: 30/10/2006, 11h21
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    R�ponses: 3
    Dernier message: 29/04/2006, 14h19

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