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 :

Problème d'affichage d'image


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut Problème d'affichage d'image
    à tous,

    Je souhaite afficher une image à partir de données disponible en mémoire (en utilisant gdk_pixbuf_new_from_data).

    Mais j'ai un problème lors de l'affichage de l'image : si j'affiche l'image alors que je ne suis pas dans le main : l'image est très détérioré....

    Ce sera plus simple avec un exemple :

    Code permettant l'affichage 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <gtk/gtk.h>
    #include <stdlib.h>
    #include <math.h>
     
     
    int main(int argc, char **argv)
    {
    	int cpt = 0;
    	int k,i;
     
    	GtkWidget *pWindow;
    	GtkWidget *pVBoxmain;
    	guchar pixels[200*200*3];
    	GdkPixbuf *pixbuf;
    	GtkWidget *pImage;
     
    	gtk_init(&argc, &argv);		// Initialisation de GTK
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "GtkMenu");
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 300, 300);
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit),NULL);
     
    	/* Creation de la première GtkVBox */
    	pVBoxmain = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(pWindow), pVBoxmain);
     
    	for (i=0;i<200;i++)
    	{
    		for (k=0;k<200;k++)
    		{
    			pixels[cpt] = 125;
    			pixels[cpt+1] = 125;
    			pixels[cpt+2] = 125;
    			cpt=cpt+3;
    		}
    	}
     
    	// sauvegarde du pixbuf
        pixbuf = gdk_pixbuf_new_from_data(pixels, GDK_COLORSPACE_RGB, FALSE, 8,200, 200, 200*3, NULL, NULL);
    	pImage = gtk_image_new_from_pixbuf(pixbuf);
     
    	gtk_box_pack_start(GTK_BOX(pVBoxmain), pImage, TRUE, TRUE, 0);
    	gtk_widget_show(pWindow);
        gtk_widget_show_all(pWindow);
     
        gtk_main();
        return EXIT_SUCCESS;
     
    }
    Et j'obtient bien l'image suivante, pas de problème :


    Par contre si je fais une fonction qui affiche l'image (j'ai juste copié/collé ce qu'il y avait dans 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
    #include <gtk/gtk.h>
    #include <stdlib.h>
    #include <math.h>
    void affiche();
     
    int main(int argc, char **argv)
    {
     
     
    	gtk_init(&argc, &argv);		// Initialisation de GTK
    	affiche();
        gtk_main();
        return EXIT_SUCCESS;
     
    }
     
    void affiche()
    {
    	int cpt = 0;
    	int k,i;
     
    	GtkWidget *pWindow;
    	GtkWidget *pVBoxmain;
    	guchar pixels[200*200*3];
    	GdkPixbuf *pixbuf;
    	GtkWidget *pImage;
     
     
    	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "GtkMenu");
    	gtk_window_set_default_size(GTK_WINDOW(pWindow), 300, 300);
    	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit),NULL);
     
    	/* Creation de la première GtkVBox */
    	pVBoxmain = gtk_vbox_new(FALSE, 0);
    	gtk_container_add(GTK_CONTAINER(pWindow), pVBoxmain);
     
    	for (i=0;i<200;i++)
    	{
    		for (k=0;k<200;k++)
    		{
    			pixels[cpt] = 125;
    			pixels[cpt+1] = 125;
    			pixels[cpt+2] = 125;
    			cpt=cpt+3;
    		}
    	}
     
    	// sauvegarde du pixbuf
        pixbuf = gdk_pixbuf_new_from_data(pixels, GDK_COLORSPACE_RGB, FALSE, 8,200, 200, 200*3, NULL, NULL);
    	pImage = gtk_image_new_from_pixbuf(pixbuf);
     
    	gtk_box_pack_start(GTK_BOX(pVBoxmain), pImage, TRUE, TRUE, 0);
    	gtk_widget_show(pWindow);
        gtk_widget_show_all(pWindow);
     
     
    }
    Et bien là, j'obtient une image dégradée :


    Quelqu'un aurait une idée pour remédier à cela? ou bien je n'utilise pas correctement le gdkpixbuf?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  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
    Je ne suis pa sûr que gdk_pixbuf_new_from_data fasse une copie des données que tu lui passes (c'est en particulier l'argument de type GdkPixbufDestroyNotify qui me fait dire ça). Donc si le GdkPixbuf garde une référence sur ta variable pixels qui a été déclarée localement, ça n'est pas étonnant que l'image soit corrompue quand tu essaies de l'afficher.

  3. #3
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Merci teuf13 pour ta réponse rapide!

    Je pensais aussi au début qu'il y avait un problème de variable locale mais même en déclarant tout les widgets et le tableau de pixels en global, j'obtiens la même image dégradée. Idem si je remplis le tableau de pixel dans le main et que j'effectue uniquement l'affichage dans la fonction affiche().

    Ce qui me trouble aussi c'est que dans mon programme, si j'enregistre l'image et que je la ré-ouvre, pas de problème d'affichage (mais à ce moment, je ne passe plus par un gdkpixbuf pour afficher l'image, uniquement une gtkimage)... mais c'est une solution qui n'est vraiment pas confortable...

    Donc si quelqu'un a une idée sur l'emploi du gdkpixbuf...
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  4. #4
    Membre confirmé Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Etant donne que tu as les valeurs RGB des pixels, tu peux dessiner dans ton Pixbuf pixel par pixel.

    Dans cette FAQ, gerald3d a donne une fonction permettant d'ecrire un pixel dans un pixbuf.

    Parce que je ne sais pas dans quelle mesure gdk_pixbuf_new_from_data traite les donnees du fameux data.

    Mais ce n'est qu'une idee

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Merci pour ton idée, je vais tester ça
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Au temps pour moi, j'ai fait le boulet dans mes tests, teuf13 avait raison, il ne faut pas que le tableau pixel soit déclaré en local...

    Merci pour vos réponses.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML/CSS/XSL] Problème d'affichage des images "dynamiqu
    Par popol55 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/04/2006, 16h24
  2. Problème d'affichage d'image...
    Par fabreizhad dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 21/03/2006, 12h43
  3. problème d'affichage d'image avec mozilla
    Par lyon31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/03/2006, 16h27
  4. Problème d'affichage d'image
    Par AurelBUD dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/09/2005, 11h56
  5. CSS Probléme d'affichage d'images
    Par tebonb dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/06/2005, 18h35

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