Erfahren Sie alles über die Bildverarbeitung in Python mit diesem einfachen, aber nützlichen Tool, das Sie selbst erstellen können.

Eine Collage ist eine schöne Möglichkeit, Erinnerungen zu präsentieren und Bildserien anzuzeigen. Online-Collage-Ersteller haben möglicherweise Sicherheitsbedenken und Offline-Apps kosten möglicherweise Geld und verfügen nicht über die von Ihnen benötigten Funktionen.

Indem Sie Ihren eigenen Bildcollagen-Ersteller erstellen, können Sie diese Bedenken beseitigen und die vollständige Kontrolle behalten. Wie kann man also eines bauen?

Das Tkinter- und PIL-Modul

Um eine Bildcollage-Anwendung zu erstellen, benötigen Sie das Tkinter- und das PIL-Modul. Mit Tkinter können Sie Desktop-Anwendungen erstellen. Es bietet eine Vielzahl von Widgets, die es einfacher machen GUIs zu entwickeln.

Die Pillow-Bibliothek – ein Zweig der Python Imaging Library (PIL) – bietet Bildverarbeitungsfunktionen, die beim Bearbeiten, Erstellen, Konvertieren von Dateiformaten, und Speichern von Bildern.

instagram viewer

Um Tkinter und Pillow zu installieren, öffnen Sie ein Terminal und führen Sie Folgendes aus:

pip install tk pillow

GUI-Einrichtung und Bildbearbeitung

Den Quellcode dieses Projekts finden Sie in seiner GitHub-Repository.

Beginnen Sie mit Importieren der benötigten Module. Erstellen Sie eine Klasse, ImageCollageApp, und legen Sie den Titel und die Abmessungen des Fensters fest. Definieren Sie eine Leinwand mit Tk. Leinwand() und legen Sie dessen übergeordnetes Element, Breite, Höhe und Hintergrundfarbe fest.

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()

Erstellen Sie zwei Schaltflächen: Bild hinzufügen, Und Collage erstellen. Definieren Sie das übergeordnete Element, den anzuzeigenden Text, den auszuführenden Befehl und die Schriftarten. Organisieren Sie die Schaltflächen, indem Sie eine entsprechende Polsterung hinzufügen. Initialisieren Drag_Data um Informationen über den Ziehvorgang zu speichern.

Initialisieren image_positions um die Positionen von Bildern auf der Leinwand zu speichern. Definieren Sie drei Ereignishandler, die auf das Auswählen, Ziehen und Freigeben von Bildern reagieren.

 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)

Definieren Sie eine Methode, on_press. Rufen Sie das nächstgelegene Canvas-Element von der Stelle ab, an der der Benutzer mit der Maus klickt, und speichern Sie es unter Artikel Schlüssel der Drag_Data Wörterbuch. Speichern Sie die X- und Y-Koordinaten des Mausklicks. Damit berechnen Sie die Distanz, die der Benutzer beim Ziehen mit der Maus zurücklegt.

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

Definieren Sie eine Methode, on_drag. Berechnen Sie den horizontalen und vertikalen Abstand, den der Benutzer beim Ziehen mit der Maus bewegt hat, und aktualisieren Sie die Position des Bildes entsprechend. Speichern Sie die aktualisierten Koordinaten des Bildes unter X Und j Schlüssel der Drag_Data Wörterbuch.

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

Definieren Sie eine Methode, bei Veröffentlichung. Löschen Sie den Verweis auf das Bild, das der Benutzer zusammen mit seinen Koordinaten gezogen hat. Ruf den update_image_positions um die Positionen aller Bilder auf der Leinwand zu aktualisieren, nachdem der Benutzer sie zieht und loslässt.

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

Definieren Sie eine Methode, update_image_positions. Löschen Sie das image_positions Alle Canvas-Elemente auflisten und durchlaufen. Suchen Sie für jedes Element die Koordinaten und fügen Sie sie der Liste hinzu.

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))

Definieren Sie eine Methode, füge Bilder hinzu. Erstellen Sie ein Dialogfeld, das den Benutzer auffordert, die Anzahl der Bilder für die Collage einzugeben. Wenn der Benutzer eine gültige Nummer angegeben hat, wird ein Dateidialogfeld geöffnet, in dem der Benutzer nur Bilddateien auswählen kann. Sobald der Benutzer ein oder mehrere Bilder ausgewählt hat, öffnen Sie jedes einzelne mit Pillow's Bild.open() Methode.

Ruf den Bildgröße anpassen Methode und erstellen Sie eine Tkinter-kompatible FotoBild. Fügen Sie dies hinzu image_refs auflisten und anrufen update_canvas Methode.

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()

