Leer alles over het omgaan met afbeeldingen in Python met deze eenvoudige maar nuttige tool die je zelf kunt bouwen.

Een collage is een prachtige manier om herinneringen te laten zien en reeksen afbeeldingen weer te geven. Online collagemakers hebben mogelijk beveiligingsproblemen en offline apps kosten mogelijk geld en missen de functies die u nodig heeft.

Door uw eigen beeldcollagemaker te bouwen, kunt u deze zorgen wegnemen en de volledige controle behouden. Dus, hoe kun je er een bouwen?

De Tkinter- en PIL-module

Om een ​​beeldcollage-applicatie te bouwen heeft u de Tkinter- en de PIL-module nodig. Met Tkinter kunt u desktopapplicaties maken. Het biedt een verscheidenheid aan widgets die het gemakkelijker maken GUI's ontwikkelen.

De Pillow-bibliotheek, een afsplitsing van de Python Imaging Library (PIL), biedt beeldverwerkingsmogelijkheden die helpen bij het bewerken, creëren, bestandsformaten converterenen afbeeldingen opslaan.

Om Tkinter en Pillow te installeren, opent u een terminal en voert u het volgende uit:

pip install tk pillow

GUI-installatie en beeldmanipulatie

U kunt de broncode van dit project vinden in zijn GitHub-opslagplaats.

Begin met importeren van de benodigde modules. Maak een klas, ImageCollageAppen stel de titel en afmetingen van het venster in. Definieer een canvas met behulp van tk. Canvas() en stel het bovenliggende element, de breedte, de hoogte en de achtergrondkleur in.

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

Maak twee knoppen: Voeg afbeelding toe, En Collage maken. Definieer het bovenliggende element, de tekst die moet worden weergegeven, de opdracht die moet worden uitgevoerd en de lettertypestijlen. Organiseer de knoppen door de juiste opvulling toe te voegen. Initialiseren sleep_data om informatie over de sleepbewerking op te slaan.

Initialiseren afbeelding_posities om de posities van afbeeldingen op het canvas op te slaan. Definieer drie gebeurtenishandlers om te reageren op het selecteren, slepen en loslaten van afbeeldingen.

 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)

Definieer een methode, op_druk. Haal het dichtstbijzijnde canvasitem op van de locatie waar de gebruiker met de muis klikt en sla het op onder de item sleutel van de sleep_data woordenboek. Sla de x- en y-coördinaten van de muisklik op. U gebruikt dit om de afstand te berekenen die de gebruiker tijdens het slepen met de muis beweegt.

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

Definieer een methode, op_slepen. Bereken de horizontale en verticale afstand waarover de gebruiker de muis heeft verplaatst tijdens het slepen en werk de positie van de afbeelding dienovereenkomstig bij. Sla de bijgewerkte coördinaten van de afbeelding op onder de X En j sleutels van de sleep_data woordenboek.

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

Definieer een methode, op vrijlating. Wis de verwijzing naar de afbeelding die de gebruiker met zijn coördinaten heeft meegesleept. Bel de update_image_positions om de posities van alle afbeeldingen op het canvas bij te werken nadat de gebruiker deze heeft gesleept en losgelaten.

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

Definieer een methode, update_image_positions. Ruim het op afbeelding_posities lijst en herhaal alle canvasitems. Zoek voor elk item de coördinaten en voeg ze toe aan de lijst.

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

Definieer een methode, Voeg afbeeldingen toe. Maak een dialoogvenster waarin de gebruiker wordt gevraagd het aantal afbeeldingen voor de collage in te voeren. Als de gebruiker een geldig nummer heeft opgegeven, opent u een bestandsdialoogvenster waarin de gebruiker alleen afbeeldingsbestanden kan selecteren. Zodra de gebruiker een of meer afbeeldingen heeft geselecteerd, opent u ze allemaal met Pillow's Afbeelding.open() methode.

Bel de formaat_afbeelding wijzigen methode en maak een Tkinter-compatibel FotoAfbeelding. Voeg dit toe aan de afbeelding_refs lijst en bel de 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()

