FAQ GTK+Consultez toutes les FAQ

Nombre d'auteurs : 10, nombre de questions : 101, dernière mise à jour : 30 septembre 2008  Ajouter une question

 

Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette faq ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture, L'équipe GTK+.


SommaireGDKGdkPixbuf (5)
précédent sommaire suivant
 

Le GdkPixbuf est une structure dans laquelle on va pouvoir trouver différentes informations sur l'image ainsi que les données brutes de l'image. Il existe plusieurs manières de créer une image dans un GdkPixbuf:

  • Soit en déclarant une image vierge,
  • Soit en copiant tout ou partie d'une image existante,
  • Soit en chargeant une image depuis un support (DD, CD, DVD ...).

Une fois créée, les données brutes sont accessibles avec la fonction gdk_pixbuf_get_pixels.

Le GdkPixbuf est la base de tout traitement d'image sérieux avec GTK+. The Gimp en est le représentant. Plutôt que d'essayer de "monter une usine à gaz" en empilant des GtkImage dans des GtkTable et autres GtkBox, je vous enclins à vous pencher un peu sur cette manière de "dessiner". De nombreuses fonctions que vous trouverez ici sont à votre disposition pour manipuler des GdkPixbuf. Leur affichage final ne pose aucun problème puisque vous pouvez les intégrer directement dans un GtkDrawingArea ou bien les "convertir" en GtkImage.

Mis à jour le 30 septembre 2008 gerald3d

Pour accéder aux données, rien de plus simple si on peut dire. Le pixel en haut à gauche se trouve aux adresses suivantes :

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
/* Récupération du pointeur sur les données brutes. */ 
guchar *pixel=gdk_pixbuf_get_pixels(pixbuf); 
  
/* Récupération des composantes du pixel de coordonnées (0,0) */ 
guchar red, green, blue; 
red=pixel[0]; 
green=pixel[1]; 
blue=pixel[2];
Tout ceci c'est bien joli, mais comment faire si la couleur est codée sur 4 octets ? pixel[3] correspond alors à l'information de transparence, ignorez-le

Mis à jour le 30 septembre 2008 gerald3d

Il est important de savoir qu'une image n'est pas forcément codée avec 3 octets par pixel. On peut aussi en utiliser 4 ! Donc avant de vouloir "triturer" ces données il faut connaitre l'encodage. Pour cela on dispose de la fonction gdk_pixbuf_get_n_channels qui nous renverra le nombre d'octet par pixel.

Mis à jour le 30 septembre 2008 gerald3d

Cet octet permet de gérer la transparence de l'image. Vous pouvez l'ignorer si cette information ne vous sert à rien.

Mis à jour le 30 septembre 2008 gerald3d

Admettons que nous disposions d'une image de 100x50. Comment accéder rapidement à tout pixel de cette image ? Je vous donne ici le code d'une fonction simple qui vous renvoit les composantes des coordonnées d'un pixel transmises. Cette fonction renvoie FALSE si vous donnez une coordonnée hors image ou lorsque l'image vaut NULL.

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
gboolean gdkpixbuf_get_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); 
  
  *red   = pixel[(x*channel)+(y*width*channel)]; 
  *green = pixel[(x*channel)+(y*width*channel)+1]; 
  *blue  = pixel[(x*channel)+(y*width*channel)+2]; 
  
  return TRUE; 
}
Dans le même ordre d'idée on peut "inverser" cette fonction pour afficher un pixel. Voila une autre fonction qui a le même déroulement mais qui cette fois affecte une couleur à un pixel.

Code C : Sélectionner tout
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; 
}

Mis à jour le 30 septembre 2008 gerald3d

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique GTK+