Python照片压缩及自定义尺寸更改软件

行业软件 2020-08-24 11:19:43

Python照片压缩及自定义尺寸更改软件

完整打包命令为:pyinstaller -F -i 01.ico 01.py --noconsole
其中-i为增加图标命令,图标名为当前打包目录下的01.ico文件 01.py是源码文件。--noconsole 顾名思义,不要输出的意思,也就是运行时只显示窗体,不显示黑色的cmd命令窗口。

功能及使用如下:
1.点击按钮《选择照片路径》,在弹出的窗口中,按着ctrl多选照片,或者直接ctrl+a全选照片。
2.在界面的输入框中,输入要压缩的百分比数值 或 修改尺寸数值(例如高100 宽30)
3.按需点击按钮《尺寸输出保存》 或 点击按钮《压缩输出保存》
4.在弹出的保存窗口中,选择要保存到哪个文件夹,选择完要保存的文件夹后,稍等片刻,压缩或尺寸更改完毕,会自动弹出保存的文件夹窗口。

#先声明,以下注释只是按个人理解写的,别杠,咋样方便记忆就咋样理解,初学者别深究,我只是个菜鸟,说深奥了我也不懂,何必自寻烦恼,影响自学的动力呢。
 
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()  #循环等待所有控制的消息,另外这个不调用,整个窗体也不会显示