Redimensionner une image
1. Introduction
Dans certaines situations, il peut être nécessaire d'afficher une image dans une taille différente que celle de l'image elle-même (affichage de miniature, etc...). Le seul petit souci, c'est que le widget
GtkImage ne possède pas de fonction permettant d'effectuer cette action simplement.
2. Solution
Pour résoudre ce problème, nous allons utiliser certaines fonctionnalités de l'objet
GdkPixbuf?. Les différentes étapes sont les suivantes :
- récupérer un GdkPixbuf? à partir de notre widget GtkImage ;
- récupérer la taille du GdkPixbuf? ;
- créer un nouveau GdkPixbuf? en fonction du premier ;
- remplacer l'ancien GdkPixbuf? par le nouveau dans le widget GtkImage.
L'example suivant affiche une image et permet à l'utilisateur d'agrandir ou de réduire la fenêtre.

 

3. Programme exemple
#include <stdlib.h>
#include <gtk/gtk.h>
void OnZoomIn(GtkWidget *pWidget, gpointer data);
void OnZoomOut(GtkWidget *pWidget, gpointer data);
int main(int argc, char **argv)
{
GtkWidget *pWindow;
GtkWidget *pBox;
GtkWidget *pBox2;
GtkWidget *pZoomIn;
GtkWidget *pZoomOut;
GtkWidget *pScrolled;
GtkWidget *pImage;
gtk_init(&argc, &argv);
pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
pBox = gtk_vbox_new(FALSE, 5);
gtk_container_add(GTK_CONTAINER(pWindow), pBox);
pBox2 = gtk_hbox_new(TRUE, 5);
gtk_box_pack_start(GTK_BOX(pBox), pBox2, FALSE, FALSE, 0);
pZoomIn = gtk_button_new_from_stock(GTK_STOCK_ZOOM_IN);
gtk_box_pack_start(GTK_BOX(pBox2), pZoomIn, TRUE, TRUE, 0);
pZoomOut = gtk_button_new_from_stock(GTK_STOCK_ZOOM_OUT);
gtk_box_pack_start(GTK_BOX(pBox2), pZoomOut, TRUE, TRUE, 0);
pScrolled = gtk_scrolled_window_new(NULL, NULL);
gtk_box_pack_start(GTK_BOX(pBox), pScrolled, TRUE, TRUE, 0);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pScrolled), GTK_POLICY_ALWAYS, GTK_POLICY_ALWAYS);
pImage = gtk_image_new_from_file("./gtk-logo-rgb.png");
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(pScrolled), pImage);
g_signal_connect(G_OBJECT(pZoomIn), "clicked", G_CALLBACK(OnZoomIn), pImage);
g_signal_connect(G_OBJECT(pZoomOut), "clicked", G_CALLBACK(OnZoomOut), pImage);
gtk_widget_show_all(pWindow);
gtk_main();
return EXIT_SUCCESS;
}
void OnZoomIn(GtkWidget *pWidget, gpointer data)
{
GdkPixbuf *pSrcPixbuf, *pDestPixbuf;
gint iWidth, iHeight;
// Recuperation du GdkPixbuf //
pSrcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(data));
// Recuperation de la taille de l'image //
iWidth = gdk_pixbuf_get_width(pSrcPixbuf);
iHeight = gdk_pixbuf_get_height(pSrcPixbuf);
// Creation du nouveau GdkPixbuf //
pDestPixbuf = gdk_pixbuf_scale_simple(pSrcPixbuf, iWidth+10, iHeight+10, GDK_INTERP_HYPER);
// Remplacement de l'ancien GdkPixbuf par le nouveau //
gtk_image_set_from_pixbuf(GTK_IMAGE(data), pDestPixbuf);
g_object_unref(pDestPixbuf);
}
void OnZoomOut(GtkWidget *pWidget, gpointer data)
{
GdkPixbuf *pSrcPixbuf, *pDestPixbuf;
gint iWidth, iHeight;
// Recuperation du GdkPixbuf //
pSrcPixbuf = gtk_image_get_pixbuf(GTK_IMAGE(data));
// Recuperation de la taille de l'image //
iWidth = gdk_pixbuf_get_width(pSrcPixbuf);
iHeight = gdk_pixbuf_get_height(pSrcPixbuf);
// Creation du nouveau GdkPixbuf //
pDestPixbuf = gdk_pixbuf_scale_simple(pSrcPixbuf, iWidth-10, iHeight-10, GDK_INTERP_HYPER);
// Remplacement de l'ancien GdkPixbuf par le nouveau //
gtk_image_set_from_pixbuf(GTK_IMAGE(data), pDestPixbuf);
g_object_unref(pDestPixbuf);
}