2009-08-11 5 views
0

PIL (python 이미지 라이브러리)을 사용하여 매우 큰 이미지를 자르고 자른 영역을 인터페이스에 표시합니다. 문제는 프로세스가 너무 오래 걸린다는 것입니다. 사용자가 이미지를 자르려면 이미지를 클릭 할 때 이미지를 첨부 한 크기 조정기에 이미지를 표시하는 데 시간이 많이 걸립니다.이미지 표시 속도 향상

나는이 두 가지 방법을 시도했다. 먼저 자른 부분을 디스크에 이미지로 저장하려고 시도하고 그것을 즉시 sizer에로드했다. 두 번째 시도는 빈 이미지를 만들고 pil 이미지를 wx 이미지로 변환 한 다음 sizer로로드하는 것입니다. 놀랍게도 디스크에 쓰는 첫 번째 방법은 메모리에서 두 번째로 관리하는 방법보다 빠르게 느껴집니다. 다음 코드 샘플은 다음과 같습니다

첫 번째 방법 :

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