使用Python制作一个照片换底色的exe程序文件(详细教程)

前言

在校大学生,突然心血来潮写下这么一篇文章。
技术一般般,纯属业余水平,希望能与大神们互相探讨。
本文首次发表地址

本篇文章对于新手来说非常友好,使用Python强大的库可以非常轻松的完成你想做的东西。本文主要使用tkinter和Image等库来实现将照片换底色。

本来是想用opencv来对图片进行处理的,但是自身能力有限,对opencv不是特别熟练,所以在这里针对图片处理我选择调用removebg的API来对图片进行去除背景的处理。removebg处理后的图片效果确实可以。

废话不多说,跟着一起学习一下叭!Go!Go!Go!

一、安装相对应的库

使用命令安装

pip install 库名

用上面这行命令即可安装库。在这里,需要安装tkinter(tkinter现在的python是自带有的,如果没有那就装一下)、ImageRemoveBg库。

安装好就可以直接导入库了。

部分代码如下:

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox as msg
from PIL import Image
from removebg import RemoveBg

二、关于图片处理

1.关于RemoveBg

remove.bg 的使用非常的简单傻瓜,打开速度、图片上传和相应速度也非常快,网站上也没有过多的操作按钮,选择图片上传后,只需要等待几秒,图片就处理完成了。

当然,RemoveBg也为我们这些开发人员提供了API,使用起来非常方便。

点此跳转到RemoveBg官网申请API 使用邮箱注册就可以获取API了,非常简单。复制API到代码中就行了。RemoveBg也提供有开发文档可以查看,想了解更多的可以去看一看。还有在线去除背景等。跳转RemoveBg官网首页

2.图片处理代码编写

(在这我说明一下,以下代码段的编写均为后面打包exe后缀文件而编写的,如需单独编写则需要更改部分代码。)

由于处理图片并不需要我们去写,我们写几行代码调用RemoveBg的API来对图片进行处理就行。因为本文最终需要实现的是可视化窗口的程序,在这,我们写一个去除背景的函数。方便后面编写窗口的时候调用。代码过于简单,我就不多说了,代码中我也都写有解释,直接上代码👇👇👇

# 去除背景函数
def removeBG():
    rmbg = RemoveBg("替换成你申请的API", "error.log")  # 使用removebg中申请的API, "error.log"是错误日志。
    savePath_rmbg_png = path.get()  # path1:目标路径
    rmbg.remove_background_from_img_file(savePath_rmbg_png)  # 使用remove_background去除背景,去除背景后的文件保存在目标路径,“_no_bg.png”后缀
    msgBox_Success2()  # 提示去除背景成功

这样我们就能得到一张已经将背景去除的图片,并且会自动保存到原图所在的路径中。然后然后,我们还需要写几个函数,函数用来对刚刚去除背景的图片换上新的背景颜色。在这呢,我写了三个函数,分别对应着红色背景、蓝色背景、白色背景这三个颜色。

在这使用的这换背景的方法也是比较好理解,就是获取已经去除背景的那张图片的大小尺寸,然后新建一个图片文件,大小就跟没有背景的那张图片一样大,然后将没有背景的图片叠加到新建的图片中,就这样,搞定。在这我就写出一种颜色背景的方法,剩下的雷同我就不多赘述。

在这我说一下,图片的背景颜色大家可以自定义更换,更换RGB的值即可。这里需要注意一点:更换后的图片尺寸是和原图尺寸一样的,在这里我并没有对图片的尺寸进行更改。

部分代码如下:

# 更换红色背景函数
def transition_red():
    rmbg_png = savePath_rmbg_png + '_no_bg.png'  # 去除背景后的文件路径
    im = Image.open(rmbg_png)
    x, y = im.size  # 图片大小

    try:
        r = Image.new('RGBA', im.size, (255, 0, 0))  # 背景颜色  RGB
        r.paste(im, (0, 0, x, y), im)
        savePath_png = savePath.get() + '.png'
        # 新建存储路径的jpg文件
        jpgOutput = open(savePath_png, 'wb')
        r.save(jpgOutput)
        msgBox_Success1()  # 成功提示
    except:
        pass

3.窗口图片选择以及提示函数

细心的小伙伴可能就发现了,前面的图片处理代码中都写有提示函数,这个只需两行代码就可以搞定了。还有既然是exe程序,那如何选择图片文件呢?非常简单,接下来我们就一起看看。

首先先将提示函数来写一下,其他的按照需要的更改一下就完事了。

部分代码如下:

# 弹窗提示:转换成功
def msgBox_Success1():
    msg.showinfo('SUCCESS', '转换成功')

然后就是选择图片的函数了,使用tkinter的选择路径函数,对图片进行选择。选择后,需要对路径的符号进行处理。使用replace转换一下符号就搞定了。最后存储一下路径。

部分代码如下:

def selectPicture1():
    picture_1 = tkinter.filedialog.askopenfilename()  # 选择路径函数
    picture_1 = picture_1.replace("/", "\\\\")  # 路径符号转换
    path.set(picture_1)  # 路径存储到变量path1

4.可视化窗口

