FAQ GTK+Consultez toutes les FAQ
Nombre d'auteurs : 10, nombre de questions : 101, dernière mise à jour : 22 février 2018 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+.
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.
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]; |
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.
Cet octet permet de gérer la transparence de l'image. Vous pouvez l'ignorer si cette information ne vous sert à rien.
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; } |
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; } |
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 çaLes 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 © 2024 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.