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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Exemple de programme qui change tous les pixels noirs d'un GdkPixbuf en rouge
    Bonjour,
    Je cherche à comprendre comment fonctionne les gtkpixbuf mais il y a très peut de documentation en français et je ne connais pas l'anglais.
    Je suis dyslexique sété déjà dur pour moi de me mettre a la gtk alors ne me demander pas d'apprendre l'anglais.
    Tout se que j'ai pus trouver en francais sur les gdkpixbuff
    c'est:
    http://gtk.developpez.com/faq/?page=gdkpixbuf

    A cote de sa je connais un peu de chose sur les pixels
    Comme il n'y a pas de tutorial en francais sur gtk pixbuff sa serai possible que vous me montrier juste un exemple de programme basic avec gdkpixbuff qui change tout les pixel noir d'une image en rouge?
    Je vous demande pas un tutoriel, rien qu'en regardent le code je devrait être capable de comprendre pas mal de chose.

  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
    Hmm, la FAQ sur les GdkPixbuf de developpez.com sur laquelle tu donnes un lien à des exemples de code pour accéder aux composantes (R,G,B) d'un pixel situé à des coordonnées (X, Y), pour changer tous les pixels noirs en rouge, il te suffit de réutiliser ce code pour itérer sur l'intégralité de ton image, pour chaque pixel de tester s'il est noir (R, G, B) == (0, 0, 0) et de le remplacer par un pixel rouge (R, G, B) = (255, 0, 0)

    Dans un premier temps, tu dois pouvoir te familiariser avec tout ça en créant un pixbuf tout noir, et en essayant de changer la couleur de pixels arbitraires.

    Je sais pas si ces explications sont suffisammetn claires, n'hésite pas à poser des questions sur le code de la FAQ pour les choses qui te paraissent dures.

  3. #3
    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 je poste içi c'est justement par se que ses loin d'être clair.
    J'ai déja tenté d'utiliser la fonction gdkpixbuf_get_colors_by_coordinates de differente fasson.
    Mais à chaque fois j'ai un segmentation fault donc en gros je peut même pas récupéré les valeur RVB du pixel en haut a gauche que sa commence déjà à planté:
    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
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
    void OnZoomIn(GtkWidget *pWidget, gpointer data);
    void OnZoomOut(GtkWidget *pWidget, gpointer data);
    void cassetoi(GtkWidget *pWidget, 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 *pBox;
    	GtkWidget *pBox2;
    	GtkWidget *pZoomIn;
    	GtkWidget *pZoomOut;
        GtkWidget *cassepixel;
    	GtkWidget *pScrolled;
    	GtkWidget *pImage;
     
    	gtk_init(&argc, &argv);
     
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 500, 500);
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
    	pBox = gtk_vbox_new(FALSE, 5);
    	gtk_container_add(GTK_CONTAINER(pWindow), pBox);
     
    	pBox2 = gtk_hbox_new(TRUE, 5);
    	gtk_box_pack_start(GTK_BOX(pBox), pBox2, FALSE, FALSE, 0);
     
    	pZoomIn = gtk_button_new_from_stock(GTK_STOCK_ZOOM_IN);
    	gtk_box_pack_start(GTK_BOX(pBox2), pZoomIn, TRUE, TRUE, 0);
    	pZoomOut = gtk_button_new_from_stock(GTK_STOCK_ZOOM_OUT);
    	gtk_box_pack_start(GTK_BOX(pBox2), pZoomOut, TRUE, TRUE, 0);
    	   cassepixel = gtk_button_new_with_label("cassepixel");
    gtk_box_pack_start(GTK_BOX(pBox2), cassepixel, TRUE, TRUE, 0);
     
    	pScrolled = gtk_scrolled_window_new(NULL, NULL);
    	gtk_box_pack_start(GTK_BOX(pBox), pScrolled, TRUE, TRUE, 0);
    	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrolled), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
     
    	pImage = gtk_image_new_from_file("imagedetest.png");
    	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pScrolled), pImage);
     
    	g_signal_connect(G_OBJECT(pZoomIn), "clicked", G_CALLBACK(OnZoomIn), pImage);
    	g_signal_connect(G_OBJECT(pZoomOut), "clicked", G_CALLBACK(OnZoomOut), pImage);
        g_signal_connect(G_OBJECT(cassepixel), "clicked", G_CALLBACK(cassetoi), pImage);
     
    	gtk_widget_show_all(pWindow);
     
    	gtk_main();
     
    	return EXIT_SUCCESS;
    }
     
    void OnZoomIn(GtkWidget *pWidget, gpointer data)
    {
    	GdkPixbuf *pSrcPixbuf, *pDestPixbuf;
    	gint iWidth, iHeight;
     
    	// Recuperation du GdkPixbuf //
    	pSrcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(data));
    	// Recuperation de la taille de l'image //
    	iWidth = gdk_pixbuf_get_width(pSrcPixbuf);
    	iHeight = gdk_pixbuf_get_height(pSrcPixbuf);
    	// Creation du nouveau GdkPixbuf //
    	pDestPixbuf = gdk_pixbuf_scale_simple(pSrcPixbuf, iWidth+10, iHeight+10, GDK_INTERP_NEAREST);
    	// Remplacement de l'ancien GdkPixbuf par le nouveau //
    	gtk_image_set_from_pixbuf(GTK_IMAGE(data), pDestPixbuf);
     
    	g_object_unref(pDestPixbuf);
    }
     
    void OnZoomOut(GtkWidget *pWidget, gpointer data)
    {
    	GdkPixbuf *pSrcPixbuf, *pDestPixbuf;
    	gint iWidth, iHeight;
     
    	// Recuperation du GdkPixbuf //
    	pSrcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(data));
    	// Recuperation de la taille de l'image //
    	iWidth = gdk_pixbuf_get_width(pSrcPixbuf);
    	iHeight = gdk_pixbuf_get_height(pSrcPixbuf);
    	// Creation du nouveau GdkPixbuf //
    	pDestPixbuf = gdk_pixbuf_scale_simple(pSrcPixbuf, iWidth-10, iHeight-10, GDK_INTERP_NEAREST);
    	// Remplacement de l'ancien GdkPixbuf par le nouveau //
    	gtk_image_set_from_pixbuf(GTK_IMAGE(data), pDestPixbuf);
     
    	g_object_unref(pDestPixbuf);
    }
     
    void cassetoi(GtkWidget *pWidget, gpointer data)
    {
    	GdkPixbuf *pSrcPixbuf, *pDestPixbuf;
    	gint iWidth, iHeight;
     
    	// Recuperation du GdkPixbuf //
    	pSrcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(data));
     
     
    guchar *red=NULL, *green=NULL, *blue=NULL;
     
     
    gint x=0,y=0;
     
    guchar *putaindepixel=gdkpixbuf_get_colors_by_coordinates(pSrcPixbuf, x, y,red,green,blue);
     
     
     
    	// Remplacement de l'ancien GdkPixbuf par le nouveau //
    	gtk_image_set_from_pixbuf(GTK_IMAGE(data), pDestPixbuf);
     
    	g_object_unref(pDestPixbuf);
    }
     
     
    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;
    }

  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
    Oula, c'est gros ce code. Tu pourrais déjà commencer par jouer avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gtk_init(..);
    pixbuf = gdk_pixbuf_new_from_file (...);
    gdkpixbuf_get_colors_by_coordinates (pixbuf...);

  5. #5
    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 pixbuf = gdk_pixbuf_new_from_file (...); il a déjà été utiliser dans la fonction main est envoyé à la fonction cassetoi.
    Pour le gdkpixbuf_get_colors_by_coordinates (pixbuf...); cette fonction se trouve dans la fonction cassetoi mais je n'arrive pas à l'utiliser correctement.
    Se code est grand mais je le comprend, j'ai fait que réutiliser un code que j'ai modifier pour y mettre un bouton qui maine la fonction casse toi sensés récupéré un pixel grasse à gdkpixbuf_get_colors_by_coordinates mais tout plante.

  6. #6
    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
    Se code est grand mais je le comprend, j'ai fait que réutiliser un code que j'ai modifier pour y mettre un bouton qui maine la fonction casse toi sensés récupéré un pixel grasse à gdkpixbuf_get_colors_by_coordinates mais tout plante.
    Justement, "tout plante", sans que tu saches trop d'où vient le problème. Si tu repars d'un code minimal pour expérimenter et comprendre pourquoi ça plante, ça permet de limiter les endroits où le plantage risque de se produire, donc ça simplifie grandement les choses et la compréhension.

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