Dowiedz się wszystkiego o obsłudze obrazów w Pythonie dzięki temu prostemu, ale przydatnemu narzędziu, które możesz zbudować samodzielnie.

Kolaż to piękny sposób na zaprezentowanie wspomnień i wyeksponowanie zestawów obrazów. Twórcy kolaży online mogą mieć obawy dotyczące bezpieczeństwa, a aplikacje offline mogą być kosztowne i pozbawione wymaganych funkcji.

Budując własne narzędzie do tworzenia kolaży obrazów, możesz wyeliminować te obawy i zachować pełną kontrolę. Jak więc można go zbudować?

Moduł Tkinter i PIL

Do zbudowania aplikacji do kolażu obrazów potrzebny jest moduł Tkinter i PIL. Tkinter umożliwia tworzenie aplikacji desktopowych. Oferuje różnorodne widżety, które ułatwiają to zadanie do tworzenia GUI.

Biblioteka Pillow — rozwidlenie biblioteki Python Imaging Library (PIL) — zapewnia możliwości przetwarzania obrazów, które pomagają w edycji, tworzeniu, konwertowanie formatów plikówi zapisywanie obrazów.

Aby zainstalować Tkinter i Pillow, otwórz terminal i uruchom:

pip install tk pillow
instagram viewer

Konfiguracja GUI i manipulacja obrazem

Kod źródłowy tego projektu można znaleźć w jego pliku Repozytorium GitHuba.

Zacznij od import wymaganych modułów. Utwórz klasę, Aplikacja ImageCollagei ustaw tytuł oraz wymiary okna. Zdefiniuj płótno za pomocą tk. Płótno() i ustaw jego element nadrzędny, szerokość, wysokość i kolor tła.

import tkinter as tk
from tkinter import filedialog, simpledialog, messagebox
from PIL import Image, ImageTk

classImageCollageApp:
def__init__(self, root):
self.root = root
self.root.title("Image Collage Maker")
self.images = []
self.image_refs = []
self.collage_size = (600, 500)

self.collage_canvas = tk.Canvas(
self.root,
width=self.collage_size[0],
height=self.collage_size[1],
bg="white",
)

self.collage_canvas.pack()

Utwórz dwa przyciski: Dodaj obraz, I Utwórz kolaż. Zdefiniuj element nadrzędny, tekst do wyświetlenia, polecenie do uruchomienia i style czcionek. Uporządkuj przyciski, dodając odpowiednie wypełnienie. Zainicjuj przeciągnij_dane do przechowywania informacji o operacji przeciągania.

Zainicjuj pozycje_obrazu do przechowywania pozycji obrazów na płótnie. Zdefiniuj trzy procedury obsługi zdarzeń, które będą reagować na zaznaczanie, przeciąganie i zwalnianie obrazów.

 self.btn_add_image = tk.Button(
self.root,
text="Add Image",
command=self.add_images,
font=("Arial", 12, "bold"),
)

self.btn_add_image.pack(pady=10)

self.btn_create_collage = tk.Button(
self.root,
text="Create Collage",
command=self.create_collage,
font=("Arial", 12, "bold"),
)

self.btn_create_collage.pack(pady=5)
self.drag_data = {"x": 0, "y": 0, "item": None}
self.image_positions = []
self.collage_canvas.bind("", self.on_press)
self.collage_canvas.bind("", self.on_drag)
self.collage_canvas.bind("", self.on_release)

Zdefiniuj metodę, on_press. Pobierz najbliższy element płótna z lokalizacji, w której użytkownik kliknie myszą, i zapisz go pod przedmiot klucz z przeciągnij_dane słownik. Zapisz współrzędne x i y kliknięcia myszą. Użyjesz tego do obliczenia odległości, na jaką użytkownik przesuwa mysz podczas przeciągania.

defon_press(self, event):
self.drag_data["item"] = self.collage_canvas.find_closest(event.x, event.y)[0]
self.drag_data["x"] = event.x
self.drag_data["y"] = event.y

Zdefiniuj metodę, on_przeciągnij. Oblicz odległość poziomą i pionową, na jaką użytkownik przesunął mysz podczas przeciągania, i odpowiednio zaktualizuj położenie obrazu. Zapisz zaktualizowane współrzędne obrazu w pliku X I y klucze przeciągnij_dane słownik.

