Background remover скрипт

В тази статия ще разгледаме как да създадем Python скрипт с GUI интерфейс, който използва библиотеката rembg за премахване на фона на изображения и tkinter за графичния интерфейс.
Софтуерни изисквания
- Python (версия 3.6 или по-нова)
- Библиотеката Tkinter (вградена в стандартната библиотека на Python)
- Библиотеката rembg за премахване на фона на изображения
За да използвате този скрипт, трябва да инсталирате необходимите библиотеки. Можете да ги инсталирате с помощта на pip:
pip install rembg PillowФункционалности на скрипта
Програмата предлага следните функционалности:
- Бутон за избор на изображение
- Показване на оригиналното изображение
- Бутон за премахване на фона
- Показване на обработеното изображение
- Възможност за запазване на резултата
- Индикатор за прогрес при обработка
Как да използвате програмата
За да използвате програмата:
- Стартирайте скрипта
- Натиснете "Избери изображение" и изберете снимка
- Натиснете "Премахни фона"
- След обработката използвайте бутона "Запази", за да съхраните резултата
Как да започнете
Трябва да започнете със създаване на нов файл с разширение ".py". Отворете любимият си текстов редактор и добавете следният код:
# Author : Fedya Serafiev
# Version : 1.0
# License : MIT
# Copyright : Fedya Serafiev (2025)
# Contact : https://urocibg.eu/
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from PIL import Image, ImageTk
import os
from rembg import remove
class BackgroundRemover:
def __init__(self, root):
self.root = root
self.root.title("Премахване на фон")
self.root.geometry("1000x700")
# Задаване на цветова схема
self.colors = {
'primary': '#2196F3', # Синьо
'secondary': '#4CAF50', # Зелено
'background': '#F5F5F5', # Светло сиво
'text': '#212121', # Тъмно сиво
'accent': '#FF4081' # Розово
}
# Конфигуриране на основния стил
self.root.configure(bg=self.colors['background'])
# Създаване на основен контейнер
self.main_frame = tk.Frame(root, bg=self.colors['background'])
self.main_frame.pack(padx=20, pady=20, fill=tk.BOTH, expand=True)
# Заглавие
title_label = tk.Label(
self.main_frame,
text="Премахване на фон от изображение",
font=('Helvetica', 20, 'bold'),
fg=self.colors['primary'],
bg=self.colors['background']
)
title_label.pack(pady=(0, 20))
# Бутони
self.btn_frame = tk.Frame(self.main_frame, bg=self.colors['background'])
self.btn_frame.pack(pady=20)
# Стилизиране на бутоните
button_style = {
'font': ('Helvetica', 12),
'borderwidth': 0,
'padx': 20,
'pady': 10,
'cursor': 'hand2'
}
self.select_btn = tk.Button(
self.btn_frame,
text="Избери изображение",
bg=self.colors['primary'],
fg='white',
command=self.select_image,
**button_style
)
self.select_btn.pack(side=tk.LEFT, padx=10)
self.process_btn = tk.Button(
self.btn_frame,
text="Премахни фона",
bg=self.colors['secondary'],
fg='white',
command=self.remove_background,
state=tk.DISABLED,
**button_style
)
self.process_btn.pack(side=tk.LEFT, padx=10)
# Създаване на контейнери за изображенията
self.image_container = tk.Frame(self.main_frame, bg=self.colors['background'])
self.image_container.pack(fill=tk.BOTH, expand=True, pady=20)
# Контейнер за оригинално изображение
self.original_frame = tk.Frame(
self.image_container,
bg='white',
bd=1,
relief=tk.SOLID
)
self.original_frame.pack(side=tk.LEFT, padx=10, fill=tk.BOTH, expand=True)
self.original_label = tk.Label(
self.original_frame,
text="Оригинално изображение",
font=('Helvetica', 12),
bg='white',
fg=self.colors['text']
)
self.original_label.pack(pady=10)
self.original_image_label = tk.Label(self.original_frame, bg='white')
self.original_image_label.pack(expand=True, pady=10)
# Контейнер за обработено изображение
self.processed_frame = tk.Frame(
self.image_container,
bg='white',
bd=1,
relief=tk.SOLID
)
self.processed_frame.pack(side=tk.RIGHT, padx=10, fill=tk.BOTH, expand=True)
self.processed_label = tk.Label(
self.processed_frame,
text="Обработено изображение",
font=('Helvetica', 12),
bg='white',
fg=self.colors['text']
)
self.processed_label.pack(pady=10)
self.processed_image_label = tk.Label(self.processed_frame, bg='white')
self.processed_image_label.pack(expand=True, pady=10)
# Добавяне на прогрес индикатор
self.progress = ttk.Progressbar(
self.main_frame,
orient="horizontal",
length=300,
mode="indeterminate"
)
self.image_path = None
self.processed_image = None
# Добавяне на hover ефекти за бутоните
self.add_button_hover_effects()
def add_button_hover_effects(self):
def on_enter(e, button, color):
if button['state'] != 'disabled':
button.configure(bg=self.lighten_color(color))
def on_leave(e, button, color):
if button['state'] != 'disabled':
button.configure(bg=color)
self.select_btn.bind('<Enter>', lambda e: on_enter(e, self.select_btn, self.colors['primary']))
self.select_btn.bind('<Leave>', lambda e: on_leave(e, self.select_btn, self.colors['primary']))
self.process_btn.bind('<Enter>', lambda e: on_enter(e, self.process_btn, self.colors['secondary']))
self.process_btn.bind('<Leave>', lambda e: on_leave(e, self.process_btn, self.colors['secondary']))
def lighten_color(self, color):
# Опростена функция за изсветляване на цвят
return '#40A9FF' if color == self.colors['primary'] else '#66BB6A'
def select_image(self):
file_path = filedialog.askopenfilename(
filetypes=[("Image files", "*.png *.jpg *.jpeg *.bmp *.gif")]
)
if file_path:
self.image_path = file_path
self.load_image()
self.process_btn.config(state=tk.NORMAL)
def load_image(self):
image = Image.open(self.image_path)
image = self.resize_image(image)
photo = ImageTk.PhotoImage(image)
self.original_image_label.config(image=photo)
self.original_image_label.image = photo
def remove_background(self):
if self.image_path:
try:
# Показване на прогрес индикатора
self.progress.pack(pady=10)
self.progress.start()
self.process_btn.config(state=tk.DISABLED)
# Използване на after за да не блокираме GUI
self.root.after(100, self.process_image)
except Exception as e:
self.progress.stop()
self.progress.pack_forget()
messagebox.showerror("Грешка", f"Възникна грешка при обработката: {str(e)}")
def process_image(self):
try:
input_image = Image.open(self.image_path)
output_image = remove(input_image)
self.processed_image = output_image
# Показване на обработеното изображение
resized_output = self.resize_image(output_image)
photo = ImageTk.PhotoImage(resized_output)
self.processed_image_label.config(image=photo)
self.processed_image_label.image = photo
# Създаване на бутон за запазване
save_btn = tk.Button(
self.btn_frame,
text="Запази",
bg=self.colors['accent'],
fg='white',
command=self.save_image,
font=('Helvetica', 12),
borderwidth=0,
padx=20,
pady=10,
cursor='hand2'
)
save_btn.pack(side=tk.LEFT, padx=10)
# Добавяне на hover ефекти за бутона за запазване
save_btn.bind('<Enter>', lambda e: save_btn.configure(bg='#FF5B94'))
save_btn.bind('<Leave>', lambda e: save_btn.configure(bg=self.colors['accent']))
except Exception as e:
messagebox.showerror("Грешка", f"Възникна грешка при обработката: {str(e)}")
finally:
self.progress.stop()
self.progress.pack_forget()
self.process_btn.config(state=tk.NORMAL)
def save_image(self):
if self.processed_image:
file_path = filedialog.asksaveasfilename(
defaultextension=".png",
filetypes=[("PNG files", "*.png")]
)
if file_path:
self.processed_image.save(file_path)
messagebox.showinfo("Успех", "Изображението е запазено успешно!")
def resize_image(self, image, max_size=(400, 400)):
ratio = min(max_size[0] / image.size[0], max_size[1] / image.size[1])
new_size = tuple(int(dim * ratio) for dim in image.size)
return image.resize(new_size, Image.Resampling.LANCZOS)
if __name__ == "__main__":
root = tk.Tk()
app = BackgroundRemover(root)
root.mainloop()
Запазете файла и му дайте име, примерно background-remover.py
Стартиране на скрипта
За да стартирате скрипта, просто кликнете два пъти върху файла background-remover.py .
Ако желаете, можете директно да изтеглите компилирания от мен скрипт във формат .exe от ТУК.

