我正在使用PIL(python图像库)裁剪非常大的图像并将裁剪区域呈现给界面。我遇到的问题是这个过程花了太长时间。当用户点击图像进行裁剪时,图像需要很长时间才能显示在我附加的sizer上。
我尝试过这两种方式:首先我尝试将裁剪区域作为图像保存到磁盘,然后将其加载到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 :(得分:5)
因此,为了解决界面中其他地方的问题,当我排队我的图像时,我决定预先加载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