defon_drag(self, event):
delta_x = event.x - self.drag_data["x"]
delta_y = event.y - self.drag_data["y"]
self.collage_canvas.move(self.drag_data["item"], delta_x, delta_y)
self.drag_data["x"] = event.x
self.drag_data["y"] = event.y

Zdefiniuj metodę, on_release. Usuń odniesienie do obrazu przeciąganego przez użytkownika wraz z jego współrzędnymi. Zadzwoń do aktualizacja_pozycji_obrazu aby zaktualizować położenie wszystkich obrazów na płótnie po przeciągnięciu i zwolnieniu przez użytkownika.

defon_release(self, event):
self.drag_data["item"] = None
self.drag_data["x"] = 0
self.drag_data["y"] = 0
self.update_image_positions()

Zdefiniuj metodę, aktualizacja_pozycji_obrazu. Wyczyść pozycje_obrazu listę i iteruj po wszystkich elementach obszaru roboczego. Dla każdego elementu znajdź współrzędne i dodaj je do listy.

defupdate_image_positions(self):
self.image_positions.clear()

for item in self.collage_canvas.find_all():
x, y = self.collage_canvas.coords(item)
self.image_positions.append((x, y))

Zdefiniuj metodę, Dodaj obrazy. Utwórz okno dialogowe z monitem o wprowadzenie liczby obrazów do kolażu. Jeśli użytkownik podał prawidłowy numer, otwórz okno dialogowe pliku, które pozwala użytkownikowi jedynie wybrać pliki obrazów. Gdy użytkownik wybierze jeden lub więcej obrazów, otwórz każdy z nich za pomocą Pillow's Obraz.open() metoda.

Zadzwoń do zmiana rozmiaru obrazu metodę i utwórz metodę kompatybilną z Tkinter ZdjęcieObraz. Dodaj to do image_refs wypisz i zadzwoń aktualizacja_płótna metoda.

defadd_images(self):
num_images = simpledialog.askinteger(
"Number of Images", "Enter the number of images:"
)

if num_images isnotNone:
file_paths = filedialog.askopenfilenames(
filetypes=[("Image files", "*.png;*.jpg;*.jpeg;*.gif")]
)

if file_paths:
for i in range(min(num_images, len(file_paths))):
file_path = file_paths[i]
image = Image.open(file_path)
resized_image = self.resize_image(image)
self.images.append(resized_image)
self.image_refs.append(ImageTk.PhotoImage(resized_image))

self.update_canvas()

Zdefiniuj metodę, zmiana rozmiaru obrazu. Uzyskaj szerokość i wysokość obrazu i oblicz jego proporcje. Jeśli jest więcej niż jeden, ustaw nową szerokość na połowę szerokości kolażu. Oblicz odpowiednią nową wysokość, zachowując proporcje.

Jeśli współczynnik proporcji jest mniejszy niż jeden, ustaw nową wysokość na połowę wysokości kolażu. Podobnie oblicz odpowiednią szerokość. Użyj poduszki Zmień rozmiar metoda zwracania obrazu o zmienionym rozmiarze przy użyciu obliczonych parametrów.

defresize_image(self, image):
img_width, img_height = image.size
aspect_ratio = img_width / img_height

if aspect_ratio > 1:
new_width = self.collage_size[0] // 2
new_height = int(new_width / aspect_ratio)
else:
new_height = self.collage_size[1] // 2
new_width = int(new_height * aspect_ratio)

return image.resize((new_width, new_height))

Zdefiniuj metodę, aktualizacja_płótna. Wyczyść wszystkie elementy i poproś użytkownika o żądaną liczbę wierszy i kolumn za pośrednictwem okna dialogowego pliku. Ustaw szerokość i wysokość kolażu tak, aby zajmowała połowę określonego rozmiaru kolażu. Czyści listę pozycji obrazu. Zainicjuj X I y offset do zera, dzięki czemu można śledzić przesunięcia pozycji przy rozmieszczaniu obrazów w wierszach i kolumnach.

defupdate_canvas(self):
self.collage_canvas.delete("all")
rows = simpledialog.askinteger("Number of Rows", "Enter the number of rows:")

cols = simpledialog.askinteger(
"Number of Columns", "Enter the number of columns:"
)

