Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В тази статия ще разгледаме как да създадем Python скрипт с GUI интерфейс, който използва библиотеката rembg за премахване на фона на изображения и tkinter за графичния интерфейс.
За да използвате този скрипт, трябва да инсталирате необходимите библиотеки. Можете да ги инсталирате с помощта на 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