前言
在校大學(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í)到更多東西狈涮。