В тази статия ще разгледаме как да създадем Python скрипт с GUI интерфейс, който използва библиотеката rembg за премахване на фона на изображения и tkinter за графичния интерфейс.
Софтуерни изисквания
Python (версия 3.6 или по-нова)
Библиотеката Tkinter (вградена в стандартната библиотека на Python)
Библиотеката rembg за премахване на фона на изображения
За да използвате този скрипт, трябва да инсталирате необходимите библиотеки. Можете да ги инсталирате с помощта на pip:
Копирай
pip install rembg Pillow
Функционалности на скрипта
Програмата предлага следните функционалности:
Бутон за избор на изображение
Показване на оригиналното изображение
Бутон за премахване на фона
Показване на обработеното изображение
Възможност за запазване на резултата
Индикатор за прогрес при обработка
Как да използвате програмата
За да използвате програмата:
Стартирайте скрипта
Натиснете „Избери изображение “ и изберете снимка
Натиснете „Премахни фона „
След обработката използвайте бутона „Запази „, за да съхраните резултата
Как да започнете
Трябва да започнете със създаване на нов файл с разширение „.py „. Отворете любимият си текстов редактор и добавете следният код:
Копирай
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
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)
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 )
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 от ТУК .
Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPal Donate 💳 Дарете с Revolut