先来看本地图片的打开,因为本人新手入坑,是在遇到太多奇奇怪怪的问题,总结之后主要问题:1. tkinter与pillow的图片对象问题 2. 图片过大压缩问题
1. 对象问题:
Tkinter 以及pillow都可以打开图片,tkinter展示,pillow处理以及保存,且tkinter对象转pillow对象更加方便。所以采用tkinter获取本地地址,传值给picure类获取选定图片,传回Win类显示的方法,并在保存时将打开的tkinter图片对象转化为pillow对象保存。
Win类:
# 打开图片时使用,传值(图)给展示函数
def openToshow(self):
address = self.getAddress()
self.open_picToimg = self.picture.open_pic(address)
self.firstPic(self.open_picToimg)
self.show_img(self.open_picToimg)
# 打开图片时使用,获得地址
def getAddress(self):
path = tk.StringVar()
file_entry = tk.Entry(self, state='readonly', text=path)
path_ = askopenfilename()
path.set(path_)
self.picture = picture()
return file_entry.get()
# 展示函数
def show_img(self, n_img):
self.img = n_img # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
img_show = ImageTk.PhotoImage(self.img)
self.image_l.config(image=img_show)
self.image_l.image = img_show
return self.img
# 保存函数
def save_pic(self):
fname = tkinter.filedialog.asksaveasfilename(title='保存文件', filetypes=[("PNG", ".png")])
self.img.save(str(fname)) # PIL保存
pictire类:
# 打开图像调用
def open_pic(self, address):
self.pic_get = Im.open(address).convert('RGBA')
wid, hei = self.pic_get.size
if wid > 600 or hei > 400:
if tk.messagebox.askokcancel('提示', '图片可能过大,是否压缩?'):
needShow_pic = self.openResize()
return needShow_pic
return self.pic_get
else:
return self.pic_get
展示:
# 展示函数
def show_img(self, n_img):
self.img = n_img # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
img_show = ImageTk.PhotoImage(self.img)
self.image_l.config(image=img_show)
self.image_l.image = img_show
return self.img
考虑之后的图片重置,这里需要Win类存有最开始的图片:
# 原图储存
def firstPic(self, pic):
self.Fpic = pic
return self.Fpic