Definieren Sie eine Methode, Bildgröße anpassen. Ermitteln Sie die Breite und Höhe des Bildes und berechnen Sie dessen Seitenverhältnis. Wenn es mehr als eins ist, stellen Sie die neue Breite auf die Hälfte der Breite der Collage ein. Berechnen Sie die entsprechende neue Höhe unter Beibehaltung des Seitenverhältnisses.

Wenn das Seitenverhältnis kleiner als eins ist, stellen Sie die neue Höhe auf die Hälfte der Höhe der Collage ein. Berechnen Sie auf ähnliche Weise die entsprechende Breite. Verwenden Sie Kissen Größe ändern Methode, um mithilfe der berechneten Parameter ein in der Größe geändertes Bild zurückzugeben.

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))

Definieren Sie eine Methode, update_canvas. Löschen Sie alle Elemente und fragen Sie den Benutzer über ein Dateidialogfeld nach der gewünschten Anzahl von Zeilen und Spalten. Stellen Sie die Breite und Höhe der Collage so ein, dass sie die Hälfte der angegebenen Collagengröße einnimmt. Löscht die Liste der Bildpositionen. Initialisieren X Und j Offset auf Null, damit Sie die Positionsoffsets für die Anordnung von Bildern in Zeilen und Spalten verfolgen können.

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

Iterieren Sie über die image_refs Liste und erstellen Sie ein Bild auf der Leinwand mit dem angegebenen Versatz. Setzen Sie den Anker auf Nordwesten, sodass Sie die obere linke Ecke des Bildes an den angegebenen Koordinaten positionieren. Hängen Sie diese Koordinaten an die an image_positions Liste.

Aktualisieren Sie die x_offset um die Hälfte der Breite der Collage hinzuzufügen, um die Platzierung des nächsten Bildes vorzubereiten. Wenn die Anzahl der in der aktuellen Zeile platzierten Bilder ein Vielfaches der angegebenen Anzahl von Spalten ist, legen Sie fest x_offset bis Null. Dies zeigt den Beginn einer neuen Zeile an. Fügen Sie die Hälfte der Höhe der Collage hinzu, um das festzulegen j Koordinate für die nächste Zeile.

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

Erstellen Sie die Collage und speichern Sie sie

Definieren Sie eine Methode, create_collage. Wenn die Collage keine Bilder enthält, wird eine Warnung angezeigt. Ermitteln Sie die Breite und Höhe der Collage. Erstellen Sie ein Kissen Bild mit weißem Hintergrund. Durchlaufen Sie die Bilder Listen Sie jedes Bild auf und fügen Sie es an den angegebenen Positionen in den Hintergrund ein.

Speichern Sie die Collage und zeigen Sie sie mit dem Standard-Bildbetrachter an.

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()

Erstellen Sie eine Instanz von Tkinter und ImageCollage-App Klasse. Der Hauptschleife() Die Funktion weist Python an, die Tkinter-Ereignisschleife auszuführen und auf Ereignisse zu warten, bis Sie das Fenster schließen.

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

Testen verschiedener Funktionen des Image Collage Maker

Beim Ausführen des Programms erscheint ein Fenster mit zwei Schaltflächen: Bild hinzufügen, Und Collage erstellen. Beim Klicken auf Bild hinzufügen Klicken Sie auf die Schaltfläche. In einem Dialogfeld werden Sie nach der Anzahl der zu collagierenden Bilder gefragt. Wenn Sie die Anzahl der Bilder als fünf eingeben und diese auswählen, erscheint ein weiteres Dialogfeld. Es fragt nach der Anzahl der Zeilen, gefolgt von der Anzahl der Spalten.

Bei der Eingabe von zwei Zeilen und drei Spalten organisiert das Fenster die Bilder in einer Rasterstruktur.

Die Vorschau bietet die Möglichkeit, die Bilder nach Wunsch zu verschieben. Beim Klicken auf Collage erstellen Mit der Schaltfläche speichert das Programm das Bild.

Beim Betrachten des Bildes können Sie bestätigen, dass das Programm die Collage erfolgreich erstellt hat.

Verbesserung der Funktionalität des Image Collage Maker

Anstelle eines tabellarischen Formats können Sie dem Benutzer verschiedene Standardvorlagen zur Auswahl bereitstellen. Fügen Sie Funktionen zum Ändern der Hintergrundfarbe, zum Hinzufügen von Text, zum Anwenden von Filtern auf Bilder und zum Einfügen von Aufklebern aus dem Internet hinzu.

Erleichtern Sie beim Hinzufügen dieser Funktionen das Bearbeiten der Collage mit der Option zum Rückgängigmachen oder Wiederherstellen. Lassen Sie den Benutzer die Bilder nach seinen Wünschen zuschneiden, in der Größe ändern und spiegeln. Sie sollten auch eine Option hinzufügen, um das Bild im gewünschten Format zu speichern.