Definieer een methode, formaat_afbeelding wijzigen. Haal de breedte en hoogte van de afbeelding op en bereken de beeldverhouding. Als het er meer dan één zijn, stelt u de nieuwe breedte in op de helft van de breedte van de collage. Bereken de overeenkomstige nieuwe hoogte met behoud van de beeldverhouding.

Als de beeldverhouding kleiner is dan één, stelt u de nieuwe hoogte in op de helft van de hoogte van de collage. Bereken op dezelfde manier de overeenkomstige breedte. Gebruik Pillow's formaat wijzigen methode om een ​​afbeelding met gewijzigd formaat terug te geven met behulp van de berekende parameters.

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

Definieer een methode, update_canvas. Wis alle items en vraag de gebruiker naar het gewenste aantal rijen en kolommen via een bestandsdialoogvenster. Stel de breedte en hoogte van de collage in op de helft van de opgegeven collagegrootte. Wist de lijst met beeldposities. Initialiseren X En j offset naar nul, zodat u de positie-offsets kunt bijhouden voor het rangschikken van afbeeldingen in rijen en kolommen.

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

Herhaal de afbeelding_refs lijst en maak een afbeelding op het canvas met de opgegeven offset. Stel het anker in op Noordwest, zodat u de linkerbovenhoek van de afbeelding op de opgegeven coördinaten plaatst. Voeg deze coördinaten toe aan de afbeelding_posities lijst.

Update de x_verschuiving om de helft van de breedte van de collage toe te voegen, ter voorbereiding op het plaatsen van de volgende afbeelding. Als het aantal afbeeldingen in de huidige rij een veelvoud is van het opgegeven aantal kolommen, stelt u de x_verschuiving naar nul. Dit geeft het begin van een nieuwe rij aan. Voeg de helft van de hoogte van de collage toe om de hoogte in te stellen j coördinaat voor de volgende rij.

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

De collage maken en opslaan

Definieer een methode, maak_collage. Als er geen afbeeldingen in de collage staan, geeft u een waarschuwing weer. Verzamel de breedte en hoogte van de collage. Maak een kussen Afbeelding met een witte achtergrond. Herhaal de afbeeldingen lijst en plak elke afbeelding op de achtergrond op de opgegeven posities.

Sla de collage op en geef deze weer met de standaardafbeeldingsviewer.

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

Maak een exemplaar van de Tkinter en ImageCollage-app klas. De Hoofdlus() functie vertelt Python om de Tkinter-gebeurtenislus uit te voeren en naar gebeurtenissen te luisteren totdat je het venster sluit.

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

Verschillende functies van de Image Collage Maker testen

Wanneer het programma wordt uitgevoerd, verschijnt er een venster met twee knoppen: Voeg afbeelding toe, En Collage maken. Door te klikken op de Voeg afbeelding toe op de knop, wordt in een dialoogvenster gevraagd hoeveel afbeeldingen er moeten worden gecollaged. Als u het aantal afbeeldingen op vijf invoert en ze selecteert, verschijnt er een nieuw dialoogvenster. Er wordt gevraagd naar het aantal rijen, gevolgd door het aantal kolommen.

Wanneer u twee rijen en drie kolommen invoert, organiseert het venster de afbeeldingen in een rasterstructuur.

Het voorbeeld geeft de mogelijkheid om de afbeeldingen naar wens te slepen. Door te klikken op de Collage maken knop, het programma slaat de afbeelding op.

Wanneer u de afbeelding bekijkt, kunt u bevestigen dat het programma de collage met succes heeft gemaakt.

Verbetering van de functionaliteit van de Image Collage Maker

In plaats van een tabelindeling kunt u verschillende standaardsjablonen opgeven waaruit de gebruiker kan kiezen. Voeg functies toe voor het wijzigen van de achtergrondkleur, het toevoegen van tekst, het toepassen van filters op afbeeldingen en het invoegen van stickers van internet.

Terwijl u deze functies toevoegt, kunt u de collage eenvoudig bewerken met de optie om deze ongedaan te maken of opnieuw uit te voeren. Laat de gebruiker de afbeeldingen naar wens bijsnijden, vergroten of verkleinen en omdraaien. Je moet ook een optie toevoegen om de afbeelding in het gewenste formaat op te slaan.