Naučite se vse o obdelavi slik v Pythonu s tem preprostim, a uporabnim orodjem, ki ga lahko sestavite sami.

Kolaž je čudovit način za predstavitev spominov in nizov slik. Spletni izdelovalci kolažev imajo morda pomisleke glede varnosti, aplikacije brez povezave pa lahko stanejo in nimajo funkcij, ki jih potrebujete.

Z izgradnjo lastnega izdelovalca kolažnih slik lahko odpravite te skrbi in ohranite popoln nadzor. Torej, kako ga lahko sestavite?

Modul Tkinter in PIL

Za izdelavo aplikacije za kolaž slik potrebujete Tkinter in modul PIL. Tkinter omogoča ustvarjanje namiznih aplikacij. Ponuja različne pripomočke, ki olajšajo delo za razvoj GUI.

Knjižnica Pillow—razcep Python Imaging Library (PIL)—zagotavlja zmožnosti obdelave slik, ki pomagajo pri urejanju, ustvarjanju, pretvorbo formatov datotekin shranjevanje slik.

Če želite namestiti Tkinter in Pillow, odprite terminal in zaženite:

pip install tk pillow

Nastavitev GUI in manipulacija s slikami

Izvorno kodo tega projekta najdete v Repozitorij GitHub.

Začni z uvoz zahtevanih modulov. Ustvarite razred, ImageCollageAppin nastavite naslov in dimenzije okna. Določite platno z uporabo tk. platno () in nastavite njegov nadrejeni element, širino, višino in barvo ozadja.

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

Ustvari dva gumba: Dodaj sliko, in Ustvari kolaž. Določite nadrejeni element, besedilo za prikaz, ukaz za zagon in sloge pisave. Organizirajte gumbe tako, da dodate ustrezno oblazinjenje. Inicializiraj povleci_podatke za shranjevanje informacij o operaciji vlečenja.

Inicializiraj položaj_slike za shranjevanje položajev slik na platnu. Definirajte tri obdelovalce dogodkov, da se odzovejo na izbiro, vlečenje in sprostitev slik.

 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)

Določite metodo, on_press. Pridobite najbližji element platna z mesta, kjer uporabnik klikne miško, in ga shranite pod postavka ključ od povleci_podatke slovar. Shranite x in y koordinate klika miške. To boste uporabili za izračun razdalje, na katero uporabnik premakne miško med vlečenjem.

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

Določite metodo, on_drag. Izračunajte vodoravno in navpično razdaljo, na kateri je uporabnik premaknil miško med vlečenjem, in ustrezno posodobite položaj slike. Shranite posodobljene koordinate slike pod x in l ključi od povleci_podatke slovar.

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

Določite metodo, on_release. Počistite sklic na sliko, ki jo je uporabnik vlekel skupaj z njenimi koordinatami. Pokličite posodobitev_pozicij_slike za posodobitev položajev vseh slik na platnu, potem ko ga uporabnik povleče in spusti.

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

Določite metodo, posodobitev_pozicij_slike. Počistite položaj_slike seznam in ponavljanje po vseh elementih platna. Za vsak predmet poiščite koordinate in jih dodajte na seznam.

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

Določite metodo, add_images. Ustvarite pogovorno okno, ki od uporabnika zahteva, da vnese število slik za kolaž. Če je uporabnik vnesel veljavno številko, odprite pogovorno okno datoteke, ki uporabniku omogoča samo izbiro slikovnih datotek. Ko uporabnik izbere eno ali več slik, vsako odprite s Pillow's Image.open() metoda.

Pokličite spremeni velikost_slike metodo in ustvarite Tkinter-združljivo PhotoImage. Dodajte to v image_refs seznam in pokličite posodobitev_platna 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()

Določite metodo, spremeni velikost_slike. Pridobite širino in višino slike ter izračunajte njeno razmerje stranic. Če jih je več, nastavite novo širino na polovico širine kolaža. Izračunajte ustrezno novo višino, pri tem pa ohranite razmerje stranic.

Če je razmerje stranic manjše od ena, nastavite novo višino na polovico višine kolaža. Podobno izračunajte ustrezno širino. Uporabite blazine spremenite velikost metoda za vrnitev spremenjene velikosti slike z uporabo izračunanih parametrov.

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

Določite metodo, posodobitev_platna. Počistite vse elemente in prek pogovornega okna datoteke vprašajte uporabnika za želeno število vrstic in stolpcev. Nastavite širino in višino kolaža tako, da zavzameta polovico določene velikosti kolaža. Počisti seznam položajev slike. Inicializiraj x in l zamik na nič, tako da lahko sledite zamikom položaja za razvrščanje slik v vrsticah in stolpcih.

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

Ponovi čez image_refs seznam in ustvarite sliko na platnu z uporabo podanega odmika. Nastavite sidro na severozahod, tako da postavite zgornji levi kot slike na podane koordinate. Pripni te koordinate k položaj_slike seznam.

Posodobite x_odmik da dodate polovico širine kolaža, da se pripravite na postavitev naslednje slike. Če je število slik v trenutni vrstici večkratnik podanega števila stolpcev, nastavite x_odmik na nič. To označuje začetek nove vrstice. Dodajte polovico višine kolaža, da nastavite l koordinat za naslednjo vrstico.

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

Ustvarjanje kolaža in njegovo shranjevanje

Določite metodo, create_collage. Če na kolažu ni slik, se prikaže opozorilo. Zberite širino in višino kolaža. Ustvarite blazino Slika z belim ozadjem. Ponovi skozi slike seznam in prilepite vsako sliko na ozadje na določena mesta.

Shranite kolaž in ga prikažite s privzetim pregledovalnikom slik.

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

Ustvarite primerek Tkinterja in Aplikacija ImageCollage razred. The glavna zanka() funkcija pove Pythonu, naj zažene zanko dogodkov Tkinter in posluša dogodke, dokler ne zaprete okna.

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

Preizkušanje različnih funkcij programa Image Collage Maker

Ob zagonu programa se prikaže okno z dvema gumboma, Dodaj sliko, in Ustvari kolaž. Ob kliku na Dodaj sliko gumb, pogovorno okno zahteva število slik za kolaž. Ko vnesete število slik kot pet in jih izberete, se prikaže drugo pogovorno okno. Zahteva število vrstic, ki jim sledi število stolpcev.

Ob vnosu dveh vrstic in treh stolpcev okno organizira slike v mrežni strukturi.

Predogled omogoča vlečenje slik po želji. Ob kliku na Ustvari kolaž gumb, program shrani sliko.

Ob ogledu slike lahko potrdite, da je program uspešno ustvaril kolaž.

Izboljšanje funkcionalnosti Image Collage Makerja

Namesto tabelarične oblike lahko ponudite različne privzete predloge, med katerimi lahko uporabnik izbira. Dodajte funkcije za spreminjanje barve ozadja, dodajanje besedila, uporabo filtrov za slike in vstavljanje nalepk iz interneta.

Med dodajanjem teh funkcij olajšajte urejanje kolaža z možnostjo razveljavitve ali ponovitve. Naj uporabnik obreže, spremeni velikost in obrne slike po svojih željah. Dodati morate tudi možnost shranjevanja slike v želenem formatu.