Python PyQt5结合Remove.bg API实现桌面级智能抠图工具

橘子海
橘子海
发布时间:2026-10-14| 6人浏览过
原创

本文详细介绍如何使用Python PyQt5框架结合Remove.bg API,开发一款高效的桌面级图像抠图工具。内容涵盖API Key获取、界面UI布局设计、文件选择逻辑、API调用实现及样式美化,提供完整代码示例,帮助开发者快速掌握Python GUI编程与图像处理接口的集成方法。

简介

本文旨在通过一个小型实战项目,深入实践PyQt5框架的应用。该项目利用Remove.bg提供的API接口,实现自动去除人物照片背景的功能,并将这一核心能力封装为独立的桌面应用程序,便于日常使用。

1.获取API

首先访问Remove.bg官方网站。

在导航栏中找到并点击“工具”与“API”入口。

接着进入“API Docs”文档页面。

最后点击“Get API Key”按钮获取密钥,注意需先完成账号登录操作。

2.API使用方法

具体的API调用规范可在“API Docs”页面下方查阅。

3.可视化桌面制作


def ui_init(self):
        self.setWindowTitle('抠图') # 设置窗口标题
        self.resize(610,500) # 设置窗口大小

        self.button = QPushButton('选择图片')

		'''两个放置图片的Qlable'''
        self.before_lable = QLabel()
        self.before_lable.setToolTip('原来的图片') # 设置提示信息
        self.before_lable.resize(300,400)
        self.before_lable.setScaledContents(True) # 设置图片自适应窗口大小
        self.before_lable.setFrameShape(QFrame.Panel|QFrame.Plain)
        self.after_lable = QLabel()
        self.after_lable.setToolTip('处理后的图片') # 设置提示信息	
        self.after_lable.resize(300,400)	
        self.after_lable.setScaledContents(True) # 设置图片自适应窗口大小
        self.after_lable.setFrameShape(QFrame.Panel|QFrame.Plain)
		
		'''一条线'''
        self.frame = QFrame()
        self.frame.setFrameShape(QFrame.VLine|QFrame.Plain)

		'''窗口布局'''
        self.h_layout = QHBoxLayout()
        self.v_layout = QVBoxLayout()
        self.h_layout.addWidget(self.before_lable)
        self.h_layout.addWidget(self.frame)
        self.h_layout.addWidget(self.after_lable)
        self.v_layout.addWidget(self.button)
        self.v_layout.addLayout(self.h_layout)
        self.widget = QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(self.v_layout)

通过调用setToolTip方法,为界面元素添加鼠标悬停时的提示信息。


self.before_lable.setToolTip('原来的图片') # 设置提示信息

利用setScaledContents方法,确保显示在before_lable控件上的图片能够根据窗口大小自动缩放适配。


self.before_lable.setScaledContents(True)

使用setFrameShape方法定义QLabel的边框形状。由于QFrame是QLabel的基类,因此可以直接调用QFrame的相关方法来设置样式。


self.before_lable.setFrameShape(QFrame.Panel|QFrame.Plain)

样式组合表

窗口整体布局结构如下: 主容器采用垂直布局,内部包含一个按钮和一个水平布局的子容器。 水平布局子容器中包含两个QLabel控件和一个QFrame分隔线。

4.逻辑实现


def file(self):
        fname,a = QFileDialog.getOpenFileName(self,'打开文件','.','图像文件(*.jpg *.png)') # 用来选择文件
        if fname:
            self.before_lable.setPixmap(QPixmap(fname)) # 将原来的图片显示在before_lable控件上

			'''API调用'''
            response = requests.post(
            'https://api.remove.bg/v1.0/removebg',
            files={'image_file': open(fname, 'rb')},
            data={'size': 'auto'},
            headers={'X-Api-Key': '你们自己的API Key'},
            )
            if response.status_code == requests.codes.ok:
                with open('no-bg.png', 'wb') as f:
                    f.write(response.content)
                try:
                    self.after_lable.setPixmap(QPixmap('./no-bg.png'))
                except FileNotFoundError:
                    pass 

使用QFileDialog.getOpenFileName方法让用户选择本地图片文件。该函数返回元组,其中第一个元素为选中的文件路径,即为我们需要的数据。


