Affichage d'images

XVII.VI.I. Affichage d'images avec Gdk

Il y a deux ou trois fonctions membres de tracé pour positionner les données d'une image dans une zone de dessin. draw_pixmap() peut copier dans une zone de dessin le contenu d'un objet Gdk::Drawable (la fenêtre d'une zone de dessin fait partie de cette classe). draw_bitmap() permet d'afficher une image bicolore dans une zone de tracé ; utilisez draw_image() si l'image comporte plus de deux couleurs.

Pour chacune de ces fonctions membres, le premier paramètre est le Gdk::GC. Le second est l'objet de type approprié à copier : Gdk::Drawable, Gdk::Bitmap ou Gdk::Image. Les deux paramètres suivants sont les coordonnées x et y du point de départ de la copie dans l'image à copier , puis les coordonnées x et y du point de destination de la copie dans la zone de dessin et enfin la largeur et la hauteur de la région à copier.

Il y a également une fonction membre pour dessiner à partir d'un objet Gdk::Pixbuf. Un tampon Gdk::Pixbuf est une enveloppe commode pour un ensemble de pixels. Il peut être lu à partir d'un fichier et manipulé de diverses manières.

La façon la plus courante pour créer un objet Gdk::Pixbuf est d'utiliser la fonction Gdk::Pixbuf::create_from_file(). Elle peut lire un fichier d'image, comme un fichier .png dans un tampon Gdk::Pixbuf prêt à être rendu.

L'objet Gdk::Pixbuf peut être rendu à l'aide de la fonction membre render_to_drawable ; elle prend peu de paramètres. Cette fonction est une fonction membre de la classe Gdk::Pixbuf (et non Gdk::Drawable) ; elle diffère des fonctions draw_* décrites plus haut. Ainsi, son premier paramètre est l'objet à tracer. Le deuxième est encore le contexte Gdk::GC. Les deux paramètres suivants définissent le point de départ dans l'image à copier, suivis par le point de destination dans la zone de tracé ainsi que par la largeur et la hauteur à tracer effectivement (ce n'est pas forcément la totalité de l'image, spécialement si vous répondez à un événement d'exposition d'une partie de la fenêtre). Pour terminer, il y a les paramètres de diffusion de l'image. Si vous prenez comme type de diffusion Gdk::RGB_DITHER_NONE, les paramètres de décalage de diffusion seront tous deux égaux à 0.

Voici un petit bout de code pour lier l'ensemble : (notez qu'habituellement, vous ne procédez pas au chargement de l'image à chaque fois dans le gestionnaire de l'événement d'exposition ! Ici, c'est uniquement pour que le code soit complet)

bool myarea::on_expose_event(GdkEventExpose* ev)
{
Glib::RefPtr<Gdk::Pixbuf> image = Gdk::Pixbuf::create_from_file("myimage.png");
image->render_to_drawable(get_window(), get_style()->get_black_gc(),
0, 0, 100, 80, image->get_width(), image->get_height(),
// tracer la totalité de l'image (de 0,0 à toute la largeur,hauteur) à 100,80
// dans la fenêtre
Gdk::RGB_DITHER_NONE, 0, 0);
return true;
}