On Fri, 2003-07-11 at 22:13, ritwik kumar wrote:
> hey,
> how do i scale images to my desired size and then
> display using GtkImage widget? othetwise on part of
> the image shows when window is smaller than the image.
> Please help.
>
>
> ritwik
You must create/scale a pixbuf yourself:
GtkWidget *
get_image_from_file_at_size (const gchar *filename,
gint dest_width,
gint dest_height)
{
GtkWidget *img;
GdkPixbuf *raw, *display;
GError *err = NULL;
raw = gdk_pixbuf_new_from_file (filename, &err);
/* The pixbuf could not be loaded */
if (err != NULL)
{
g_warning ("Could not load file '%s': %s",
"/path/to/whatever.png", err->message);
g_error_free (err);
return NULL;
}
if (gdk_pixbuf_get_width (raw) > dest_width ||
gdk_pixbuf_get_height (raw) > dest_height)
{
gdouble scale_x, scale_y;
gdouble offset_x, offset_y;
scale_x = gdk_pixbuf_get_width (raw) / (gdouble) dest_width;
scale_y = gdk_pixbuf_get_height (raw) / (gdouble) dest_height;
if (scale_y > scale_x)
scale_y = scale_x;
else if (scale_x > scale_y)
scale_x = scale_y;
offset_x = (scale_x * gdk_pixbuf_get_width (raw)) / 2.0;
offset_y = (scale_y * gdk_pixbuf_get_height (raw)) / 2.0;
display = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
gdk_pixbuf_get_has_alpha (raw),
8, dest_width, dest_height);
gdk_pixbuf_scale (raw, display, 0, 0, dest_width, dest_height,
offset_x, offset_y, scale_x, scale_y,
GDK_INTERP_HYPER);
g_object_unref (raw);
}
else
{
display = raw;
}
img = gtk_image_new_from_pixbuf (display);
g_object_unref (display);
return img;
}
Notes:
1.) This function will only scale an image down, not up.
2.) I'm not sure if this function will compile, not segv, and work
properly, but it looks like it should [i.e. I did no testing on this at
all, it's off the top of my head].
3.) The API docs for GdkPixbuf are at:
http://developer.gnome.org/doc/API/2.0/gdk-pixbuf/index.html
4.) Perhaps the GtkImage widget needs a "scaled" property -- to handle
automatically scaling the pixbuf to the widget size...? Anyone?
Developers? Bueller? :-)
--
Peace,
Jim Cape
http://ignore-your.tv
"It is literally true that, like Christianity, Socialism
has conquered the world by defeating itself."
-- Alexander Berkman, ABC of Anarchism
This is a digitally signed message part