fname,a = QFileDialog.getOpenFileName(self,'打开文件','.','图像文件(*.jpg *.png)') # 用来选择文件

5.美化

本示例仅对按钮控件进行了视觉美化处理。


def qss_init(self):
        qss = '''
        QPushButton{
                border-radius: 6px;
                border: none;
                height: 25px;
                color: white;
                background: rgb(57, 58, 60);
            }

        QPushButton:enabled:hover{
                background: rgb(230, 39, 39);
            }
        QPushButton:enabled:pressed{
                background: rgb(255, 0, 0);
            }
            '''
        self.setStyleSheet(qss) # 加载样式

6.信号与槽绑定


def connect_init(self):
        self.button.clicked.connect(self.file) 

7.全部代码


import sys 
from PyQt5.QtWidgets import QApplication, QPushButton, QStatusBar, QWidget, QFileDialog, QLabel, QHBoxLayout, QVBoxLayout, QFrame, QMainWindow
from PyQt5.QtGui import QPixmap
import requests
class removebg(QMainWindow):
    def __init__(self):
        super(removebg,self).__init__()
        self.ui_init()
        self.qss_init()
        self.connect_init()

    def ui_init(self):
        self.setWindowTitle('抠图')
        self.resize(610,500)

        self.button = QPushButton('选择图片')
        self.before_lable = QLabel()
        self.before_lable.setToolTip('原来的图片')
        self.before_lable.resize(300,400)
        self.before_lable.setScaledContents(True) # 设置图片自适应窗口大小
        self.before_lable.setFrameShape(QFrame.Panel|QFrame.Plain)
        self.after_lable = QLabel()
        self.after_lable.setToolTip('处理后的图片')	
        self.after_lable.resize(300,400)	
        self.after_lable.setScaledContents(True) # 设置图片自适应窗口大小
        self.after_lable.setFrameShape(QFrame.Panel|QFrame.Plain)


        self.frame = QFrame()
        self.frame.setFrameShape(QFrame.VLine|QFrame.Plain)
        self.h_layout = QHBoxLayout()
        self.v_layout = QVBoxLayout()
        self.h_layout.addWidget(self.before_lable)
        self.h_layout.addWidget(self.frame)
        self.h_layout.addWidget(self.after_lable)
        self.v_layout.addWidget(self.button)
        self.v_layout.addLayout(self.h_layout)
        self.widget = QWidget()
        self.setCentralWidget(self.widget)
        self.widget.setLayout(self.v_layout)

    def file(self):
        fname,a = QFileDialog.getOpenFileName(self,'打开文件','.','图像文件(*.jpg *.png)')
        if fname:
            self.before_lable.setPixmap(QPixmap(fname))


            response = requests.post(
            'https://api.remove.bg/v1.0/removebg',
            files={'image_file': open(fname, 'rb')},
            data={'size': 'auto'},
            headers={'X-Api-Key': '7Uuo8dhdTHwSXUdjhKZP7h9c'},
            )
            if response.status_code == requests.codes.ok:
                with open('no-bg.png', 'wb') as f:
                    f.write(response.content)
                try:
                    self.after_lable.setPixmap(QPixmap('./no-bg.png'))
                except FileNotFoundError:
                    pass 
    
    def connect_init(self):
        self.button.clicked.connect(self.file)        

    def qss_init(self):
        qss = '''
        QPushButton{
                border-radius: 6px;
                border: none;
                height: 25px;
                color: white;
                background: rgb(57, 58, 60);
            }

        QPushButton:enabled:hover{
                background: rgb(230, 39, 39);
            }
        QPushButton:enabled:pressed{
                background: rgb(255, 0, 0);
            }
            '''
        self.setStyleSheet(qss)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    dispaly = removebg()
    dispaly.show()
    sys.exit(app.exec_())

8.界面展示

此外,还可以为生成的程序添加专属图标以增强辨识度。

至此,关于Python PyQt5结合Remove.bg API实现高效抠图去背景的完整教程已结束。如需了解更多Python PyQt5相关抠图技巧,欢迎查阅本站往期文章或继续浏览后续内容,感谢大家的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。