使用Python制作一個(gè)照片換底色的exe程序文件(詳細(xì)教程)

前言

在校大學(xué)生炼彪,突然心血來(lái)潮寫下這么一篇文章。
技術(shù)一般般诱担,純屬業(yè)余水平窑滞,希望能與大神們互相探討琼牧。
本文首次發(fā)表地址

本篇文章對(duì)于新手來(lái)說(shuō)非常友好,使用Python強(qiáng)大的庫(kù)可以非常輕松的完成你想做的東西哀卫。本文主要使用tkinter和Image等庫(kù)來(lái)實(shí)現(xiàn)將照片換底色巨坊。

本來(lái)是想用opencv來(lái)對(duì)圖片進(jìn)行處理的,但是自身能力有限此改,對(duì)opencv不是特別熟練趾撵,所以在這里針對(duì)圖片處理我選擇調(diào)用removebg的API來(lái)對(duì)圖片進(jìn)行去除背景的處理。removebg處理后的圖片效果確實(shí)可以共啃。

廢話不多說(shuō)占调,跟著一起學(xué)習(xí)一下叭!Go!Go!Go只洒!

一、安裝相對(duì)應(yīng)的庫(kù)

使用命令安裝

pip install 庫(kù)名

用上面這行命令即可安裝庫(kù)剿涮。在這里言津,需要安裝tkinter(tkinter現(xiàn)在的python是自帶有的,如果沒(méi)有那就裝一下)取试、Image悬槽、RemoveBg庫(kù)。

安裝好就可以直接導(dǎo)入庫(kù)了瞬浓。

部分代碼如下:

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

二初婆、關(guān)于圖片處理

1.關(guān)于RemoveBg

remove.bg 的使用非常的簡(jiǎn)單傻瓜,打開(kāi)速度瑟蜈、圖片上傳和相應(yīng)速度也非逞萄罚快,網(wǎng)站上也沒(méi)有過(guò)多的操作按鈕铺根,選擇圖片上傳后宪躯,只需要等待幾秒,圖片就處理完成了位迂。

當(dāng)然访雪,RemoveBg也為我們這些開(kāi)發(fā)人員提供了API,使用起來(lái)非常方便掂林。

點(diǎn)此跳轉(zhuǎn)到RemoveBg官網(wǎng)申請(qǐng)API 使用郵箱注冊(cè)就可以獲取API了臣缀,非常簡(jiǎn)單。復(fù)制API到代碼中就行了泻帮。RemoveBg也提供有開(kāi)發(fā)文檔可以查看精置,想了解更多的可以去看一看。還有在線去除背景等锣杂。跳轉(zhuǎn)RemoveBg官網(wǎng)首頁(yè)

2.圖片處理代碼編寫

(在這我說(shuō)明一下脂倦,以下代碼段的編寫均為后面打包exe后綴文件而編寫的,如需單獨(dú)編寫則需要更改部分代碼元莫。)

由于處理圖片并不需要我們?nèi)懤底瑁覀儗憥仔写a調(diào)用RemoveBg的API來(lái)對(duì)圖片進(jìn)行處理就行。因?yàn)楸疚淖罱K需要實(shí)現(xiàn)的是可視化窗口的程序踱蠢,在這火欧,我們寫一個(gè)去除背景的函數(shù)。方便后面編寫窗口的時(shí)候調(diào)用茎截。代碼過(guò)于簡(jiǎn)單苇侵,我就不多說(shuō)了,代碼中我也都寫有解釋企锌,直接上代碼??????

# 去除背景函數(shù)
def removeBG():
    rmbg = RemoveBg("替換成你申請(qǐng)的API", "error.log")  # 使用removebg中申請(qǐng)的API衅檀, "error.log"是錯(cuò)誤日志。
    savePath_rmbg_png = path.get()  # path1:目標(biāo)路徑
    rmbg.remove_background_from_img_file(savePath_rmbg_png)  # 使用remove_background去除背景霎俩,去除背景后的文件保存在目標(biāo)路徑哀军,“_no_bg.png”后綴
    msgBox_Success2()  # 提示去除背景成功

這樣我們就能得到一張已經(jīng)將背景去除的圖片,并且會(huì)自動(dòng)保存到原圖所在的路徑中打却。然后然后杉适,我們還需要寫幾個(gè)函數(shù),函數(shù)用來(lái)對(duì)剛剛?cè)コ尘暗膱D片換上新的背景顏色柳击。在這呢猿推,我寫了三個(gè)函數(shù),分別對(duì)應(yīng)著紅色背景捌肴、藍(lán)色背景蹬叭、白色背景這三個(gè)顏色。

在這使用的這換背景的方法也是比較好理解状知,就是獲取已經(jīng)去除背景的那張圖片的大小尺寸秽五,然后新建一個(gè)圖片文件,大小就跟沒(méi)有背景的那張圖片一樣大饥悴,然后將沒(méi)有背景的圖片疊加到新建的圖片中坦喘,就這樣,搞定西设。在這我就寫出一種顏色背景的方法瓣铣,剩下的雷同我就不多贅述。

