2009-08-11 25 views
0

Ich verwende die PIL (Python Image Library), um ein sehr großes Bild zu beschneiden und den beschnittenen Bereich auf der Oberfläche darzustellen. Das Problem, das ich habe, ist, dass der Prozess zu lange dauert. Wenn der Benutzer auf das Bild klickt, um es zuzuschneiden, dauert es ziemlich lange, bis das Bild auf dem Sizer angezeigt wird, an den ich es angehängt habe.Beschleunigung der Bildanzeige

Ich habe versucht, diese zwei Möglichkeiten: Zuerst habe ich versucht, den beschnittenen Bereich als Bild auf die Festplatte zu speichern, und es im laufenden Betrieb in den Sizer geladen. Der zweite Versuch bestand darin, ein leeres Bild zu erstellen und das pil-Bild in das wx-Bild zu konvertieren und auf den Sizer zu laden. Überraschend für mich ist, dass sich die erste Methode, auf die Festplatte zu schreiben, schneller anfühlt als die zweite Methode, sie im Speicher zu verwalten. Hier sind die Codebeispiele:

Erste Methode:

area = image_object.crop(self.cropxy) 
area.save(CROP_IMAGE, 'jpeg') 
crop_image = wx.Image(CROP_IMAGE, wx.BITMAP_TYPE_JPEG).ConvertToBitmap() 
crop_bitmap = wx.StaticBitmap(self.crop_panel, bitmap=crop_image, name="Cropped Image") 
crop_bitmap.CenterOnParent() 
crop_bitmap.Refresh() 

Zweite Methode:

area = image_object.crop(self.cropxy) 
image = wx.EmptyImage(area.size[0], area.size[1]) 
image.SetData(area.convert("RGB").tostring()) 
crop_image = wx.BitmapFromImage(image) 
crop_bitmap = wx.StaticBitmap(self.crop_panel, bitmap=crop_image, name="Cropped Image") 
crop_bitmap.CenterOnParent() 
crop_bitmap.Refresh() 

Gibt es einen besseren Weg, dies zu tun, so dass das Bild jetzt so langsam auftauchen wird?

+0

Haben Sie versucht, es Timing, welcher Teil die meiste Zeit macht? Wie groß ist die Bildgröße und wie viel beschneiden Sie? –

+0

Ich habe das groß rausgefunden –

Antwort

5

Also, um etwas anderswo in der Schnittstelle zu lösen, wenn ich meine Bilder in Warteschlange stellte, beschloss ich, die wxImage-Objekte vor zu laden. Niemals vorher, als sie viel kleiner waren.

Wie auch immer - ich habe Code bei Google gefunden, der es mir erlaubt, zwischen wxImage-Objekten und PIL-Objekten zu konvertieren. Dadurch kann ich das In-Memory-WxImage-Objekt in das PIL-Objekt konvertieren, zuschneiden und zurückkonvertieren zu dem Bild gerade rechtzeitig, um es anzuzeigen. Das ist 'Blazing' im Vergleich schnell. Du nimmst kaum einen Finger von der Maus und die Ernte zeigt sich gut.

Hier sind die Konvertierungsroutinen:

def pil_to_image(self, pil, alpha=True): 
    """ Method will convert PIL Image to wx.Image """ 
    if alpha: 
     image = apply(wx.EmptyImage, pil.size) 
     image.SetData(pil.convert("RGB").tostring()) 
     image.SetAlphaData(pil.convert("RGBA").tostring()[3::4]) 
    else: 
     image = wx.EmptyImage(pil.size[0], pil.size[1]) 
     new_image = pil.convert('RGB') 
     data = new_image.tostring() 
     image.SetData(data) 
    return image 


def image_to_pil(self, image): 
    """ Method will convert wx.Image to PIL Image """ 
    pil = Image.new('RGB', (image.GetWidth(), image.GetHeight())) 
    pil.fromstring(image.GetData()) 
    return pil