文章目录
一、背景需求
你,是不是有这样的烦恼!
在某网站注册需要上传个人免冠形象照,网站限制照片大小200KB以内,而你的照片却有250KB!!!
写文章博客需要上传一些图片辅助(比如在优快云),却发现网站限制了图片大小不能超过5MB,而你的图片却有10MB,上传不上去!
照片太大,太占内存空间,需要把这些照片统统压缩压缩减减肥。
…
在日常的生活工作中,我就经常遇见各种需要压缩图片的场景。
虽然能够实现图片压缩效果的方法不少
- 比如过大的图片在微信、QQ里面滚一圈
- 比如在电脑端的office软件里面滚一圈
- 又或者使用专业图片软件的压缩功能
- …
但是终究或多或少有些不方便的地方。
再怎么说,我也是自学过几天Python编程的人,虽然什么实现压缩图片的高级算法我统统不会,但是这不影响,能够解决问题的道路千千万万,总有一条适合我。
所以决定写一个小小的程序来帮助自己解决日常里需要图片压缩的问题。
二、设计分析
——
1. 核心功能
我们的核心目标:将目标图片压缩到符合要求的指定内存大小。
对于我来说,什么高深的图片压缩算法,抱歉,我真不会!
搜索了一下自己的大脑库存,可以通过 PIL 模块中的 resize() 方法重新设定图片的宽高,从而就可以达到改变图片内存大小的目的。
当然,我们并不是任意去修改图片的宽高,为了避免图片变形,应该是同等比例缩小宽高,也就是图片的宽高比要始终保持一致。
——
2. 功能描述
我们自行设计的这样一个小软件需要具备哪些功能呢?
- 核心功能:缩小图片宽高比例并保存
- 用户可任意选择宽高缩小的比例是多少
- 从本地文件夹选择图片
- 指定保存的路径并自定义命名图片
- 图片缩小前后信息的对比
- 针对用户选择非图片类文件的错误提示
基本上以上的几个功能就完全能够满足我们的需求,不仅能够自定义缩小的比例,同时还能够显示图片信息,从而判断适合符合要求。
——
3. UI设计图
设计的最后一步,我们将所有想法画在纸上形成一个初步的设计图。
对着设计图来写代码,才能更轻松便捷。
OK!前期设计工作到此基本搞定!
三、代码构造
最关键的步骤我们已经完成了,那就是对于整个小软件的功能和设计的构建。
接下来要做的就是对照设计蓝图一点一点写代码了。
——
1. 界面框架代码
首先第一步,我们对照的设计图用tkinter搭建出界面框架,这一步照葫芦画瓢即可,没有太大的难度,其中核心的调用函数先pass着。
import tkinter as tk
# 调用函数-选择图片
def selectIm():
pass
# 调用函数-选择保存路径
def outputFile():
pass
# 核心调用函数-缩小图片大小
def changeIm():
pass
# 调用函数-显示原图基本信息
def before_im():
pass
root = tk.Tk()
root.title('逆旅—图片缩小工具') # 窗口标题命名
root.iconphoto(False, tk.PhotoImage(file='头像.png')) # 更改窗口图标
# 定义关联变量
Imgname = tk.StringVar()
outputpath = tk.StringVar()
v_width = tk.IntVar()
v_height = tk.IntVar()
newname = tk.StringVar()
# 构建“选择图片”这一行的标签、输入框以及启动按钮,同时我们希望当用户选择图片之后能够显示原图的基本信息
tk.Label(root, text='选择图片').grid(row=1, column=0, padx=5, pady=5)
tk.Entry(root, textvariable=Imgname,validate='focusout', validatecommand=before_im).grid(row=1, column=1, padx=5, pady=5)
tk.Button(root, text='打开文件', command=selectIm).grid(row=1, column=2, padx=5, pady=5)
# 构建“保存路径”这一行的标签、输入框以及启动按钮
tk.Label(root, text='保存路径').grid(row=2, column=0, padx=5, pady=5)
tk.Entry(root, textvariable=outputpath).grid(row=2, column=1, padx=5, pady=5)
tk.Button(root, text='选择路径', command=outputFile).grid(row=2, column=2, padx=5, pady=5)
# 构建“宽度缩小”这一行的标签、输入框
tk.Label(root, text='宽度缩小').grid(row=3, column=0, padx=5, pady=5)
tk.Entry(root, textvariable=v_width).grid(row=3, column=1, padx=5, pady=5)
# 构建“高度缩小”这一行的标签、输入框
tk.Label(root, text='高度缩小').grid(row=4, column=0, padx=5, pady=5)
tk.Entry(root, textvariable=v_height).grid(row=4, column=1, padx=5, pady=5)
# 构建“图片命名”这一行的标签、输入框
tk.Label(root, text='图片命名').grid(row=5, column=0, padx=5, pady=5)
tk.Entry(root, textvariable=newname)