Python圖片批量自動(dòng)摳圖去背景的代碼詳解
今天發(fā)現(xiàn)個(gè)好東西啊,叫片刻摳圖,是一個(gè)在線對圖片自動(dòng)摳圖去除背景的網(wǎng)站。只要上傳圖片,就可以自動(dòng)把背景去掉把目標(biāo)對象摳出來。
不管是動(dòng)物、汽車或各種產(chǎn)品,還是人物,都可以全自動(dòng)做到令人驚艷的摳圖效果!而且還說可以做到發(fā)絲級 AI 自動(dòng)摳圖,作為一個(gè)頭發(fā)存留不多的程序員,突然莫名感覺到一絲來自這個(gè)世界的惡意。
這個(gè)摳圖有什么用?比如可以把人物摳出來換個(gè)背景:
也可以把產(chǎn)品摳出來做成新的商品宣傳圖:(做電商的朋友肯定懂)
這么好用的東西,現(xiàn)在最關(guān)鍵的是:完全免費(fèi)!
emmmmmm,這個(gè)消息被我的幾十個(gè)前任女友知道了,她們紛紛發(fā)來照片,要我給她把照片背景給去掉,把她美美的人像給摳出來,之后好換上馬爾代夫的背景。
這么多的圖片要一張張傳上去,再下載回來,同樣的事情做幾十遍那我肯定不會做的。
那么,必須要寫個(gè) Python 自動(dòng)化腳本程序來搞定了。
說干就干,二話不說就掏出網(wǎng)頁自動(dòng)化的神器Selenium
,寫簡單幾行代碼:
""" Selenium是第三方庫,需要先安裝,在Teminal里執(zhí)行:pip install selenium 驅(qū)動(dòng)程序 chromedriver 需要根據(jù)瀏覽器 chrome 的版本下載 有問題的可以加我:youbafu (全網(wǎng)統(tǒng)一id) from selenium import webdriver from selenium.webdriver.chrome.service import Service s = Service(r'D:\driver\chromedriver.exe') # 初始化瀏覽器為chrome瀏覽器 browser = webdriver.Chrome(service=s) # 打開 片刻摳圖 browser.get(r'https://www.pickwant.com')
就完成了自動(dòng)打開網(wǎng)頁:
但這是遠(yuǎn)遠(yuǎn)不夠的,我們需要實(shí)現(xiàn)自動(dòng)上傳圖片,然后自動(dòng)下載。
通過幾次手動(dòng)操作得出規(guī)律,我們只要進(jìn)入到編輯界面
然后循環(huán)執(zhí)行以下步驟:
1、點(diǎn)擊網(wǎng)頁右上角的重新上傳
按鈕。
2、選擇要上傳的圖片,點(diǎn)打開
按鈕。
3、等幾秒摳好圖后,點(diǎn)網(wǎng)頁右上角下載
按鈕。
4、彈出對話框后,再點(diǎn)確認(rèn)下載
就會自動(dòng)保存圖片。
就可以依次把文件夾里的前女友們的圖片完成自動(dòng)摳圖了。
要做出自動(dòng)化腳本,接下來就是找到這些按鈕,然后模擬點(diǎn)擊就可以了。在重新下載
按鈕上點(diǎn)鼠標(biāo)右鍵,在彈出的菜單中點(diǎn)檢查
,彈出了網(wǎng)頁的元素查看界面,再重復(fù)操作一次,就定位到了這個(gè)按鈕的網(wǎng)頁代碼:
可以看到重新上傳
是個(gè) span ,這里可以取它的上級 div,它的class是border_wrap upload_wrap
,那么就可以寫代碼定位到這個(gè)元素,然后執(zhí)行click()
操作了。
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By s = Service(r'D:\driver\chromedriver.exe') # 初始化瀏覽器為chrome瀏覽器 browser = webdriver.Chrome(service=s) # 打開 片刻摳圖 browser.get(r'https://www.pickwant.com/#/editor') time.sleep(1) # 定位到 重新上傳 按鈕 upload = browser.find_element(By.CSS_SELECTOR, '.border_wrap.upload_wrap') upload.click()
這里要特別說明的是,根據(jù) CSS 的基本語法,id用#
表示,class用.
來表示,如果中間有空格也是用.
來拼接,下級標(biāo)簽用>
來拼接。
<div data-v-0373fdbc="" class="border_wrap upload_wrap"></div>
對于這樣的 div 標(biāo)簽,其class是 border_wrap upload_wrap ,所以 By.CSS_SELECTOR 的查找元素的參數(shù)就是 ‘.border_wrap.upload_wrap’ 。
代碼執(zhí)行后,彈出一個(gè)選擇文件的對話框:
這時(shí)候問題來了,這個(gè)對話框是 Windows 系統(tǒng)級別的,不受Selenium
控制,怎么辦?
不要慌,這難不倒霸夫老師,既然是 Windows 系統(tǒng)彈窗,那總得受系統(tǒng)控制吧!
那就祭出 pywin32 庫來對付它,在終端命令行(Terminal)里輸入命令安裝庫:
pip install pywin32
然后再打開查看 Windows 窗口信息的神器spy++
,拿到窗口的類名和層次結(jié)構(gòu)關(guān)系,就可以寫出以下的自動(dòng)選擇文件并點(diǎn)擊按鈕的函數(shù)代碼了:
import win32con # win32庫里包含了很多模塊 import win32gui # 這里導(dǎo)入具體用到的模塊 def 上傳圖片(文件路徑): dialog = win32gui.FindWindow('#32770', u'打開') # 對話框 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次尋找對象,直到找到輸入框Edit對象的句柄 button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 打開按鈕 time.sleep(0.5) win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 文件路徑) # 往輸入框輸入絕對地址 time.sleep(0.5) win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 點(diǎn) 打開 按鈕 time.sleep(5)
先寫好這個(gè)函數(shù)備用,等下要上傳哪張圖片,只要調(diào)用函數(shù)時(shí)把圖片的文件路徑作為參數(shù)傳入,就可以完成目標(biāo)了。
上傳圖片后,只要稍等一兩秒就自動(dòng)完成摳圖了。這時(shí)候再點(diǎn)網(wǎng)頁右上角下載
按鈕,等彈出對話框后,再點(diǎn)確認(rèn)下載
就會自動(dòng)保存圖片。
前面我們學(xué)習(xí)了定位元素的方法了,再定位這兩個(gè)按鈕對我們來說不是什么困難了。
但是,你都能堅(jiān)持看到這里了,霸夫老師必須要教你個(gè)更牛X的更方便的技巧了:
在下載
按鈕上點(diǎn)鼠標(biāo)右鍵,在彈出的菜單中點(diǎn)檢查
,彈出了網(wǎng)頁的元素查看界面,再重復(fù)操作一次,就定位到了這個(gè)按鈕的網(wǎng)頁代碼。然后在它的上一級的這個(gè)div
標(biāo)簽上點(diǎn)鼠標(biāo)右鍵,選擇Copy
,再選擇Copy selector
。
然后回到python代碼編輯窗口,粘貼就可以獲得準(zhǔn)確的定位參數(shù):
#app > div > div:nth-child(1) > div.col-md-12.wonx_row.top_bar > div.border_wrap.download_wrap
這樣就省去了辛辛苦苦去理解和轉(zhuǎn)化參數(shù),大大提高效率,接下來就可以輕松寫出定位元素和點(diǎn)擊的代碼:
download = browser.find_element(By.CSS_SELECTOR, '#app > div > div:nth-child(1) > div.col-md-12.wonx_row.top_bar > div.border_wrap.download_wrap') download.click() # 點(diǎn)擊 下載 time.sleep(0.5) comfirm = browser.find_element(By.CSS_SELECTOR, '#app > div > div.container > div.dialog-content > div > div.download_wrap') comfirm.click() # 點(diǎn)擊 確認(rèn)下載 time.sleep(1)
單張圖片的上傳和下載流程都寫完了,接下來要寫個(gè)獲取文件夾下所有圖片的函數(shù),來實(shí)現(xiàn)依次把每個(gè)前任的圖片都完成摳圖的任務(wù)。
我把她們的照片都放在電腦的 E: 盤下的前任女友
這個(gè)文件夾里,那么只要讀取這個(gè)文件夾下的所有圖片,依次執(zhí)行執(zhí)行一遍上傳和下載操作就可以了。
文件夾路徑 = r'E:\前任女友' names = os.listdir(文件夾路徑) # 列舉出該目錄下所有的文件名 for name in names: path = os.path.join(文件夾路徑, name) # 拼接出圖片完整路徑 # 點(diǎn)擊重新上傳() # 等待封裝 上傳圖片(path) # 點(diǎn)擊下載() # 等待封裝
所有的邏輯都理清楚了,模塊也基本寫好了,接下來就把代碼整合一下,來看完整代碼:
""" 片刻摳圖 圖片批量自動(dòng)摳圖去背景 作者:有霸夫 有問題請加vx:youbafu import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import win32con import win32gui import os s = Service(r'D:\driver\chromedriver.exe') # 初始化瀏覽器為chrome瀏覽器 browser = webdriver.Chrome(service=s) # 打開 片刻摳圖 browser.get(r'https://www.pickwant.com') time.sleep(1) browser.get(r'https://www.pickwant.com/#/editor') time.sleep(2) def 點(diǎn)擊重新上傳(): while True: try: # 定位到 重新上傳 按鈕 upload = browser.find_element(By.CSS_SELECTOR, '.border_wrap.upload_wrap') upload.click() except: print('請先掃描登錄或完成驗(yàn)證碼識別') else: print('點(diǎn)擊 重新上傳') break finally: time.sleep(1) def 上傳圖片(文件路徑): dialog = win32gui.FindWindow('#32770', u'打開') # 對話框 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None) ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None) Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None) # 上面三句依次尋找對象,直到找到輸入框Edit對象的句柄 button = win32gui.FindWindowEx(dialog, 0, 'Button', None) # 打開按鈕 if Edit is not None and button is not None: time.sleep(0.5) win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 文件路徑) # 往輸入框輸入絕對地址 print('上傳:', 文件路徑) win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 點(diǎn) 打開 按鈕 time.sleep(5) def 點(diǎn)擊下載(): download = browser.find_element(By.CSS_SELECTOR, '.border_wrap.download_wrap') download.click() time.sleep(0.5) confirm = browser.find_element(By.CSS_SELECTOR, '.dialog-content>.content_wrap>.download_wrap') confirm.click() print('點(diǎn)擊 下載') 文件夾路徑 = r'E:\前任女友' names = os.listdir(文件夾路徑) # 列舉出該目錄下所有的文件名 for name in names: path = os.path.join(文件夾路徑, name) # 拼接出圖片完整路徑 點(diǎn)擊重新上傳() 上傳圖片(path) 點(diǎn)擊下載() print('恭喜!全部完成')
在完整代碼中加入了異常處理,如果遇到需要掃碼登錄或者驗(yàn)證碼,手動(dòng)操作一下,還會繼續(xù)執(zhí)行下去的。
到此這篇關(guān)于Python圖片批量自動(dòng)摳圖去背景的文章就介紹到這了,更多相關(guān)Python批量自動(dòng)摳圖去背景內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲動(dòng)態(tài)ip代理防止被封的方法
在本篇文章中小編給大家整理了關(guān)于Python爬蟲動(dòng)態(tài)ip代理防止被封的方法以及實(shí)例代碼,需要的朋友們學(xué)習(xí)下。2019-07-07簡單學(xué)習(xí)Python多進(jìn)程Multiprocessing
這篇文章主要和大家一起簡單的學(xué)習(xí)Python多進(jìn)程Multiprocessing ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Python version 2.7 required, which was not found in the regi
這篇文章主要介紹了安裝PIL庫時(shí)提示錯(cuò)誤Python version 2.7 required, which was not found in the registry問題的解決方法,需要的朋友可以參考下2014-08-08實(shí)例詳解Python中的numpy.abs和abs函數(shù)
Numpy是python中最有用的工具之一,它可以有效地處理大容量數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Python中numpy.abs和abs函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python pygame實(shí)現(xiàn)圖像基本變換的示例詳解
pygame的transform中封裝了一些基礎(chǔ)的圖像處理函數(shù),這篇文章主要為大家介紹了pygame實(shí)現(xiàn)圖像的基本變換,例如縮放、旋轉(zhuǎn)、鏡像等,感興趣的小伙伴可以了解一下2023-11-11Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法
今天小編就為大家分享一篇Python獲取數(shù)據(jù)庫數(shù)據(jù)并保存在excel表格中的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06如何解決pytorch訓(xùn)練過程中CPU內(nèi)存溢出問題
這篇文章主要介紹了如何解決pytorch訓(xùn)練過程中CPU內(nèi)存溢出問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09