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 :

Dessiner sur une image


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut Dessiner sur une image
    Bien le bonsoir,

    Je suis en train de coder un programme en C et je rencontre quelques difficultés avec GTK.
    Ma question a surement déjà été abordé mais je n'ai rien trouvé à ce sujet. (Je m'excuse donc si jamais tel est le cas)

    Bref voilà mon problème:
    Je dois afficher à l'écran une image et quand l'utilisateur clique dessus afficher un point (ou tout autre chose) là où il a cliqué.
    J'aurais besoin que quelqu'un me guide sur quelles fonctions utiliser pour faire ca.
    En sachant que pour le moment mon image est afficher avec un simple gtk_image_new_from_file().

    En faisant quelques recherches je suis tombée sur les gdk-pixbuf ?

    Si quelqu'un pouvait me filer un p'tit coup de pouce je l'en remercie d'avance

    Bonne soirée

  2. #2
    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
    Salut.

    Pour commencer et pour faire simple GdkPixbuf est LE format natif de traitement des images sous GTK+.

    Si tu désires simplement afficher une image "cliquable" et récupérer les coordonnées du point cliqué alors GtkImage suffit. Il faudra pour se faire encapsuler ton GtkImage dans un GtkEventBox, les GtkImage ne disposant pas du signal "clicked".

    Par contre, si tu veux pouvoir dessiner sur ton image, alors il te faudra passer par les GdkPixbuf.

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    Citation Envoyé par gerald3d Voir le message
    Par contre, si tu veux pouvoir dessiner sur ton image, alors il te faudra passer par les GdkPixbuf.
    Les GtkImage ne sont pas des GdkDrawable ? Il suffirait d'utiliser les primitives de dessin.

  4. #4
    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
    Citation Envoyé par gege2061 Voir le message
    Les GtkImage ne sont pas des GdkDrawable ? Il suffirait d'utiliser les primitives de dessin.
    Tu as tout à fait raison. J'ai répondu un peu trop vite. A force de travailler le dessin j'en suis venu à ne travailler qu'avec les GdkPixbuf. Déformation par habitude

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Bien le bonjour à vous

    Merci pour vos réponse!
    Donc si j'ai bien compris j'ai pas besoin de mettre mon image dans un pixbuf, pixmap ou autre ?

    Et je peux directement utiliser des gdk_draw ?
    Ha ben c'est parfait alors tout ca

    Par contre je viens de tester ca, et aucunes des fonctions gdk n'est reconnu!

    J'ai donc des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    undefined reference to 'gdk_gc_new'
    undefined reference to 'gdk_draw_points'
    Pourtant j'ai bien inclu <gdk/gdk.h>

    Quelqu'un aurait une idée?

    Encore merci

  6. #6
    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
    Inclus plutôt directement #include <gtk/gtk.h>. La lib. gdk est automatiquement intégrée puisqu'elle est la lib. parente de gtk.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Oui oui cette lib était déjà inclue
    J'ai résolu le problème en modifiant le fichier du projet et forcer le linkage des librairies gtk (allez savoir pourquoi ça ne marchait pas)

    Par contre maintenant j'ai du mal avec les fonctions de dessins.
    J'ai essayé la fonction pour dessiner plusieurs points: gdk_draw_points mais je ne comprend pas trop comment ça marche.
    Surtout le GdkGC ?

    Voilà ma fonction. Par contre j'ai sans doute un problème avec inter->image qui fait référence à ma structure contenant un GtkWidget * image.
    Je ne sais pas si je peux directement mettre ca 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
    22
    void dessin_point(t_int * inter, int x, int y)
    {
    	GdkGC * gc;
    	GdkPoint point[5];
    	GdkColor *color = NULL;
    	int i;
     
    	gc = gdk_gc_new(GDK_WINDOW(inter->image));
    	color->pixel = 32; // Définition d'une couleur
            color->red = 65500;
            color->blue = 0;
            color->green = 0;
    	gdk_gc_set_foreground(gc, &color); //obligé de le mettre ?
     
    	for(i=0;i<5;i++)
    	{
    		point[i].x=(x+i);
    		point[i].y=(y+i);
    	}
    	gdk_draw_points(inter->image, gc, point, 5);
     
    }
    J'appelle cette fonction dans une fonction callback, le problème vient peut être de là ?

    Sinon il est possible de dessiner un cercle rempli ? J'ai pas trouvé la fonction dans les drawing primitives ? (en même temps l'anglais et moi pas top).

    En tout cas merci

  8. #8
    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
    Sans trop chercher bien souvent il faut demander un rafraîchissement forcé du widget modifé. Essaye un gtk_widget_show(); sur ton image une fois le dessin terminé.

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Salut à toi.

    Encore merci pour ta réponse.

    Mais même avec le gtk_widget_show(), le programme plante, j'ai une erreur mémoire Mais on peut vraiment appliquer des fonction draw sur image sans passer par autre chose ? Parce que ca compile bien mais j'ai des erreurs en console après.
    Enfin ça doit être à cause de mon code pourri il faut que je re regarde ca.

    Par contre dernière question (désolée de vous embêter ).
    J'aimerais pouvoir maintenant récupérer la couleur du pixel où l'utilisateur clique et changer cette couleur par une autre.
    J'ai lu dans un topic précédent qu'il fallait utiliser les GtkColorSelection.
    Sauf que je n'ai pas compris comment on pouvait récupérer la couleur d'un pixel ?
    Le gtkcolorselection c'est justement pour sélectionner une couleur à appliquer ? Pas en récupérer?

    (Boulet mode désolé)

    Je sais que mes questions paraissent peut-être un peu "débile" mais je commence tout juste la programmation et je n'ai sans doute pas encore tout les repères nécessaires.

    Je vous remercie encore pour l'aide que vous apportez.

    Bonne soirée

  10. #10
    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
    Il faut être sûr que l'image est déjà affichée avant de vouloir la modifier. Au pire on peut faire un gtk_widget_release(); dessus avant. C'est aussi une piste à ne pas négliger. Si j'ai un peu de temps demain je te montrerai un exemple de code.

  11. #11
    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
    Chose promise, chose due.

    Voila donc un petit proramme sans prétention qui va charger une image depuis le disque dur (change le chemin et le nom de l'image pour qu'il pointe sur une de tes images) et l'afficher dans une fenêtre principale.

    Un callback est connecté à cette image. Il est appelé lorsque la souris passe sur l'image.

    Dans ce callback je crée une couleur rouge que j'ajoute au colormap de l'image. Ensuite je dessine un rectangle de cette même couleur par dessus l'image. Enfin je fixe la couleur courante à noire. Si je ne le faisais pas, les textes de l'application s'écriraient en rouge!

    Ce programme n'est qu'un exemple. Il est loin d'être optimisé. Il va juste permettre de comprendre comment faire ce que tu demandes :

    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
    #include <gtk/gtk.h>
     
    gboolean dessin_point(GtkWidget *eventbox, GdkEventMotion *event, GtkWidget *image)
    {
    	GdkColor color;
            GdkColormap *colormap;
     
    	// Mise au rouge de la couleur
    	color.red = 65535;
    	color.blue = 0;
    	color.green = 0;
    	colormap = gdk_drawable_get_colormap (image->window);
    	gdk_colormap_alloc_color (colormap, &color, FALSE, FALSE);
    	gdk_gc_set_foreground (image->style->fg_gc[GTK_WIDGET_STATE (image)], &color);
     
    	// Dessin d'un rectangle rouge sur l'image
    	gdk_draw_rectangle(image->window,image->style->fg_gc[GTK_WIDGET_STATE(image)], TRUE, 10,10,50,50);
     
    	// Mise au noir de la couleur
    	color.red = 0;
    	color.blue = 0;
    	color.green = 0;
            gdk_colormap_alloc_color (colormap, &color, FALSE, FALSE);
            gdk_gc_set_foreground (image->style->fg_gc[GTK_WIDGET_STATE (image)], &color);
     
    	return TRUE;
    }
     
    int main(int argc, char **argv)
    {
    	GtkWidget *eventbox=NULL;
    	GtkWidget *pWindow=NULL;
    	GtkWidget *image=NULL;
     
    	//Initialisation du module GTK+
    	gtk_init(&argc, &argv);
     
    	//creation de la fenetre principale
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
    	//fermeture de l'application
    	g_signal_connect(G_OBJECT(pWindow), " destroy",(GtkSignalFunc)gtk_main_quit, NULL);
     
    	//Insertion d'une image (pense à changer l'image)
    	image= gtk_image_new_from_file("./lixgreen_thumb.jpg");
    	eventbox=gtk_event_box_new();
    	gtk_container_add(GTK_CONTAINER(eventbox), image);
    	gtk_container_add(GTK_CONTAINER(pWindow), eventbox);
     
    	// Ajout du signal "déplacement de la souris" sur l'image
    	gtk_widget_add_events(eventbox,GDK_POINTER_MOTION_MASK);
     
    	//connexion du signal pour dessiner sur l'image
    	g_signal_connect(GTK_OBJECT(eventbox), "motion-notify-event", (GtkSignalFunc) dessin_point, image);
     
    	gtk_widget_show_all(pWindow);
     
    	gtk_main();
     
    	return 0;
    }

  12. #12
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Alors franchement merci à toi pour l'exemple.
    J'étais carrément parti dans le mauvais sens

    Par contre je comprend pas trop pourquoi pour les GdkGC tu utilises image->style->fg_gc[GTK_WIDGET_STATE(image)]?
    On peut dans pratiquement tous les cas utiliser ça ?
    Parce que je croyais qu'il fallait en créer un avec gdk_gc_new(). Mais si on peut s'en passer c'est encore mieux

    Avec ton code j'arrive qu'en même à mieux voir le truc Je m'étais même trompé dans les arguments de ma fonction g_signal_connect alors déjà -_-

    Par contre, la fonction gtk_widget_add_events() n'est pas obligatoire ? Enfin je les jamais utilisé donc c'est peut être spécial pour les primitives de dessin ?

    Avec ça je ne peux que y arriver :p

    Je te remercie pour la super explication


    Par contre est-ce que tu saurais m'expliquer comment récupérer la couleur d'un pixel et remplacer cette couleur par une autre ? (J'abuse là ? )
    Allé je te dérange pas plus longtemps, tu m'as déjà bien aidé et je t'en remercie (encore).

    Bonne fin de soirée

  13. #13
    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
    Tu peux utiliser un nouveau gc si tu veux. Il faut simplement ne pas oublier de libérer la mémoire une fois utilisé avec g_object_unref();

    La fct gdk_widget_add_events permet d'ajouter certains signaux à un widget. Par exemple ici les GtkEventBox ne disposent pas naturellement du signal "motion-notify-event" qui permet de déclencher un callback lorsque la souris se déplace dessus.

    Enfin pour récupérer la couleur d'un pixel tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    guint32 gdk_image_get_pixel (GdkImage *image, gint x, gint y);
     
    Gets a pixel value at a specified position in a GdkImage.
     
    image : a GdkImage.
     
    x : the x coordinate of the pixel to get.
     
    y : the y coordinate of the pixel to get.
     
    Returns : the pixel value at the given position.
    Et pour changer un pixel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void  gdk_image_put_pixel  (GdkImage *image,  gint x,  gint y, guint32 pixel);
     
    Sets a pixel in a GdkImage to a given pixel value.
     
    image : a GdkImage.
     
    x : the x coordinate of the pixel to set.
     
    y : the y coordinate of the pixel to set.
     
    pixel : the pixel value to set.
    Je te conseille toutefois d'utiliser plutôt les GdkPixbufs si tu dois manipuler les images au niveau des pixels.

  14. #14
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Salut à toi !
    Désolée du retard, j'ai eu quelques soucis niveau internet.

    Je te remercie pour ces fonctions, je viens de rajouter ça à mon code et ça marche très bien.
    Bon par contre pour savoir quelle couleur c'est avec le nombre retourné c'est pas très évident (nombre super long) mais avec plusieurs test je saurais faire la correspondance (mais si jamais c'est possible de convertir en rbv ?)

    Dernière question, j'arrive donc à récupérer la couleur d'un pixel sur une image affichée à l'écran, mais si jamais je veux la couleur d'un pixel sur une image qui n'est pas affichée mais en arrière plan, c'est possible aussi ?
    D'après mes test ça plante, mais j'ai pas encore approfondi.

    Mes questions sont tordues

    Encore merci à toi, grâce à toi mon programme prend forme

  15. #15
    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
    Citation Envoyé par Xunopa Voir le message
    Salut à toi !
    Bon par contre pour savoir quelle couleur c'est avec le nombre retourné c'est pas très évident (nombre super long) mais avec plusieurs test je saurais faire la correspondance (mais si jamais c'est possible de convertir en rbv ?)
    Le nombre retourné ? Il me semble que le retour dont tu parles est l'adresse du pointeur est non la composante rouge, verte ou bleue du pixel pointé.

    Citation Envoyé par Xunopa Voir le message
    Dernière question, j'arrive donc à récupérer la couleur d'un pixel sur une image affichée à l'écran, mais si jamais je veux la couleur d'un pixel sur une image qui n'est pas affichée mais en arrière plan, c'est possible aussi ?
    D'après mes test ça plante, mais j'ai pas encore approfondi.
    Bien sûr que c'est possible. Tant que tu travailles sur un GdkPixbuf initialisé.

    Une autre façon de faire est d'allouer un bloc mémoire de la taille de l'image désirée x3 bien sûr puisque chaque pixel est constitué de 3 données guchar*.
    Une fois le dessin terminé dans ce bloc mémoire tu utilises la fonction suivante pour dessin dans une fenêtre principale: gdk_draw_rgb_image();

  16. #16
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Le nombre retourné ? Il me semble que le retour dont tu parles est l'adresse du pointeur est non la composante rouge, verte ou bleue du pixel pointé.
    Oui justement. C'est pour ça que pour identifier la couleur du pixel c'est pas évident. Mais c'est bon

    Bien sûr que c'est possible. Tant que tu travailles sur un GdkPixbuf initialisé.
    Le problème c'est que la fonction gdk_image_get_pixel travaille sur des GdkImage .
    J'utilise donc la fonction gdk_drawable_get_image qui retourne une GdkImage à partir d'un GdkDrawable et je lui donne comme argument image->window avec image étant un GtkWidget tiré de gtk_image_new_from_pixbuf.

    Mais si l'image n'est pas affichée à l'écran, image->window ne peut évidemment pas marcher.
    Alors comment avoir une GdkDrawable à partir de mon pixbuf/image ?

    Il faut que je me penche encore là-dessus, gdk est pas encore mon ami

  17. #17
    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
    Si à la base tu as un GdkPixbuf, travailles sur lui directement.

    Si tu ne peux pas faire autrement, utilises la fct gtk_widget_realize(); qui va initialiser les widgets même s'ils ne sont pas encore affichés.
    Ainsi, tu peux déjà travailler les Gdk_Image de widget pas encore affichés.

  18. #18
    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'aurais tendance à recommander très fortement l'utilisation de GdkPixbuf quand même

  19. #19
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Par défaut
    Salut,

    Même avec la fonction gtk_widget_realize ça ne marche pas. Mais je m'y prend surement mal en fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    pixbuf = gdk_pixbuf_new_from_file("test.bmp", NULL);
    image_fond = gtk_image_new_from_pixbuf(pixbuf); //image non affichée juste chargée en mémoire ?
    gtk_widget_realize(image_fond);
     
    gdkimage = gdk_drawable_get_image(image_fond, 0, 0, 910, 809); //afin d'avoir une GdkImage pour la fonction dessous
    color.pixel= gdk_image_get_pixel (gdkimage, x, y);//récupération couleur pixel
    Après comme on peut le voir mon image est issue d'un pixbuf mais est juste chargée en mémoire je ne l'affiche nulle part, il me faut peut être la mettre quelque quelque part ?

    De plus j'essaie d'avoir la couleur d'un pixel sur cette image à la position x et y. Mais celles ci correspondent à des coordonnées dans mon event_box affichées (avec x = event->x), ça peut poser problème?

    Dans mon event_box j'affiche une image et l'image non affichée sur laquelle je veux récupérer la couleur fait la même taille alors....

    Bref c'est compliqué là >.<

  20. #20
    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 peux très facilement récupérer un triplet (R,G,B) correspondant au pixel de coordonnées (x,y) au sein de ton pixbuf, je sais pas si ça a déjà été dit dans ce thread, grossièrement ça va être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    guchar *pixels = gdk_pixbuf_get_pixels (pixbuf);
    gsize offset = y * gdk_pixbuf_get_row_stride(pixbuf) + x*gdk_pixbuf_get_n_channels (pixbuf);
     
    guchar r = pixels[offset];
    guchar g = pixels[offset + 1];
    guchar b = pixels[offset + 2];
    C'est du code assez approximatif, je ne suis pas 100% certain du calcul de offset ni de l'ordre des composantes dans le tableau pixels, mais ça donne une bonne idée de comment on peut manipuler un pixbuf.

Discussions similaires

  1. comment dessiner sur une image
    Par baracouda dans le forum Graphisme
    Réponses: 2
    Dernier message: 26/05/2006, 00h21
  2. Dessiner sur une image
    Par cquadjul dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/04/2006, 10h44
  3. Dessiner sur une image
    Par alex6891 dans le forum Java ME
    Réponses: 1
    Dernier message: 16/04/2006, 02h45
  4. Déplacer, zoomer, dessiner (sur) une image
    Par charlito dans le forum 2D
    Réponses: 4
    Dernier message: 22/02/2006, 01h58
  5. [Servlet] [Image] Dessiner sur une image
    Par gaia_dev dans le forum 2D
    Réponses: 5
    Dernier message: 01/09/2004, 17h11

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