http://gtk.developpez.com/faq/?page=gdkpixbuf


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
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;
}
Récupérer width ne marche pas à tous les coups !

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;
}