2009-08-11 30 views
0

私はPIL(python画像ライブラリ)を使用して非常に大きな画像をトリミングし、トリミングされた領域をインタフェースに表示します。私が持っている問題は、プロセスが長時間かかることです。ユーザーが画像をクリックして切り抜くと、イメージはそれを添付するサイザーに表示するまでにかなりの時間がかかります。画像表示を高速化する

私はこれを2つの方法でやってみました:まず、切り抜いた領域をイメージとしてディスクに保存して、そのイメージをサイザーにロードしてみました。 2番目の試みは、空の画像を作成し、pil画像をwx画像に変換し、それをsizerにロードすることでした。ディスクに書き込む最初の方法は、メモリ内でそれを管理する第2の方法よりも速く感じるということは驚くべきことです。ここでは、コードサンプルは、次のとおりです。

最初の方法:

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

第二の方法:

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

画像は今とてもゆっくりと現れますようにこれを行うには良い方法はありますか?

+0

あなたが最も時間を作るどの部分、それをタイミング試みたことがありますか? 画像のサイズはどれくらいですか、切り抜き量はどれくらいですか? –

+0

私はこれを夢中にしました –

答えて

5

私は画像をキューに入れると、インターフェイスのどこかで解決するために、wxImageオブジェクトをあらかじめロードすることに決めました。彼らがはるかに小さくなったときに決して前にしていた。

とにかく - 私はwxImageオブジェクトとPILオブジェクトの間で変換することができるGoogleのコードを見つけました。そうすることで、メモリ内のwxImageオブジェクトをPILオブジェクトに変換してトリミングして元に戻すことができますちょうどその時に画像に表示することができます。これは比較して速く '燃える'。あなたはマウスから指を離すことはほとんどありません。ここで

は、変換ルーチンです:

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 
関連する問題