本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担

起因

看到一篇文章介绍了一个AI抠图的库removebg

抠图嘛,我也帮朋友干过这事,原来我自己是跟着doyoudo的教程做过,网站上直接看需要注册登录

不想注册的可以到优酷上看,在这里顺便安利一下doyoudo这个网站(看到请打钱谢谢):doyoudo是一个小清新的音视频剪辑软件教程网站

跟着教程熟悉了后大概10分钟就能P一张图,但是!现在有了这个人工智能抠图的库removebg,那肯定要来试一下效果

这个库大概介绍如下:默认生成的图片格式尺寸是标准的,每月最多免费处理 50 张照片。如果想生成高清甚至 4K 或者处理更多图片需要付费。算下来价格大概是 1 元一张。

于是准备用这个核心代码包装一下,继续做一个PyQt5的小程序,加强一下我的PyQt5功底看下能不能学到一些新东西

无GUI版本

注意:生成的图片会到原图片的目录并且文件名从图片名.图片后缀变为图片名.图片后缀_no_bg.png

替换背景

注册登录后去网站API接口获取自己的API,然后用以下几行代码就可实现基本的图片背景替换:from removebg import RemoveBg

rmbg = RemoveBg("你的apikey", "error.log")

rmbg.remove_background_from_img_file(r"C:\Users\soapffz\Desktop\640_2.jpg") # 图片位置

效果如下:

为了图片加载速度,这里画质被严重压缩请不要在意。

本文用到的这个核心库只有将背景图片背景移除的功能 ,填充为其他颜色使用PIL里的的Image来实现:

填充颜色from PIL import Image

img = Image.open(r'640.png').convert("RGBA")

x, y = img.size

card = Image.new("RGBA", img.size, (0, 0, 255))

card.paste(img, (0, 0, x, y), img)

card.save("640_2.jpg", format="png")

效果如下:

GUI版本

这里顺便补充下一直在用但一直忘记说的PyQt5的部分技巧

设计GUI

基础的设计教程都在<>这篇文章里面,可以在Python目录找到这篇文章

GUI设计图如图所示:

文件选择

选择单个文件:from os import path

from sys import argv

self.exe_path = path.dirname(argv[0]) # 获取当前程序运行的路径

self.pushButton.clicked.connect(self.chosepic) # 选择文件的按钮被按下时触发函数

def chosepic(self):

# 选择图片

file_name = QtWidgets.QFileDialog.getOpenFileName(

self, "选取文件", self.exe_path, "Pic Files (*.png;*.jpg);;Text Files (*.txt)")[0] # 设置文件扩展名过滤,用双分号间隔

if file_name == "":

print("用户取消选择")

return

print("你选择的文件为:", file_name)

选择单个文件夹:from os import path

from sys import argv

self.exe_path = path.dirname(argv[0]) # 获取当前程序运行的路径

self.pushButton.clicked.connect(self.chosedir) # 选择文件夹的按钮被按下时触发函数

def chosedir(self):

# 选择含图片的文件夹

dir_name = QtWidgets.QFileDialog.getExistingDirectory(

self, "选取文件夹", self.exe_path)

if dir_name == "":

print("\n取消选择")

return

print("你选择的文件夹为:", dir_name)

这里只介绍了常用的两种,多个文件选择可以使用选择单个文件夹再判断文件后缀的方法来实现,其他方法请参考参考文章。

弹框显示实现

常用函数:# 信息框

QMessageBox.information(self, '框名', '内容', 按钮s, 默认按钮)

# 问答框

QMessageBox.question(self, '框名', '内容', 按钮s, 默认按钮)

# 警告框

QMessageBox.warning(self, '框名', '内容', 按钮s, 默认按钮)

# 危险框

QMessageBox.ctitical(self, '框名', '内容', 按钮s, 默认按钮)

# 关于框

QMessageBox.about(self, '框名', '内容')

实例:from PyQt5.QtWidgets import QMessageBox

# 退出确定框

reply = QMessageBox.question(self, '退出', '确定退出?', QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.Cancel)

