wxPython 的 wx.Image 和 PIL 的Image 一个是主流gui库,一个是主流图像处理库(很多图像相关的库都会用它为基础库),做 python gui 程序这两个库中的图像对像互相转换是必定会碰到的,两者会经常混合着用。 因为两个库的版本不一致,相互间的转换方法常有变化。下面写成两个函数,方便调用。

def PilImage2WxImage(self,pilImage:PIL.Image.Image):
'''
转换 PIL Image 为 wxPython Image
:param pilImage: PIL.Image.Image
:return: wx.Image
'''
wxImage = wx.Image((pilImage.size[0], pilImage.size[1]), pilImage.convert("RGB").tobytes())
return wxImage

def WxImage2PilImage(self, wxImage:wx.Image):
'''
转换 wxPython Image 为 PIL Image 对象
:param wxImage: wx.Image 实例
:return: PIL.Image.Image
'''
from PIL import Image
# wxImage 的 GetData方法返回图像的字节码,通过bytes强制转换,可以直接作为frombytes的参数。
pilImage = Image.frombytes('RGB',(wxImage.GetWidth(), wxImage.GetHeight()),bytes(wxImage.GetData()))
# pil.show()
return pilImage

从 PIL Image 原来有个方法 fromstring 可以将 wxImage 转化过来,但最新版本这个方法被取消了,需要用 frombytes 替代。 但是 wxImage 的 GetData() 方法默认返回的是PyObject对象,不是 bytes ,没法直接用。 实际上看这个方法说明,内部就是返回的bytes 只是,所以转换一下就能用了。