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 от ТУК.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut