GtkFr - Cours Gtk+-2

RedimensionnerUneImage

PageAccueil :: LesNews :: Telechargement :: Liens :: Forum :: LeChat :: Contact
DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes 38.107.191.94
<< Placer une image de fond dans une fenêtre LesAstuces Un label cliquable >>


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


<< Placer une image de fond dans une fenêtre LesAstuces Un label cliquable >>

Il y a un commentaire sur cette page. [Afficher commentaires/formulaire]
Apinc