http://gtk.developpez.com/faq/?page=gdkpixbuf
Dans la fonction :
Récupérer width ne marche pas à tous les coups !
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 gboolean gdkpixbuf_set_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); pixel[(x*channel)+(y*width*channel)] = red; pixel[(x*channel)+(y*width*channel)+1] = green; pixel[(x*channel)+(y*width*channel)+2] = blue; return TRUE; }
Je viens de le tester, et il y a un décalage à chaque ligne qui devient de plus en plus important à mesure que l'on se déplace vers le bas de la fenêtre.
J'ai corrigé le problème en modifiant la fonction en allant chercher le rowstride 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 gboolean gdkpixbuf_set_colors_by_coordinates(GdkPixbuf *pixbuf, gint x, gint y, guchar red, guchar green, guchar blue) { guchar *pixels=NULL, *p=NULL; gint n_channels=0; gint width=0, rowstride=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; pixels=gdk_pixbuf_get_pixels(pixbuf); n_channels = gdk_pixbuf_get_n_channels (pixbuf); rowstride = gdk_pixbuf_get_rowstride (pixbuf); p = pixels + y * rowstride + x * n_channels; printf("%d\n", n_channels); p[0] = red; p[1] = green; p[2] = blue; return TRUE; }
Partager