Ускорьте отображение изображений - PullRequest
0 голосов
/ 12 августа 2009

Я использую PIL (библиотеку изображений Python), чтобы обрезать очень большое изображение и представить обрезанную область интерфейсу. У меня проблема в том, что процесс занимает слишком много времени. Когда пользователь нажимает на изображение, чтобы обрезать его, изображение занимает довольно много времени, чтобы показать на том, к которому я его прикрепляю.

Я попытался сделать это двумя способами: сначала я попытался сохранить обрезанную область как изображение на диск и загрузил ее на лету в сортировщик. Вторая попытка состояла в том, чтобы создать пустое изображение и преобразовать изображение pil в изображение wx и загрузить его в классификатор. Меня удивляет, что первый способ записи на диск работает быстрее, чем второй способ управления им в памяти. Вот примеры кода:

Первый метод:

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

Есть ли лучший способ сделать это так, чтобы изображение теперь отображалось так медленно?

1 Ответ

5 голосов
/ 15 августа 2009

Итак, чтобы решить что-то еще в интерфейсе, когда я ставлю свои изображения в очередь, я решил предварительно загрузить объекты wxImage. Никогда раньше не было, когда они были намного меньше.

В любом случае - я нашел в Google некоторый код, который позволил бы мне конвертировать между объектами wxImage и объектами PIL, и таким образом я могу преобразовать объект 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
...