图片批量主动抠图去背景
明天发现个好货色啊,叫片刻抠图(pickwant.com),是一个在线对图片主动抠图去除背景的网站。只有上传图片,就能够主动把背景去掉把指标对象抠出来。
不论是动物、汽车或各种产品,还是人物,都能够全自动做到令人惊艳的抠图成果!而且还说能够做到发丝级 AI 主动抠图,作为一个头发存留不多的程序员,忽然莫名感觉到一丝来自这个世界的歹意。
这个抠图有什么用?比方能够把人物抠出来换个背景:
也能够把产品抠出来做成新的商品宣传图:(做电商的敌人必定懂)
这么好用的货色,当初最要害的是:完全免费!
emmmmmm,这个音讯被我的几十个后任女友晓得了,她们纷纷发来照片,要我给她把照片背景给去掉,把她美美的人像给抠出来,之后好换上马尔代夫的背景。
这么多的图片要一张张传上去,再下载回来,同样的事件做几十遍那我必定不会做的。
那么,必须要写个 Python 自动化脚本程序来搞定了。
说干就干,二话不说就掏出网页自动化的神器 Selenium
,写简略几行代码:
"""Selenium是第三方库,须要先装置,在Teminal里执行:pip install selenium驱动程序 chromedriver 须要依据浏览器 chrome 的版本下载有问题的能够加我:youbafu (全网对立id)"""from selenium import webdriverfrom selenium.webdriver.chrome.service import Services = Service(r'D:\driver\chromedriver.exe')# 初始化浏览器为chrome浏览器browser = webdriver.Chrome(service=s)# 关上 片刻抠图browser.get(r'https://www.pickwant.com')
就实现了主动关上网页:
但这是远远不够的,咱们须要实现主动上传图片,而后主动下载。
通过几次手动操作得出法则,咱们只有进入到编辑界面
而后循环执行以下步骤:
1、点击网页右上角的从新上传
按钮。
2、抉择要上传的图片,点关上
按钮。
3、等几秒抠好图后,点网页右上角下载
按钮。
4、弹出对话框后,再点 确认下载
就会主动保留图片。
就能够顺次把文件夹里的前女友们的图片实现主动抠图了。
要做出自动化脚本,接下来就是找到这些按钮,而后模仿点击就能够了。在从新下载
按钮上点鼠标右键,在弹出的菜单中点查看
,弹出了网页的元素查看界面,再反复操作一次,就定位到了这个按钮的网页代码:
能够看到从新上传
是个 span ,这里能够取它的下级 div,它的class是 border_wrap upload_wrap
,那么就能够写代码定位到这个元素,而后执行 click()
操作了。
import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Bys = 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()
这里要特地阐明的是,依据 CSS 的根本语法,id用#
示意,class用.
来示意,如果两头有空格也是用.
来拼接,上级标签用>
来拼接。
<div data-v-0373fdbc="" class="border_wrap upload_wrap"></div>
对于这样的 div 标签,其class是 border_wrap upload_wrap ,所以 By.CSS_SELECTOR 的查找元素的参数就是 '.border_wrap.upload_wrap' 。
代码执行后,弹出一个抉择文件的对话框:
这时候问题来了,这个对话框是 Windows 零碎级别的,不受Selenium
管制,怎么办?
不要慌,这难不倒霸夫老师,既然是 Windows 零碎弹窗,那总得受系统控制吧!
那就祭出 pywin32 库来凑合它,在终端命令行(Terminal)里输出命令装置库:
pip install pywin32
而后再关上查看 Windows 窗口信息的神器 spy++
,拿到窗口的类名和层次结构关系,就能够写出以下的主动抉择文件并点击按钮的函数代码了:
import win32con # win32库里蕴含了很多模块import win32gui # 这里导入具体用到的模块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) # 点 关上 按钮 time.sleep(5)
先写好这个函数备用,等下要上传哪张图片,只有调用函数时把图片的文件门路作为参数传入,就能够实现指标了。
上传图片后,只有稍等一两秒就主动实现抠图了。这时候再点网页右上角下载
按钮,等弹出对话框后,再点 确认下载
就会主动保留图片。
后面咱们学习了定位元素的办法了,再定位这两个按钮对咱们来说不是什么艰难了。
然而,你都能保持看到这里了,霸夫老师必须要教你个更牛X的更不便的技巧了:
在下载
按钮上点鼠标右键,在弹出的菜单中点查看
,弹出了网页的元素查看界面,再反复操作一次,就定位到了这个按钮的网页代码。而后在它的上一级的这个div
标签上点鼠标右键,抉择Copy
,再抉择 Copy selector
。
而后回到python代码编辑窗口,粘贴就能够取得精确的定位参数:
#app > div > div:nth-child(1) > div.col-md-12.wonx_row.top_bar > div.border_wrap.download_wrap
这样就省去了辛辛苦苦去了解和转化参数,大大提高效率,接下来就能够轻松写出定位元素和点击的代码:
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() # 点击 下载time.sleep(0.5)comfirm = browser.find_element(By.CSS_SELECTOR, '#app > div > div.container > div.dialog-content > div > div.download_wrap')comfirm.click() # 点击 确认下载time.sleep(1)
单张图片的上传和下载流程都写完了,接下来要写个获取文件夹下所有图片的函数,来实现顺次把每个后任的图片都实现抠图的工作。
我把她们的照片都放在电脑的 E: 盘下的后任女友
这个文件夹里,那么只有读取这个文件夹下的所有图片,顺次执行执行一遍上传和下载操作就能够了。
文件夹门路 = r'E:\后任女友'names = os.listdir(文件夹门路) # 列举出该目录下所有的文件名for name in names: path = os.path.join(文件夹门路, name) # 拼接出图片残缺门路 # 点击从新上传() # 期待封装 上传图片(path) # 点击下载() # 期待封装
所有的逻辑都理分明了,模块也根本写好了,接下来就把代码整合一下,来看残缺代码:
"""片刻抠图图片批量主动抠图去背景作者:有霸夫有问题请加vx:youbafu"""import timefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byimport win32conimport win32guiimport oss = 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 点击从新上传(): while True: try: # 定位到 从新上传 按钮 upload = browser.find_element(By.CSS_SELECTOR, '.border_wrap.upload_wrap') upload.click() except: print('请先扫描登录或实现验证码辨认') else: print('点击 从新上传') 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('上传:', 文件门路) time.sleep(0.5) win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button) # 点 关上 按钮 time.sleep(5)def 点击下载(): while True: try: 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() except: print('请先扫描登录或实现验证码辨认') else: print('点击 下载') break finally: time.sleep(1)文件夹门路 = r'E:\后任女友'names = os.listdir(文件夹门路) # 列举出该目录下所有的文件名for name in names: path = os.path.join(文件夹门路, name) # 拼接出图片残缺门路 点击从新上传() 上传图片(path) 点击下载()print('祝贺!全副实现')
在残缺代码中退出了异样解决,如果遇到须要扫码登录或者验证码,手动操作一下,还会继续执行上来的。
有任何问题请分割有霸夫(youbafu),祝大家玩得开心。