一点想说的
想当年我不会 Python 的时候,做个证件照还要下 XX证件照 软件,每次5元,感觉血亏,现在长本事了,自己做证件照,XX证件照 拜拜了您嘞~
必要配置
确保下面的库都已安装。
主要涉及到的库:
tkinter:实现
GUI
编程(文本框、按钮、标签等组件实现 GUI 开发)。
PIL:第三方图像处理库,十分强大,由于使用人数庞大再加上确实牛,几乎已经被认为是 Python
官方图像处理库。
pathlib:面向对象的编程方式来表示文件系统路径。
ttkthemes:tkinter
主题包,让你的组件外观更加骚。
Pyinstaller:是一个非常简单的打包 .py
文件的库。
removebg:看名字就知道,专门抠图的库。
removebg配置
安装对应的 Python 库
pip install -i https://pypi.douban.com/simple removebg 复制代码
获取API Key
进入 Removebg 官网,完成账号注册。
填写完注册信息后,会发送验证邮件到你的邮箱,点击进入后会进入如下界面。
点击 Remove image background
再点击红圈中的 Tool & API
点击 Get API Key
,
点击 Show
即可查看 API Key 了,最好记下来哦,之后代码中会用到。
无界面版
修改图片背景色
使用 RemoveBg
时必须指定 api-key
与 error.log
(保存报错信息的文件),去掉背景之后会在原图片同级文件夹内生成一张 xxx_no_bg.png
的图片,再创建一个指定颜色的背景板,将抠出来的图粘贴到背景板上。
# 修改照片背景色 def replace_bg(read_path, save_path, api_key, bg_color='blue'): # 在程序当前目录创建一个error.log文件来保存错误信息(必要参数) Path('error.log').touch() rmbg = RemoveBg(api_key, 'error.log') # 执行后会在 read_path 同级文件夹内生成一张 xxx_no_bg.png 的图片 rmbg.remove_background_from_img_file(read_path) img_no_bg = Image.open(read_path + '_no_bg.png') # 创建一个新的图像,RGB代表真色彩,3通道, # color可以为颜色英文名 red 或是 十六进制颜色代码 #00FF00 new_img = Image.new('RGB', img_no_bg.size, color=bg_color) # 将没有背景的图像粘贴到含背景色的图像上 new_img.paste(img_no_bg, (0, 0, *img_no_bg.size), img_no_bg) new_img.save(save_path) 复制代码
修改图片大小
读取图片,直接使用 resize
修改图片尺寸,Image.ANTIALIAS
设置为高质量。
# 修改照片尺寸295x413(标准一寸) def change_size(read_path, save_path, width=295, height=413): image = Image.open(read_path) resized_image = image.resize((int(width), int(height)), Image.ANTIALIAS) resized_image.save(save_path) 复制代码
升级版
设置窗口主题与标题
这里使用的主题时 adapta
,官方推荐,样式很好看。
window = ThemedTk(theme="adapta", fonts=True, themebg=True) window.title('证件照生成器') 复制代码
添加选择图片路径组件
选择待修改图片的路径。
def selectFilePath(): global img_path # 选择文件path接收文件地址 img_path = Path(filedialog.askopenfilename(title='选择原图片')) x, y = Image.open(img_path).size entry4.insert(0, str(x) + 'x' + str(y)) path1.set(img_path) path1 = tk.StringVar() entry1 = ttk.Entry(window, textvariable=path1, width=30) entry1.insert(0, '格式要求png') button1 = ttk.Button(window,width=10, text = "图片路径", command = selectFilePath) 复制代码
添加选择保存路径组件
选择修改后图片的保存路径,该路径为文件夹。
def selectDirPath(): global dir_path # 选择文件path接收文件地址 dir_path = Path(filedialog.askdirectory(title='选择图片保存路径')) path2.set(dir_path) path2 = tk.StringVar() entry2 = ttk.Entry(window, textvariable=path2, width=30) button2 = ttk.Button(window,width=10, text = "保存路径", command = selectDirPath) 复制代码
添加选择背景颜色组件
这里使用tkinter
的 colorchooser
来当作颜色板,不得不说,实在是太好用了 。
def ChooseColor(): global bg_color # 返回两种格式的颜色代码,这里只保存十六进制的 _, bg_color = colorchooser.askcolor(title='颜色选择器') path3.set(bg_color) path3 = tk.StringVar() entry3 = ttk.Entry(window, textvariable=path3, width=30) button3 = ttk.Button(window, text='背景颜色', command=ChooseColor) 复制代码
添加填写图片尺寸组件
如果要修改图片的话,就填写这一栏,默认为原图尺寸,这里如果想要标准尺寸的话,建议先自己百度一下,如标准一寸就是295x413(标准一寸)。
# 设置图片大小,默认原图大小,格式如295x413(标准一寸) label = ttk.Label(window, text='默认原图大小,若要修改请按[]内\ 格式,如 [295x413] (标准一寸照)', wraplength=200, style='two.TLabel') entry4 = ttk.Entry(window, width=30) label1 = ttk.Label(window, text='图片尺寸', style='three.TLabel') 复制代码
添加填写API-KEY组件
将输入框设置显示值为 “*”,可以达到隐藏显示值的效果。这里就要填写上面获取的 api-key
了。
# 填写api-key entry5 = ttk.Entry(window, width=30, show="*") label2 = ttk.Label(window, text='api-key', style='three.TLabel') 复制代码
添加控制按钮
- 修改背景按钮:只修改原图的背景图,需要指定原图路径,保存路径,背景颜色等。
- 修改尺寸按钮:只修改原图的尺寸,需要指定原图路径,保存路径,图片尺寸等。
- 同时修改按钮:同时修改原图的尺寸与背景,需要指定原图路径,保存路径,图片颜色(可选),图片尺寸(可选),如果未选择颜色,尺寸则默认蓝底,图片尺寸为295x413(标准一寸)。
# 添加“同时修改”按钮 button4 = ttk.Button(window, text = "同时修改", command=change_bg_size) # 添加“修改背景”按钮 button5 = ttk.Button(window, text = "修改背景", command=replace_bg) # 添加“修改尺寸”按钮 button6 = ttk.Button(window, text = "修改尺寸", command=change_size) 复制代码
添加输出框显示
显示运行结果信息。
# 添加输出框显示 tree = ttk.Treeview(height=1, show=("tree", "headings")) 复制代码
设置组件位置
这里使用 grid()
来设置位置,也可以用 pick()
,但个人更倾向于前者。
main_label.grid(row = 0, column = 0, pady=5) entry1.grid(row = 1, column = 0, pady=5) button1.grid(row = 1, column = 1, padx=20) entry2.grid(row = 2, column = 0, pady=5) button2.grid(row = 2, column = 1, padx=20) entry3.grid(row = 3, column = 0, pady=5) button3.grid(row = 3, column = 1, padx=20) label.grid(row = 4, column = 0, pady=5) entry4.grid(row = 5, column = 0, pady=5) label1.grid(row = 5, column = 1, pady=5) entry5.grid(row = 6, column = 0, pady=5) label2.grid(row = 6, column = 1, pady=5) button4.grid(row = 7, column = 1, padx=5) button5.grid(row = 7, column = 0, padx=5) button6.grid(row = 8, column = 0, padx=5) tree.grid(row=9, column=0, pady=5) 复制代码
设置组件样式
再原组件的基础上修改自己喜欢的样式。
label_style = ttk.Style() label_style.configure("one.TLabel", font=("微软雅黑", 16, 'bold'), foreground="red", background="yellow") label_style1 = ttk.Style() label_style1.configure("two.TLabel", font=("微软雅黑", 9), foreground="blue", background="yellow") label_style2 = ttk.Style() label_style2.configure("three.TLabel", font=("微软雅黑", 10), foreground="blue", background="yellow") 复制代码
源码打包
虽然之前的文章中已经介绍过很多次打包的方法,但为了新读者,还是再来简单讲解一下。 首先要确保已经安装 pyinstaller
,没有安装的可以先安装一下。
pip install -i https://pypi.douban.com/simple pyinstaller 复制代码
pyinstaller
使用时的常用参数含义:
-F:打包单个文件,产生一个文件用于部署(默认),如果代码都写在一个
.py
文件时使用,项目有多个文件时不要使用
pyinstaller -F xxx.py 复制代码
-D:打包多个文件,产生一个目录用于部署(默认),用于框架编写的代码打包
pyinstaller -D xxx.py(项目入口文件) 复制代码
--key=keys:使用
keys
进行加密打包
pyinstaller --key=123456 -F xxx.py 复制代码
-d:产生
debug
版本的可执行文件-p:用来添加程序所用到的包的所在位置,设置导入路径,可以用
;
( Linux 使用:
)分割来指定多个目录。-w:表示不用控制台窗口,使用 Windows 子系统执行,当程序启动的时候不会打开命令行(只对 Windows 有效)
-c:表示打开控制台窗口,使用控制台子系统执行,当程序启动的时候会打开命令行(默认)(只对 Windows 有效)
-i:将 file.ico 添加为可执行文件的资源,改变程序的图标(只对 Windows 系统有效)
安装完成后,新建一个文件夹,将源文件放到该文件夹下面,打开cmd
, cd 进入该文件夹下(重点),执行下面语句
生成的文件结构如下
exe
可执行文件在 dist
目录下