python 修改图片尺寸_Python练习小工具——照片压缩及自定义尺寸更改

[Asm] 纯文本查看 复制代码#先声明,以下注释只是按个人理解写的,别杠,咋样方便记忆就咋样理解,初学者别深究,我只是个菜鸟,说深奥了我也不懂,何必自寻烦恼,影响自学的动力呢。

from PIL import Image as img

from tkinter import filedialog,Tk,Listbox,Button,BOTH,StringVar,Label,Entry,END

from os import startfile

#定义一个字典,里面含有路径列表,之所以定义字典,是因为可以在局部里直接调用,如果定义空列表,还需要在方法里加声明 gloal

Files_Names={

"path":[]

}

def win_soft(): #画各类控件

app=Tk() #画主窗口

app.title("照片压缩") #设置主窗口标题

Label(app,text="照片压缩及剪裁",font=("微软雅黑",25,"bold")).pack() #画标签并设置显示的文字,字体,加粗

Listbox(app,name='l_b',bg="#f2f2f2",fg="red").pack(fill=BOTH,expand=True) #画列表框并指定名字,方便后续根据名字调用获取Listbox实例,指定背景,前景,显示方式

Button(app,text="选择照片路径",command=ui_update).pack(fill=BOTH) #command指定了当按下按钮,会调用哪个方法

Label(app, text="尺寸大小:自定义任意尺寸", font=("微软雅黑", 10)).pack(fill=BOTH, expand=True)

defaul_val = StringVar(value='80') #创建一个StringVar类型的值,值是80

Entry(app,textvariable=defaul_val,name="scr_input_h").pack(fill=BOTH,expand=True) #textvariable只接收StringVar类型的值,所以这里传入上面的StringVar类型值,当成默认值

defaul_val = StringVar(value='80') #创建一个StringVar类型的值,值是80

Entry(app,textvariable=defaul_val,name="scr_input_w").pack(fill=BOTH,expand=True) #textvariable只接收StringVar类型的值,所以这里传入上面的StringVar类型值,当成默认值

#app.resizable(width=False, height=False) 设置窗体是否可以改变

Button(app, text="尺寸输出保存", command=scer_img).pack(fill=BOTH) # left

Label(app, text="压缩百分比:0~95", font=("微软雅黑", 10)).pack(fill=BOTH, expand=True)

defaul_val = StringVar(value='60')

Entry(app,textvariable=defaul_val,name="ys_input").pack(fill=BOTH,expand=True)

Button(app, text="压缩输出保存",command=compress).pack(fill=BOTH) #left

app_width=300 #设置窗口宽度

app_height=500 #设置窗口高度

win_width=int((app.winfo_screenwidth()-app_width)/2) #设置窗口距离左上角原点的 宽度 屏幕总宽度-软件窗口宽度 再除2,即软件距离左侧窗口的宽度 转为整数,因为下面geometry只接受字符串型整数

win_height=int((app.winfo_screenheight()-app_height)/2) #设置窗口距离左上角原点的 高度 屏幕总宽度-软件窗口高度 再除2,即软件距离顶边的高度 转为整数,因为下面geometry只接受字符串型整数

app.geometry("%sx%s+%s+%s"%(app_width,app_height,win_width,win_height)) #设置窗口显示的宽高度 及 距离原点的长宽度

return app #把创建好的实例对象返回主程序,其中在各控件里加app,意思为绑定主窗口,届时可以用 app.children["name"] 来调用。

def ui_update():

file_names = filedialog.askopenfilenames() # 返回选择的文件夹里的文件路径 列表

if file_names!="": #只要选择的文件夹路径不为空

Files_Names["path"]=file_names #完整的照片路径赋值给 全局变量

list_box=a.children["l_b"] #读取出列表框对象

list_box.delete(0,END) #对象调用删除全部列表框

for i in file_names:

list_box.insert(END,i.split("/")[-1]) #循环插入文件名到列表框

def compress():

file_names_new=filedialog.askdirectory() # 返回选择的保存图片的文件路径 列表

if file_names_new!="": #只要选择的文件夹路径不为空

for i in Files_Names["path"]: #读取出全局变量里的照片路径

img_byte=img.open(i) #根据照片路径循环打开要压缩的照片

img_byte.save(file_names_new+"/new_"+i.split("/")[-1],quality=a.children["ys_input"].get()) #压缩另存到新路径

startfile(file_names_new) #完成后自动打开 压缩图片所在的文件夹

def scer_img():

file_names_new=filedialog.askdirectory() # 返回选择的保存图片的文件路径 列表

if file_names_new!="": #只要选择的文件夹路径不为空

for i in Files_Names["path"]: #读取出全局变量里的照片路径

img_byte = img.open(i) #根据照片路径循环打开要压缩的照片

s_h=int(a.children["scr_input_h"].get()) #获取到要保存的尺寸高度

s_w=int(a.children["scr_input_w"].get()) # 获取到要保存的尺寸宽度

str_file_name=("%s/new_%sx%s_%s")%(file_names_new,str(s_h),str(s_w),i.split("/")[-1]) #保存的图片路径

img_byte.resize((s_w,s_h)).save(str_file_name) #用resize方法保存图片,即为裁剪后的。

startfile(file_names_new) # 完成后自动打开 压缩图片所在的文件夹

a=win_soft() #返回创建完所有控制的实例

a.mainloop() #循环等待所有控制的消息,另外这个不调用,整个窗体也不会显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值