在GTK中,如何缩放图像?现在我用PIL加载图像并预先缩放它们,但有没有办法用GTK做到这一点?
答案 0 :(得分:21)
使用gtk.gdk.Pixbuf从文件加载图像:
import gtk
pixbuf = gtk.gdk.pixbuf_new_from_file('/path/to/the/image.png')
然后缩放它:
pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
然后,如果你想在gtk.Image中使用它,请创建小部件并从pixbuf中设置图像。
image = gtk.Image()
image.set_from_pixbuf(pixbuf)
或者也许是以直接的方式:
image = gtk.image_new_from_pixbuf(pixbuf)
答案 1 :(得分:7)
在加载之前简单地缩放它们可能更有效。我特别这么认为,因为我使用这些函数从有时非常大的JPEG加载96x96缩略图,仍然非常快。
gtk.gdk.pixbuf_new_from_file_at_scale(..)
gtk.gdk.pixbuf_new_from_file_at_size(..)
答案 2 :(得分:2)
从网络缩放图片。 (scale reference)
import pygtk
pygtk.require('2.0')
import gtk
import urllib2
class MainWin:
def destroy(self, widget, data=None):
print "destroy signal occurred"
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.window.set_border_width(10)
self.image=gtk.Image()
self.response=urllib2.urlopen(
'http://192.168.1.11/video/1024x768.jpeg')
self.loader=gtk.gdk.PixbufLoader()
self.loader.set_size(200, 100)
#### works but throwing: glib.GError: Unrecognized image file format
self.loader.write(self.response.read())
self.loader.close()
self.image.set_from_pixbuf(self.loader.get_pixbuf())
self.window.add(self.image)
self.image.show()
self.window.show()
def main(self):
gtk.main()
if __name__ == "__main__":
MainWin().main()
* 编辑:(解决问题)*
try:
self.loader=gtk.gdk.PixbufLoader()
self.loader.set_size(200, 100)
# ignore tihs:
# glib.GError: Unrecognized image file format
self.loader.write(self.response.read())
self.loader.close()
self.image.set_from_pixbuf(self.loader.get_pixbuf())
except Exception, err:
print err
pass
答案 3 :(得分:0)
仅供参考,这是一个基于窗口大小缩放图像的解决方案(这说明您正在扩展GtkWindow
的类中实现此操作)。
let [width, height] = this.get_size(); // Get size of GtkWindow
this._image = new GtkImage();
let pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(filePath,width,height,true);
this._image.set_from_pixbuf(pixbuf);
答案 4 :(得分:0)
任何用C语言执行此操作的人。
//假设您已经加载了文件并保存了文件名 // GTK_IMAGE(image)是用于显示图像的容器
GdkPixbuf *pb;
pb = gdk_pixbuf_new_from_file(file_name, NULL);
pb = gdk_pixbuf_scale_simple(pb,700,700,GDK_INTERP_BILINEAR);
gtk_image_set_from_pixbuf(GTK_IMAGE(image), pb);
答案 5 :(得分:-1)
实际上,当我们使用 gdk_pixbuf_scale_simple(pb,700,700,GDK_INTERP_BILINEAR);当与计时器事件一起使用时,此功能会导致内存泄漏(如果我们监视任务管理器,则内存需求会不断增加,直到杀死进程为止)。如何解决