图片处理的搞定了,接下来就是将这些操作“包装”起来,做成可视化窗口的形式。可视化窗口的话我在这使用python自带的tkinter库。轻量级应用足够使用了,关键是简单,非常容易上手。

先来看看我所写的窗口效果图👇

界面做的比较简陋,主要追求实用性😆 有需要可以后期加工一下,将界面美化美化。

首先新建一个窗口,定义窗口的标题、窗口的大小等。

# 创建窗口
win = tk.Tk()
win.title('照片换底')  # 窗口标题
win.geometry('290x280')  # 窗口的大小  ※注意:这里的乘是×不是*

然后在窗口排版方面我分为四个子框架来编排。在第一个子框架中,为待处理照片的操作,包括可供选择图片的按钮以及显示选择图片后调用前面写过的函数转换路径符号后的路径。

部分代码如下:

mighty1 = ttk.LabelFrame(win, text=' 待处理照片 ')  # 限制在一个子框架内
mighty1.grid(column=0, row=1, padx=8, pady=4)  # 子框架位置
tk.Label(mighty1, text="目标路径:").grid(row=1, column=0)
tk.Entry(mighty1, width=20, textvariable=path).grid(row=1, column=1, columnspan=2)
tk.Button(mighty1, text="选择图片", command=selectPicture1).grid(row=1, column=3)  # 为按钮调用selectPicture1函数

接下来是第二个框架,在第一个窗口中选择好了图片,就对其进行去除背景的操作,原理也很简单,写个按钮调用去除背景的函数就可以达到去除背景的效果了。

部分代码如下:

# 去除背景模块
mighty2 = ttk.LabelFrame(win, text=' 去除背景 ')  # 限制在一个子框架内
mighty2.grid(column=0, row=2, padx=8, pady=4)  # 子框架位置
tk.Label(mighty2, text="选好目标路径先点➡").grid(row=2, column=0)
tk.Button(mighty2, text="去除背景", command=removeBG).grid(row=2, column=1)  # 调用removeBG函数去除背景

去除背景后在第三个子框架中对存储路径进行选择,这里跟前面的选择图片类似。

部分代码如下:

# 存储路径选择
mighty3 = ttk.LabelFrame(win, text='存储路径选择')
mighty3.grid(column=0, row=3, padx=8, pady=4)
tk.Label(mighty3, text="存储路径:").grid(row=3, column=0)  # 标签:存储路径
tk.Entry(mighty3, width=20, textvariable=savePath).grid(row=3, column=1, columnspan=2)  # 输入框:显示已选择的存储路径
tk.Button(mighty3, text="保存图片", command=saveDir1).grid(row=3, column=3)  # 按钮:选择存储路径,输入存储文件名

最后一个子框架,也就是关于更换底色的。这里我编写了三种颜色,与前面相对应,分别是红色背景、蓝色背景和白色背景。关于更换底色的操作我在前面已经说过了,这里就直接写窗口代码。

部分代码如下:

# 更换底色模块
mighty4 = ttk.LabelFrame(win, text='更换底色')
mighty4.grid(column=0, row=4, padx=8, pady=4)
mergeButton = ttk.Button(mighty4, text='更换红底', command=transition_red)  # 按钮:更换操作,调用函数transition_red
mergeButton.grid(column=0, row=6)
mergeButton1 = ttk.Button(mighty4, text='更换蓝底', command=transition_blue)  # 按钮:更换操作,调用函数transition_blue
mergeButton1.grid(column=1, row=6)
mergeButton2 = ttk.Button(mighty4, text='更换白底', command=transition_white)  # 按钮:更换操作,调用函数transition_white
mergeButton2.grid(column=2, row=6)

关于所更换的背景颜色,不一定固定这三种颜色,可以根据自己的喜好在前面的更换背景颜色中自由更改颜色(RGB)的值。这里需要注意一点,更换底色的是独立的按钮,每个按钮都是不同的底色,在第三个子框架中选择好存储路径以及存储文件名后即可点击,需要对同一张图片更换多种底色时,需在更换一次后重新对存储的文件名命名。

5.打包成exe程序

使用python库pyinstaller打包exe程序

安装pyinstaller:

pip install pyinstaller

打包命令:

pyinstaller -i 123.ico -F -w main.py

关于打包命令中的参数:

参数名 描述 说明
-i 为main.exe指定图标 pyinstaller -i beauty.ico main.py
-w 不显示命令行窗口 编写GUI程序时使用此参数有用。
-c 显示命令行窗口 与-w相反,默认含有此参数
-F 生成one-file的程序 生成结果是一个exe文件,所有的第三方依赖、资源和代码均被打包进该exe内

“-i”可不使用,如果打包后遇到问题无法运行exe程序,可将“-w”去掉重新运行打包命令进行打包,在打开程序时弹出的命令行窗口中检查出现什么问题,进而去解决报错问题。(比较常见的是缺少库)

如果测试没问题,那就完成啦!


写在最后

关于这篇文章

文章内容都是基础知识,界面做的比较简陋,主要是实用性就OK啦,大神们如有任何问题都可提出。

最后,希望这篇文章能够帮助更多的人学习到更多东西。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容