在這我說(shuō)一下贷揽,圖片的背景顏色大家可以自定義更換棠笑,更換RGB的值即可。這里需要注意一點(diǎn):更換后的圖片尺寸是和原圖尺寸一樣的禽绪,在這里我并沒(méi)有對(duì)圖片的尺寸進(jìn)行更改蓖救。

部分代碼如下:

# 更換紅色背景函數(shù)
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'
        # 新建存儲(chǔ)路徑的jpg文件
        jpgOutput = open(savePath_png, 'wb')
        r.save(jpgOutput)
        msgBox_Success1()  # 成功提示
    except:
        pass

3.窗口圖片選擇以及提示函數(shù)

細(xì)心的小伙伴可能就發(fā)現(xiàn)了,前面的圖片處理代碼中都寫有提示函數(shù)丐一,這個(gè)只需兩行代碼就可以搞定了藻糖。還有既然是exe程序,那如何選擇圖片文件呢库车?非常簡(jiǎn)單巨柒,接下來(lái)我們就一起看看。

首先先將提示函數(shù)來(lái)寫一下柠衍,其他的按照需要的更改一下就完事了洋满。

部分代碼如下:

# 彈窗提示:轉(zhuǎn)換成功
def msgBox_Success1():
    msg.showinfo('SUCCESS', '轉(zhuǎn)換成功')

然后就是選擇圖片的函數(shù)了,使用tkinter的選擇路徑函數(shù)珍坊,對(duì)圖片進(jìn)行選擇牺勾。選擇后,需要對(duì)路徑的符號(hào)進(jìn)行處理阵漏。使用replace轉(zhuǎn)換一下符號(hào)就搞定了驻民。最后存儲(chǔ)一下路徑翻具。

部分代碼如下:

def selectPicture1():
    picture_1 = tkinter.filedialog.askopenfilename()  # 選擇路徑函數(shù)
    picture_1 = picture_1.replace("/", "\\\\")  # 路徑符號(hào)轉(zhuǎn)換
    path.set(picture_1)  # 路徑存儲(chǔ)到變量path1

4.可視化窗口

圖片處理的搞定了,接下來(lái)就是將這些操作“包裝”起來(lái)回还,做成可視化窗口的形式裆泳。可視化窗口的話我在這使用python自帶的tkinter庫(kù)柠硕。輕量級(jí)應(yīng)用足夠使用了工禾,關(guān)鍵是簡(jiǎn)單,非常容易上手蝗柔。

先來(lái)看看我所寫的窗口效果圖??

界面做的比較簡(jiǎn)陋闻葵,主要追求實(shí)用性?? 有需要可以后期加工一下,將界面美化美化癣丧。

首先新建一個(gè)窗口槽畔,定義窗口的標(biāo)題、窗口的大小等坎缭。

# 創(chuàng)建窗口
win = tk.Tk()
win.title('照片換底')  # 窗口標(biāo)題
win.geometry('290x280')  # 窗口的大小  ※注意:這里的乘是×不是*

然后在窗口排版方面我分為四個(gè)子框架來(lái)編排竟痰。在第一個(gè)子框架中,為待處理照片的操作掏呼,包括可供選擇圖片的按鈕以及顯示選擇圖片后調(diào)用前面寫過(guò)的函數(shù)轉(zhuǎn)換路徑符號(hào)后的路徑坏快。

部分代碼如下:

mighty1 = ttk.LabelFrame(win, text=' 待處理照片 ')  # 限制在一個(gè)子框架內(nèi)
mighty1.grid(column=0, row=1, padx=8, pady=4)  # 子框架位置
tk.Label(mighty1, text="目標(biāo)路徑:").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)  # 為按鈕調(diào)用selectPicture1函數(shù)

接下來(lái)是第二個(gè)框架,在第一個(gè)窗口中選擇好了圖片憎夷,就對(duì)其進(jìn)行去除背景的操作莽鸿,原理也很簡(jiǎn)單,寫個(gè)按鈕調(diào)用去除背景的函數(shù)就可以達(dá)到去除背景的效果了拾给。

部分代碼如下:

# 去除背景模塊
mighty2 = ttk.LabelFrame(win, text=' 去除背景 ')  # 限制在一個(gè)子框架內(nèi)
mighty2.grid(column=0, row=2, padx=8, pady=4)  # 子框架位置
tk.Label(mighty2, text="選好目標(biāo)路徑先點(diǎn)?").grid(row=2, column=0)
tk.Button(mighty2, text="去除背景", command=removeBG).grid(row=2, column=1)  # 調(diào)用removeBG函數(shù)去除背景

去除背景后在第三個(gè)子框架中對(duì)存儲(chǔ)路徑進(jìn)行選擇祥得,這里跟前面的選擇圖片類似。

部分代碼如下:

# 存儲(chǔ)路徑選擇
mighty3 = ttk.LabelFrame(win, text='存儲(chǔ)路徑選擇')
mighty3.grid(column=0, row=3, padx=8, pady=4)
tk.Label(mighty3, text="存儲(chǔ)路徑:").grid(row=3, column=0)  # 標(biāo)簽:存儲(chǔ)路徑
tk.Entry(mighty3, width=20, textvariable=savePath).grid(row=3, column=1, columnspan=2)  # 輸入框:顯示已選擇的存儲(chǔ)路徑
tk.Button(mighty3, text="保存圖片", command=saveDir1).grid(row=3, column=3)  # 按鈕:選擇存儲(chǔ)路徑蒋得,輸入存儲(chǔ)文件名

