0

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

これを 2 つの方法で実行してみました。まず、切り抜いた領域を画像としてディスクに保存し、オンザフライでサイザーにロードしました。2 番目の試みは、空の画像を作成し、pil 画像を wx 画像に変換して、サイザーにロードすることでした。驚いたことに、ディスクに書き込む最初の方法は、メモリ内でディスクを管理する 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()

2 番目の方法:

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

画像が非常にゆっくりと表示されるようにするためのより良い方法はありますか?

4

1 に答える 1

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
于 2009-08-15T09:42:47.777 に答える