2009-08-11 13 views
0

J'utilise le PIL (bibliothèque d'images python) pour recadrer une très grande image et présenter la zone recadrée à l'interface. Le problème que j'ai, c'est que le processus prend trop de temps. Lorsque l'utilisateur clique sur l'image pour la recadrer, l'image prend beaucoup de temps à apparaître sur le calibreur auquel je l'attache.Accélérer l'affichage de l'image

J'ai essayé de le faire de deux façons: D'abord, j'ai essayé d'enregistrer la zone recadrée en tant qu'image sur le disque, et l'ai chargé à la volée dans le calibreur. La deuxième tentative consistait à créer une image vide et à convertir l'image pil dans l'image wx et à la charger dans le calibreur. Ce qui me surprend, c'est que la première méthode d'écriture sur le disque est plus rapide que la seconde méthode de gestion en mémoire. Voici les exemples de code:

Première méthode:

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() 

Deuxième méthode:

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() 

Y at-il une meilleure façon de le faire afin que l'image va maintenant apparaître si lentement?

+0

Avez-vous essayé de synchronisation, ce qui fait partie le plus de temps? Quelle est la taille de l'image et combien vous recadrez? –

+0

Je l'ai compris –

Répondre

5

Donc, afin de résoudre quelque chose ailleurs dans l'interface, lorsque j'ai mis en file d'attente mes images, j'ai décidé de pré-charger les objets wxImage. Je n'ai jamais eu à le faire quand ils étaient beaucoup plus petits.

Quoi qu'il en soit - J'ai trouvé du code sur google qui me permettrait de convertir entre objets wxImage et objets PIL et ainsi, je peux convertir l'objet wxImage en mémoire en objet PIL, le recadrer et le reconvertir à l'image juste à temps pour l'afficher. C'est 'Blazing' rapide en comparaison. Vous avez juste à peine sorti votre doigt de la souris et la culture se montre très bien.

Voici les routines de conversion:

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 
Questions connexes