最后一個(gè)子框架级及,也就是關(guān)于更換底色的。這里我編寫了三種顏色额衙,與前面相對(duì)應(yīng)饮焦,分別是紅色背景、藍(lán)色背景和白色背景窍侧。關(guān)于更換底色的操作我在前面已經(jīng)說(shuō)過(guò)了县踢,這里就直接寫窗口代碼。

部分代碼如下:

# 更換底色模塊
mighty4 = ttk.LabelFrame(win, text='更換底色')
mighty4.grid(column=0, row=4, padx=8, pady=4)
mergeButton = ttk.Button(mighty4, text='更換紅底', command=transition_red)  # 按鈕:更換操作伟件,調(diào)用函數(shù)transition_red
mergeButton.grid(column=0, row=6)
mergeButton1 = ttk.Button(mighty4, text='更換藍(lán)底', command=transition_blue)  # 按鈕:更換操作硼啤,調(diào)用函數(shù)transition_blue
mergeButton1.grid(column=1, row=6)
mergeButton2 = ttk.Button(mighty4, text='更換白底', command=transition_white)  # 按鈕:更換操作,調(diào)用函數(shù)transition_white
mergeButton2.grid(column=2, row=6)

關(guān)于所更換的背景顏色斧账,不一定固定這三種顏色谴返,可以根據(jù)自己的喜好在前面的更換背景顏色中自由更改顏色(RGB)的值煞肾。這里需要注意一點(diǎn),更換底色的是獨(dú)立的按鈕嗓袱,每個(gè)按鈕都是不同的底色扯旷,在第三個(gè)子框架中選擇好存儲(chǔ)路徑以及存儲(chǔ)文件名后即可點(diǎn)擊,需要對(duì)同一張圖片更換多種底色時(shí)索抓,需在更換一次后重新對(duì)存儲(chǔ)的文件名命名。

5.打包成exe程序

使用python庫(kù)pyinstaller打包exe程序

安裝pyinstaller:

pip install pyinstaller

打包命令:

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

關(guān)于打包命令中的參數(shù):

參數(shù)名 描述 說(shuō)明
-i 為main.exe指定圖標(biāo) pyinstaller -i beauty.ico main.py
-w 不顯示命令行窗口 編寫GUI程序時(shí)使用此參數(shù)有用毯炮。
-c 顯示命令行窗口 與-w相反逼肯,默認(rèn)含有此參數(shù)
-F 生成one-file的程序 生成結(jié)果是一個(gè)exe文件,所有的第三方依賴桃煎、資源和代碼均被打包進(jìn)該exe內(nèi)

“-i”可不使用篮幢,如果打包后遇到問(wèn)題無(wú)法運(yùn)行exe程序,可將“-w”去掉重新運(yùn)行打包命令進(jìn)行打包为迈,在打開(kāi)程序時(shí)彈出的命令行窗口中檢查出現(xiàn)什么問(wèn)題三椿,進(jìn)而去解決報(bào)錯(cuò)問(wèn)題。(比較常見(jiàn)的是缺少庫(kù))

如果測(cè)試沒(méi)問(wèn)題葫辐,那就完成啦搜锰!


寫在最后

關(guān)于這篇文章

文章內(nèi)容都是基礎(chǔ)知識(shí),界面做的比較簡(jiǎn)陋耿战,主要是實(shí)用性就OK啦蛋叼,大神們?nèi)缬腥魏螁?wèn)題都可提出。

最后剂陡,希望這篇文章能夠幫助更多的人學(xué)習(xí)到更多東西狈涮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸭栖,隨后出現(xiàn)的幾起案子歌馍,更是在濱河造成了極大的恐慌晕鹊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玻褪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡公荧,警方通過(guò)查閱死者的電腦和手機(jī)带射,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門循狰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)券勺,“玉大人,你說(shuō)我怎么就攤上這事灿里」亓叮” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵儒拂,是天一觀的道長(zhǎng)色鸳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)命雀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任撵儿,我火速辦了婚禮狐血,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氛雪。我一直安慰自己,他們只是感情好浴鸿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布弦追。 她就那樣靜靜地躺著,像睡著了一般劲件。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗分,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天牵辣,我揣著相機(jī)與錄音,去河邊找鬼。 笑死择浊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琢岩。 我是一名探鬼主播投剥,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼江锨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糕篇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起娩缰,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拼坎,失蹤者是張志新(化名)和其女友劉穎完疫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壳鹤,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芳誓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锹淌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赂摆。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖烟号,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情达传,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布鹤树,位于F島的核電站逊朽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叽讳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一邑狸、第九天 我趴在偏房一處隱蔽的房頂上張望涤妒。 院中可真熱鬧,春花似錦她紫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赊堪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畜普,已是汗流浹背群叶。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舶衬,地道東北人赎离。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親舞蔽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子码撰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容