if reply == QMessageBox.Yes:

print('退出')

else:

print('不退出')

自定义消息框# 创建一个问答框,注意是Question

self.box = QMessageBox(QMessageBox.Question, '退出', '确定退出?')

# 添加按钮,可用中文

yes = self.box.addButton('确定', QMessageBox.YesRole)

no = self.box.addButton('取消', QMessageBox.NoRole)

# 设置消息框中内容前面的图标

self.box.setIcon(1)

# 设置消息框的位置,大小无法设置

self.box.setGeometry(500, 500, 0, 0)

# 显示该问答框

self.box.show()

if self.box.clickedButton() == yes:

print('退出')

else:

print('不退出')

参考文章:

设置超链接

一般都是在label组件上设置,在设计的时候正常填写文字即可,然后需要做如下设置:self.label_getapi.setText("点我获取APIKEY:") # 设置超文本文字

self.label_getapi.setOpenExternalLinks(True) # 允许默认浏览器访问超链接

复选框调用同一个函数检查状态

在我的程序设计中,默认是必须要生成没有背景的颜色的图片,其次才能选择其他背景颜色

那么怎样获取要转换的颜色有哪些呢?可以使用如下方法实现:self.bg_color_chose_l = [] # 需要转换的颜色有哪些

self.checkBox_white.stateChanged.connect(self.checkstate)

self.checkBox_blue.stateChanged.connect(self.checkstate)

self.checkBox_red.stateChanged.connect(self.checkstate)

self.pushButton_begin.clicked.connect(self.begin)

def checkstate(self, state):

# 用来检测有哪些转换颜色的选项被勾选上了

# 获取发送信号的checkbox

which_checkbox = self.sender()

if state == QtCore.Qt.Unchecked:

self.insert_msg_to_disp(

"用户不要{}色背景的图片了".format(which_checkbox.text()))

self.bg_color_chose_l.remove(which_checkbox.text())

if state == QtCore.Qt.Checked:

self.insert_msg_to_disp(

"用户想要{}色背景的图片".format(which_checkbox.text()))

self.bg_color_chose_l.append(which_checkbox.text())

if len(self.bg_color_chose_l) == 0:

self.insert_msg_to_disp("现在未选择任何背景!")

else:

