2009-08-12 16 views
13

Jak skalować obraz w GTK? W tej chwili ładuję obrazy za pomocą PIL i przeskalowuję je wcześniej, ale czy jest jakiś sposób na zrobienie tego za pomocą GTK?Skalowanie obrazu w GTK

Odpowiedz

15

Załaduj obraz z pliku, używając do tego gtk.gdk.Pixbuf:

import gtk 
pixbuf = gtk.gdk.pixbuf_new_from_file('/path/to/the/image.png') 

następnie przeskalować go:

pixbuf = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR) 

Następnie, jeśli chcesz używać go w gtk.Image, skrzynia widget i ustaw obraz z pixbuf.

image = gkt.Image() 
image.set_from_pixbuf(pixbuf) 

A może w sposób bezpośredni:

image = gtk.image_new_from_pixbuf(pixbuf) 
+0

Czy mamy to rozwiązanie również w C .... szukam samej rzeczy, ale pod C i GTK + .... Używanie GtkImage * image = gtk_image_new_from_file() – User7723337

6

To może być bardziej skuteczne, aby po prostu przeskalować je przed załadowaniem. Sądzę, że tak jest, ponieważ używam tych funkcji do ładowania w miniaturach 96x96 z czasami bardzo dużych plików JPEG, nadal bardzo szybko.

gtk.gdk.pixbuf_new_from_file_at_scale(..) 
gtk.gdk.pixbuf_new_from_file_at_size(..) 
1

Skaluj obraz z adresu URL. (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() 

* EDIT: (wypracowanie fix) *

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