获取抠图API密钥
前往RemoveBg官网注册一个账号
RemoveBg官网:https://www.remove.bg/r/a9Dy3RhvgnKDphmsMbarJYrG
注册账户界面已翻译,Api每月可用50次
注册成功后登录,按图示所选点击
点击 Get Api Key 获取Api密钥
安装所需支持库
import os, shutil from PIL import Image # 处理图片换底色所需支持库 from removebg import RemoveBg # 抠图所需支持库
如果电脑只安装了python3原生软件,则打开cmd命令窗口,分别输入 pip install remoevbg 、pip install pillow(python2安装:pip install PIL) 和 pip install shutil ,等待安装成功即可
如果安装了Anaconda,则只需安装 removebg 库,其它库 Anaconda 已内置,我电脑安装了python3.8和Anaconda,用Anaconda操作,相对较为简单,接下来用Anaconda的Jupyter Notebook进行演示
主要代码编写
配置证件照所需更换底色
Background_Color = { 'Red': (255, 0, 0, 255), 'Blue': (67, 142, 219, 255), 'White': (255, 255, 255, 255) }
设置图片路径
pic = 'test.jpg' path = '%s' % os.getcwd()
进行抠图
rmbg = RemoveBg("Your-RemoveBg-Api-Key", "error.log") # 密钥,错误日志 rmbg.remove_background_from_img_file('%s\%s' % (path, pic)) # 抠图
更换底色
background = Image.new('RGBA', foreground.size, Background_Color[Red]) # 背景图,大小同前景图 background.paste(foreground, mask = foreground) background.show() # 显示图片
background.save(os.getcwd() + '\' + pic + "_no_bg.png") # 保存图片
改进并完善程序代码
该程序是比较简陋的控制台程序,多处使用 print 打印输出只是为什么更清楚的知道程序运行时到哪一步以及等待操作
import os, shutil from PIL import Image from removebg import RemoveBg # 证件照背景色 Background_Color = { 'Red': (255, 0, 0, 255), 'Blue': (67, 142, 219, 255), 'White': (255, 255, 255, 255) } pic = input("Tip:请将图片移至当前所在目录下! 请输入图片文件名(含文件后缀):") # 图片文件名 print("当前所在目录:" + os.getcwd()) if os.path.exists('img'): print(" 当前目录已存在img文件夹!!!") else: print(" 正在新建输出目录img ...") new_folder = '%s' % os.mkdir(os.getcwd() + '\img') # 新建文件夹 print("输出目录img创建成功!!! ") os.chdir('./img') # 切换至img目录下 if os.path.exists(pic) == False: print(" 正在复制图片至img文件夹......") shutil.copy('../' + pic, pic) print("目标图片已复制到img文件夹! ") path = '%s' % os.getcwd() # 当前所在路径 print("当前目标图片路径: " + '%s\%s' % (path, pic)) # 输出图片所在路径 # Api每月可用50次,降低同一张图片重复抠图频率 if os.path.exists(pic + '_no_bg.png'): print(" 当前目录已存在透明背景图片" + pic + '_no_bg.png ') else: print(" 正在生成错误日志(可不用理会)......") rmbg = RemoveBg("Your-RemoveBg-Api-Key", "error.log") # 密钥,错误日志 print("正在进行抠图......") rmbg.remove_background_from_img_file('%s\%s' % (path, pic)) # 抠图 print("已生成透明背景图片:" + pic + "_no_bg.png ") select_bgColor = input("Tip:更换红色背景按 r,更换蓝色背景按 b,根管白色背景按 w 请选择需要更换的证件照底色:") # 选择所需更换的底色 while True: if select_bgColor == 'r': color = 'Red' break elif select_bgColor == 'b': color = 'Blue' break elif select_bgColor == 'w': color = 'White' break else: select_bgColor = input(" 输入有误!请重新输入:") foreground = Image.open(pic + '_no_bg.png') # 前景图 background = Image.new('RGBA', foreground.size, Background_Color[color]) # 背景图,大小同前景图 background.paste(foreground, mask = foreground) print(" 正在展示图片......") background.show() # 显示图片 print("正在保存图片...... ") new_pic = pic + '_' + color + '.png' # 输出文件名 background.save(os.getcwd() + '\' + new_pic) # 保存图片 print("输出路径为:" + os.getcwd()) os.chdir('../') # 切换回原工作目录 print(" 保存成功!输出文件为:" + new_pic + " 按任意键退出 ") # 显示保存图片名 os.system('pause') # 按任意键继续
- 图片为网图,仅作测试使用,可点击图片查看,抠图出来的是透明背景色,有兴趣的可以试试换成白色底,两者有区别的
可以看出,抠图的效果还是不错的,比自己用PS要快,只需5秒左右
而且自己用PS抠图要把头发丝弄的这么精细还是有那么一点难度的
到这里,一个简陋的照片抠图换底色的小程序就完成了,当然,如果想把程序打包成exe文件,可以继续往下看
将程序打包成exe文件
安装支持库
打开cmd,输入 pip install PyInstaller ,等待安装完成
当然也可以去网上下载模块包 PyInstaller-3.6-py2.py3-none-any.whl ,切换到该离线模块包目录下,进行安装
这里分享一个可以下载python大部分模块的网站https://www.lfd.uci.edu/~gohlke/pythonlibs/ ,进入网页按 ctrl + F 输入关键字可以查找所需模块,点击下载
找到目标 .py 文件
因为Jupyter Notebook编写的python文件后缀是 .ipynb ,所以需要将其转换为 .py 文件
按图示所选下载 .py 文件,当然,如果是用python原生软件编写的,保存文件就是 .py 文件,无需转换
然后切换至该 .py 文件所在目录下,输入pyinstaller -F Your_File_Name.py
然后就是耐心等待,打包成exe文件的过程比较久
这里先来了解一下pyinstaller的一些常用参数
-F, –onefile 打包一个exe文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-d, –debug 产生debug版本的可执行文件
-w, –windowed, –noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c, –nowindowed, –console 使用控制台子系统执行(默认)(只对Windows有效)
pyinstaller -c xxxx.py
pyinstaller xxxx.py --console
打包成功后会出现3个文件夹和一个文件
最后打包成功的.exe 文件在 dist 目录下
点击可以运行
需要注意的是:
- 由于是打包成单个 .exe 文件,所以程序是把代码和支持库的代码打包在一起,所以程序会有点大,鉴于此,能用 from ... import ... ,就不用 import ...
- 其次是启动也有点慢,启动程序要5秒左右才显示,当然,不同电脑等待时间也不一样,请耐心等待,只有不是报错或者直接关闭,是可以使用的
- 代码是在Windows 10系统下编写的,打包成 .exe 文件曾在虚拟机上的Windows 7系统上运行出现报错,另一台Windows 10系统可以运行,就是等待时间较长