Tools
首页
画图
音乐
采集
记事
博客
实验室
登录
lypeng
146
文章
11
分类
46
记事
分类
生活-[23]
Linux-[24]
前端-[9]
数据库-[16]
PHP-[31]
git-[7]
其他-[6]
python-[20]
算法-[4]
React-Native-[4]
中草药-[2]
广告位1
广告位2
首页
/ python
返回列表
python案例(四) 图片批量缩放程序,并打包为exe
阅读:695
发布:2018-06-19
作者:lypeng
tkinter学习完了,一个实际应用:批量缩放图片,Linux下就用imgresize.py,Windows下使用打包好的imgresize.exe文件 > 批量缩放图片,之前一直是用的PS中的动作命令,虽然说也快捷,但要打开ps-》新建动作-》打开图片执行,相比直接输入Python imgresize.py繁琐了一点! tkinter教程推荐:《
莫烦Python之tkinter教程
》 放效果图:  图一 打包好的EXE程序,247M,还是比较大的  图二 GUI界面  图三 实际文件夹情况 ## 图片批量缩放,单独Python部分 执行流程: 1. 遍历文件夹中的图片保存到列表 2. 判断宽高是否超过给定尺寸,如果没有,直接复制到新文件夹,超过则缩放后,在新文件夹中生成新文件 3. for循环图片列表,执行步骤2 代码如下: ```python #!/usr/bin/python # -*- coding:utf-8 -*- from PIL import Image import os import shutil #拷贝文件用 class MyImageResize(object): def __init__(self,from_path=,save_path=,new_width,new_height): self.from_path = from_path self.save_path = save_path self.new_width = float(new_width) self.new_height = float(new_height) def get_image_from_dir(self): #遍历目录,返回图片list ext = ['jpg','jpeg','gif','png','bmp'] con = os.listdir(self.from_path) # print(con) res = [] for i in con: # imgext = os.path.splitext(i)[1].lower() imgext = i.split('.')[-1].lower() if imgext in ext: res.append(i) return res def resize_image(self,imgurl): #获取图片宽高尺寸 img = Image.open(self.from_path + os.sep + imgurl) w,h = img.size # 如果宽高都小于给定值,800*600,直接复制到新文件夹 if float(w)<=float(self.new_width) and float(h)<=float(self.new_height): shutil.copy(self.from_path + os.sep + imgurl,self.save_path + os.sep + imgurl) return # 裁剪开始 if (w/self.new_width) > (h/self.new_height): scale = 1.0*w/self.new_width new_im = img.resize((int(w/scale), int(h/scale)), Image.ANTIALIAS) else: scale = 1.0*h/self.new_height new_im = img.resize((int(w/scale),int(h/scale)), Image.ANTIALIAS) new_im.save(self.save_path + os.sep + imgurl) new_im.close() def main(self): res = self.get_image_from_dir() # print(res) for i in res: self.resize_image(i) print('resize finish!') if __name__=='__main__': from_path = '/home/uploads/lypeng/Pictures' save_path = '/home/uploads/lypeng/Pictures/new' new_width = 800 #最大宽度不超过800px new_height = 600 #最大高度不超过600px if (not os.path.exists(save_path)): os.mkdir(save_path) myobj = MyImageResize(from_path,save_path,new_width,new_height) myobj.main() ``` ## GUI界面部分 界面介绍:两个文件夹选择输入框,两个宽高普通文本输入框,一个执行按钮,还有退出与关于的菜单栏 代码部分: ```python #!/usr/bin/python3 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox from tkinter.filedialog import askdirectory # 窗口设置部分 window = tk.Tk() window.title('批量图片缩放GUI界面') window.geometry('450x200') # pack(side='top') # for i in range(3): # for j in range(3): # tk.Label(window,text=j+1+3*i).grid(row=i,column=j,padx=10,pady=10) def selectPathf(): path_ = askdirectory() path_from.set(path_) def selectPaths(): path_ = askdirectory() path_save.set(path_) def execute_main(): path_from = pf.get() save_from = sf.get() new_width = nw.get() new_height = nh.get() print(path_from+save_from+new_width+new_height) # pass path_from = tk.StringVar() path_save = tk.StringVar() new_width = tk.StringVar() new_height = tk.StringVar() tk.Label(window,text='图片文件夹:',font=('MS Sans Serif',12)).place(x=10,y=20,anchor='nw') pf = tk.Entry(window,textvariable=path_from,width=30) pf.place(x=120,y=20) tk.Button(window,text='选择路径',command=selectPathf,bg='#3385ff',font=('MS Sans Serif',12)).place(x=350,y=20) tk.Label(window,text='保存文件夹:',font=('MS Sans Serif',12)).place(x=10,y=50,anchor='nw') sf = tk.Entry(window,textvariable=path_save,width=30) sf.place(x=120,y=50) tk.Button(window,text='选择路径',command=selectPaths,bg='#3385ff',font=('MS Sans Serif',12)).place(x=350,y=50) tk.Label(window,text='缩放最大宽度:',font=('MS Sans Serif',12)).place(x=10,y=80,anchor='nw') nw = tk.Entry(window,textvariable=new_width,width=30) nw.place(x=120,y=80) tk.Label(window,text='缩放最大高度:',font=('MS Sans Serif',12)).place(x=10,y=110,anchor='nw') nh = tk.Entry(window,textvariable=new_height,width=30) nh.place(x=120,y=110) tk.Button(window,text='执行',command=execute_main,font=('MS Sans Serif',12),bg='#3385ff').place(x=100,y=140) def about(): tk.messagebox.showinfo(title='about',message='author: lypeng.com; version: 1.0') menubar = tk.Menu(window) filemenu = tk.Menu(menubar,tearoff=0) menubar.add_cascade(label='File',menu=filemenu) filemenu.add_command(label='About',command=about) filemenu.add_command(label='Exit',command=window.quit) window.config(menu=menubar) window.mainloop() #mainloop,指窗口会不停的循环,监听一些输入点击的事件,然后响应 ``` ## 两者合二为一,最终代码 两个class类,GUI界面始终运行mainloop,点击执行按钮,调用MyResize类缩放,执行完成showmessage弹窗~ ```python #!/usr/bin/python # -*- coding:utf-8 -*- from PIL import Image import os import shutil #拷贝文件用 import tkinter as tk from tkinter import messagebox from tkinter.filedialog import askdirectory class MyGui(object): def selectPathf(self): path_ = askdirectory() self.path_from.set(path_) def selectPaths(self): path_ = askdirectory() self.path_save.set(path_) def about(self): tk.messagebox.showinfo(title='about',message='author: lypeng.com; version: 1.0') def window_main(self): window = tk.Tk() window.title('批量图片缩放') window.geometry('450x200') self.path_from = tk.StringVar() self.path_save = tk.StringVar() self.new_width = tk.StringVar() self.new_height = tk.StringVar() tk.Label(window,text='图片文件夹:',font=('MS Sans Serif',12)).place(x=10,y=20,anchor='nw') self.pf = tk.Entry(window,textvariable=self.path_from,width=30) self.pf.place(x=120,y=20) tk.Button(window,text='选择路径',command=self.selectPathf,bg='#3385ff',font=('MS Sans Serif',12)).place(x=350,y=20) tk.Label(window,text='保存文件夹:',font=('MS Sans Serif',12)).place(x=10,y=50,anchor='nw') self.sf = tk.Entry(window,textvariable=self.path_save,width=30) self.sf.place(x=120,y=50) tk.Button(window,text='选择路径',command=self.selectPaths,bg='#3385ff',font=('MS Sans Serif',12)).place(x=350,y=50) tk.Label(window,text='缩放最大宽度:',font=('MS Sans Serif',12)).place(x=10,y=80,anchor='nw') self.nw = tk.Entry(window,textvariable=self.new_width,width=30) self.nw.place(x=120,y=80) tk.Label(window,text='缩放最大高度:',font=('MS Sans Serif',12)).place(x=10,y=110,anchor='nw') self.nh = tk.Entry(window,textvariable=self.new_height,width=30) self.nh.place(x=120,y=110) tk.Button(window,text='执行',command=self.execute_main,font=('MS Sans Serif',12),bg='#3385ff').place(x=100,y=140) menubar = tk.Menu(window) filemenu = tk.Menu(menubar,tearoff=0) menubar.add_cascade(label='File',menu=filemenu) filemenu.add_command(label='About',command=self.about) filemenu.add_command(label='Exit',command=window.quit) window.config(menu=menubar) window.mainloop() def execute_main(self): from_path = self.pf.get() save_path = self.sf.get() new_width = self.nw.get() new_height = self.nh.get() if (not os.path.exists(save_path)): os.mkdir(save_path) myobj = MyImageResize(from_path,save_path,new_width,new_height) myobj.main() class MyImageResize(object): def __init__(self,from_path,save_path,new_width,new_height): self.from_path = from_path self.save_path = save_path self.new_width = float(new_width) self.new_height = float(new_height) def get_image_from_dir(self): #遍历目录,返回图片list ext = ['jpg','jpeg','gif','png','bmp'] con = os.listdir(self.from_path) # print(con) res = [] for i in con: # imgext = os.path.splitext(i)[1].lower() imgext = i.split('.')[-1].lower() if imgext in ext: res.append(i) return res def resize_image(self,imgurl): #获取图片宽高尺寸 img = Image.open(self.from_path + os.sep + imgurl) w,h = img.size # 如果宽高都小于给定值,800*600,直接复制到新文件夹 if float(w)<=float(self.new_width) and float(h)<=float(self.new_height): shutil.copy(self.from_path + os.sep + imgurl,self.save_path + os.sep + imgurl) return # 裁剪开始 if (w/self.new_width) > (h/self.new_height): scale = 1.0*w/self.new_width new_im = img.resize((int(w/scale), int(h/scale)), Image.ANTIALIAS) else: scale = 1.0*h/self.new_height new_im = img.resize((int(w/scale),int(h/scale)), Image.ANTIALIAS) new_im.save(self.save_path + os.sep + imgurl) new_im.close() def main(self): res = self.get_image_from_dir() # print(res) for i in res: self.resize_image(i) tk.messagebox.showinfo(title='status',message='successful! ') if __name__=='__main__': mygui = MyGui() mygui.window_main() ``` ## 在Windows中打包 1. 把上述代码拷贝到Windows系统中,命名为:imgresize.py 2. cd 文件目录,执行pyinstaller -w -F imgresize.py 3. 在该文件夹的dist中即可看到EXE文件,如图一 4. 输入参数执行,如图二、三
------本文结束
感谢阅读------
上一篇:
将Python的GUI打包成一个exe程序
下一篇:
django体验(一)跟着文档走 part1+part2