à 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?