collage_width = self.collage_size[0] * cols // 2
collage_height = self.collage_size[1] * rows // 2
self.collage_canvas.config(width=collage_width, height=collage_height)
self.image_positions.clear()
x_offset, y_offset = 0, 0

Iteruj po image_refs list i utwórz obraz na płótnie, korzystając z określonego przesunięcia. Ustaw kotwicę na północny zachód, tak aby lewy górny róg obrazu znajdował się na określonych współrzędnych. Dołącz te współrzędne do pozycje_obrazu lista.

Zaktualizuj x_offset aby dodać połowę szerokości kolażu, aby przygotować się do umieszczenia kolejnego obrazu. Jeśli liczba obrazów umieszczonych w bieżącym wierszu jest wielokrotnością określonej liczby kolumn, ustaw x_offset do zera. Oznacza to początek nowego wiersza. Dodaj połowę wysokości kolażu, aby ustawić y współrzędne następnego rzędu.

for i, image_ref in enumerate(self.image_refs):
self.collage_canvas.create_image(
x_offset, y_offset, anchor=tk.NW, image=image_ref
)

self.image_positions.append((x_offset, y_offset))
x_offset += self.collage_size[0] // 2

if (i + 1) % cols == 0:
x_offset = 0
y_offset += self.collage_size[1] // 2

Tworzenie kolażu i zapisywanie go

Zdefiniuj metodę, utwórz_kolaż. Jeśli na kolażu nie ma żadnych obrazów, wyświetl ostrzeżenie. Zbierz szerokość i wysokość kolażu. Stwórz poduszkę Obraz z białym tłem. Iteruj przez obrazy listę i wklej każdy obraz na tło w określonych pozycjach.

Zapisz kolaż i wyświetl go za pomocą domyślnej przeglądarki obrazów.

defcreate_collage(self):
if len(self.images) == 0:
messagebox.showwarning("Warning", "Please add images first!")
return

collage_width = self.collage_canvas.winfo_width()
collage_height = self.collage_canvas.winfo_height()
background = Image.new("RGB", (collage_width, collage_height), "white")

for idx, image in enumerate(self.images):
x_offset, y_offset = self.image_positions[idx]
x_offset, y_offset = int(x_offset), int(y_offset)

paste_box = (
x_offset,
y_offset,
x_offset + image.width,
y_offset + image.height,
)

background.paste(image, paste_box)

background.save("collage_with_white_background.jpg")
background.show()

Utwórz instancję Tkinter i Aplikacja ImageCollage klasa. The główna pętla() funkcja mówi Pythonowi, aby uruchomił pętlę zdarzeń Tkinter i nasłuchiwał zdarzeń, dopóki nie zamkniesz okna.

if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()

Testowanie różnych funkcji Kreatora kolaży obrazów

Po uruchomieniu programu pojawia się okno z dwoma przyciskami, Dodaj obraz, I Utwórz kolaż. Po kliknięciu Dodaj obraz, pojawi się okno dialogowe z pytaniem o liczbę obrazów do kolażu. Po wpisaniu liczby obrazów wynoszącej pięć i wybraniu ich pojawi się kolejne okno dialogowe. Pyta o liczbę wierszy, a następnie o liczbę kolumn.

Po wprowadzeniu dwóch wierszy i trzech kolumn okno organizuje obrazy w strukturę siatki.

Podgląd umożliwia przeciąganie obrazów według potrzeb. Po kliknięciu Utwórz kolaż przycisk, program zapisuje obraz.

Przeglądając obraz, możesz potwierdzić, że program pomyślnie utworzył kolaż.

Zwiększanie funkcjonalności narzędzia do tworzenia kolaży obrazów

Zamiast formatu tabelarycznego możesz udostępnić użytkownikowi różne domyślne szablony do wyboru. Dodaj funkcje zmiany koloru tła, dodawania tekstu, stosowania filtrów do obrazów i wstawiania naklejek z Internetu.

Dodając te funkcje, możesz łatwo edytować kolaż, korzystając z opcji cofania i ponawiania. Pozwól użytkownikowi przycinać, zmieniać rozmiar i odwracać obrazy zgodnie ze swoimi upodobaniami. Powinieneś także dodać opcję zapisania obrazu w żądanym formacie.