self.insert_msg_to_disp(

"现在用户想要的背景颜色有:{}".format(self.bg_color_chose_l)

效果如下:

刷新页面

在程序可能会卡顿的地方尤其是for循环的第一句话添加这一行命令:QtWidgets.QApplication.processEvents()

最终效果

注意,在实际使用时发现当图片的背景过于复杂时不能成功清除背景

会在error.log中报如下错:ERROR:root:Unable to save C:\Users\soapffz\Desktop\xdx.jpg_no_bg.png due to could not identify foreground in image. for details and recommendations see https://www.remove.bg/supported-images.

所以,不要选择过于复杂的图片来实验,尽量就选择背景不那么复杂的人像

单个文件转换最终效果如下:

多个文件转换最终效果如下:

本文完。(熬夜爆肝到2点半)

成品下载链接(以后更新会放在这里):

本文永久链接:https://www.soapffz.com/python/321.html,未经许可禁止转载

python项目窗口背景颜色_Python--一个给证件照换底色的小程序相关推荐

  1. 推荐一个快速证件照换底色的工具超级好用

    推荐一个快速证件照换底色的工具超级好用 www.yzcopen.com/img/idphoto 选择好图片转换 下载无水印照片即可 方便着急和不会ps的朋友 不去摄影棚,不用PS

  2. 对比Python,看看Excel如何3步给证件照换底色?

    公众号后台回复"图书",了解更多号主新书内容 作者:黄伟呢 来源:数据分析与统计学之美 Python完成证件照换底色 该图片来源于百度图片,如果侵权,请联系我删除!图片仅用于知识交 ...

  3. python怎么更改背景颜色_python中绘图时怎么改背景颜色?

    python中一般使用matplotlib库进行绘图,下面我们就来看一下python中绘图时修改背景颜色的方法: 子图可以对plt.subplot的参数做修改,下面是对子图的背景颜色修改代码:impo ...

  4. python如何使用图片做背景_Python实现给照片换底色(附代码)

    本篇文章给大家带来的内容是关于Python实现给照片换底色(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 现在网上出现了很多在线换底色的网页版工具是这么做的呢?其实用Pyt ...

  5. oracle数据库渐变色,CSS3背景颜色渐变(gradients),适用于微信小程序

    CSS3 渐变(gradients)可以在两个或多个指定的颜色之间显示平稳的过渡. CSS3 定义了两种类型的渐变(gradients): 线性渐变(Linear Gradients)- 向下/向上/ ...

  6. python界面显示图片更换背景_用python制作一个简陋的证件照换底色的桌面控制台应用...

    获取抠图API密钥 前往RemoveBg官网注册一个账号 注册账户界面已翻译,Api每月可用50次 注册成功后登录,按图示所选点击 点击 Get Api Key 获取Api密钥 安装所需支持库 imp ...

  7. PySide2+Python:设置窗口背景颜色

    一.导入 QPalette 库 from PySide2.QtGui import QPalette 二.设置背景颜色 # 创建一个实例化对象 palette = self.window.palett ...

  8. 如何修改PyCharm窗口背景颜色?

    如何修改PyCharm窗口背景颜色? 前言 PyCharm是一种Python IDE,它可以提高用户在使用Python语言时的开发效率,它的默认窗口颜色是白色,但有时候我们希望窗口颜色较深一些,这样有 ...

  9. OpenGL入门:窗口开启、改变窗口背景颜色

    OpenGL入门 开启一个窗口: 运用OpenGL在窗口中绘制图形 显示一个窗口 利用OpenGL修改窗口背景颜色 改变颜色的闪烁 开启一个窗口: // Include for GLFW header ...

最新文章

  1. 中国互联网+果汁行业商业模式创新与投资机会深度研究报告
  2. Python模块包中__init__.py文件的作用
  3. mysql删除端口配置文件,linux中的Mysql的安装、重置安装密码、修改权限详解
  4. Android 高级编程【6个实战案例(附源码):刮刮卡、补间动画、逐帧动画、Fragment、RecyclerView、下拉刷新】
  5. centos 6安装报错
  6. 【好用的ORM框架】
  7. python print 如何加锁_python中给程序加锁之fcntl模块的使用
  8. 张一鸣:优秀年轻人的五个特点
  9. android 静默暗转_Android静默安装
  10. php数据库搬家,php 用adodb实现数据库搬家
  11. 字符串插入mysql_mysql实现随机字符串插入
  12. mysql mysqlhotcopy_mysql中mysqlhotcopy备份数据库总结
  13. mac无法正确打开html,苹果MacBook电脑打不开网页不能访问怎么办
  14. C++进阶 —— 哈希
  15. 【附源码】计算机毕业设计java-志愿者管理系统设计与实现
  16. linux和windows局域网连接网络,linux与windows局域网互访
  17. DeskSpace-适用于Vista的类似Beryl的3D多维数据集虚拟桌面管理器
  18. Android7.0(Android N)适配教程,心得
  19. 微信小程序如何获取用户绑定手机号
  20. MS Materials Studio 安装

热门文章

  1. Comparator使用简介
  2. 使用SQL语句查询目前表格成绩为空的学生信息
  3. Nginx - 虚拟主机与域名解析
  4. vue项目webpack打包配置
  5. 30分钟搞懂 HTTP 缓存
  6. vivo入驻华为测试鸿蒙,VIVO联动华为?官方宣传图出现华为智联,为鸿蒙合作埋下伏笔...
  7. 考研考C语言多还是JAVA多,我现在是一名大三的学生。我现在已经学过C语言,资料结构和资料库。如果想往计算机方面考研还需要学什么?...
  8. 有关英语学习的一点体会(转载)
  9. 计算机二级C语言与专升本编程题(入门级),用函数isprime(x)判断[n,m](n<m)之间所有的素数,并求其和
  10. 数字信号处理(5)- 卡尔曼滤波器