Naučite sve o rukovanju slikama u Pythonu pomoću ovog jednostavnog, ali korisnog alata koji možete sami izraditi.
Kolaž je prekrasan način za izlaganje uspomena i skupova slika. Mrežni izrađivači kolaža mogu imati sigurnosnih problema, a izvanmrežne aplikacije mogu koštati i nedostajati značajke koje su vam potrebne.
Izgradnjom vlastitog alata za izradu kolaža slika možete eliminirati ove probleme i zadržati potpunu kontrolu. Dakle, kako ga možete izgraditi?
Tkinter i PIL modul
Za izradu aplikacije za kolaž slika potrebni su vam Tkinter i PIL modul. Tkinter vam omogućuje stvaranje desktop aplikacija. Nudi razne widgete koji olakšavaju za razvoj GUI-ja.
Biblioteka Pillow—odvojak Python Imaging Library (PIL)—omogućuje mogućnosti obrade slika koje pomažu u uređivanju, stvaranju, pretvaranje formata datotekai spremanje slika.
Da biste instalirali Tkinter i Pillow, otvorite terminal i pokrenite:
pip install tk pillow
Postavljanje GUI-ja i manipulacija slikama
Izvorni kod ovog projekta možete pronaći u GitHub spremište.
Počnite od uvoz potrebnih modula. Stvorite razred, ImageCollageApp, te postavite naslov i dimenzije prozora. Definirajte platno pomoću tk. Platno() i postavite njegov nadređeni element, širinu, visinu i boju pozadine.
import tkinter as tk
from tkinter import filedialog, simpledialog, messagebox
from PIL import Image, ImageTkclassImageCollageApp:
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()
Napravite dva gumba: Dodaj sliku, i Napravite kolaž. Definirajte nadređeni element, tekst za prikaz, naredbu za pokretanje i stilove fonta. Organizirajte gumbe dodavanjem odgovarajuće podloge. Inicijalizirati povuci_podatke za pohranu informacija o operaciji povlačenja.
Inicijalizirati položaj_slike za pohranjivanje položaja slika na platnu. Definirajte tri rukovatelja događajima koji će odgovoriti na odabir, povlačenje i otpuštanje slika.
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)
Definirajte metodu, on_press. Dohvatite najbližu stavku platna s mjesta na kojem korisnik klikne mišem i pohranite je pod artikal ključ od povuci_podatke rječnik. Pohranite x i y koordinate klika mišem. Ovo ćete koristiti za izračunavanje udaljenosti koju korisnik pomiče mišem tijekom povlačenja.
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
Definirajte metodu, na_povlačenje. Izračunajte vodoravnu i okomitu udaljenost koju je korisnik pomaknuo mišem tijekom povlačenja i prema tome ažurirajte položaj slike. Pohranite ažurirane koordinate slike pod x i g ključevi od povuci_podatke rječnik.
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
Definirajte metodu, na_puštanje. Obrišite referencu na sliku koju je korisnik vukao zajedno s njezinim koordinatama. Nazovite ažuriranje položaja_slike za ažuriranje položaja svih slika na platnu nakon što ga korisnik povuče i otpusti.
defon_release(self, event):
self.drag_data["item"] = None
self.drag_data["x"] = 0
self.drag_data["y"] = 0
self.update_image_positions()
Definirajte metodu, ažuriranje položaja_slike. Očistite položaj_slike popis i iteracija preko svih stavki na platnu. Za svaku stavku pronađite koordinate i dodajte ih na popis.
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))
Definirajte metodu, dodaj_slike. Napravite dijaloški okvir koji od korisnika traži da unese broj slika za kolaž. Ako je korisnik naveo važeći broj, otvorite dijaloški okvir datoteke koji korisniku dopušta samo odabir slikovnih datoteka. Nakon što korisnik odabere jednu ili više slika, otvorite svaku pomoću Pillow's Image.open() metoda.
Nazovite promijeni veličinu_slike metodu i stvoriti Tkinter-kompatibilan PhotoImage. Dodajte ovo u image_refs popis i nazovite ažuriranje_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()
Definirajte metodu, promijeni veličinu_slike. Dobijte širinu i visinu slike i izračunajte njezin omjer širine i visine. Ako ih je više od jednog, postavite novu širinu na polovicu širine kolaža. Izračunajte odgovarajuću novu visinu uz zadržavanje omjera slike.
Ako je omjer širine i visine manji od jedan, postavite novu visinu na polovicu visine kolaža. Slično, izračunajte odgovarajuću širinu. Koristite jastuke promijeniti veličinu metoda za vraćanje slike promijenjene veličine pomoću izračunatih parametara.
defresize_image(self, image):
img_width, img_height = image.size
aspect_ratio = img_width / img_heightif 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))
Definirajte metodu, ažuriranje_platna. Obrišite sve stavke i zatražite od korisnika željeni broj redaka i stupaca putem dijaloškog okvira datoteke. Postavite širinu i visinu kolaža na polovicu navedene veličine kolaža. Briše popis položaja slike. Inicijalizirati x i g pomak na nulu, tako da možete pratiti pomake položaja za raspoređivanje slika u retke i stupce.
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
Iterirajte preko image_refs popis i stvoriti sliku na platnu koristeći navedeni pomak. Postavite sidro na sjeverozapad tako da postavite gornji lijevi kut slike na navedene koordinate. Dodajte ove koordinate na položaj_slike popis.
Ažurirajte x_pomak za dodavanje polovice širine kolaža, za pripremu za postavljanje sljedeće slike. Ako je broj slika smještenih u trenutnom redu višekratnik navedenog broja stupaca, postavite x_pomak na nulu. Ovo označava početak novog reda. Dodajte polovicu visine kolaža da postavite g koordinata za sljedeći red.
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
Stvaranje kolaža i njegovo spremanje
Definirajte metodu, stvoriti_kolaž. Ako na kolažu nema slika, prikaži upozorenje. Prikupite širinu i visinu kolaža. Napravite jastuk Slika s bijelom pozadinom. Ponavljaj kroz slike navedite i zalijepite svaku sliku na pozadinu na određenim mjestima.
Spremite kolaž i prikažite ga pomoću zadanog preglednika slika.
defcreate_collage(self):
if len(self.images) == 0:
messagebox.showwarning("Warning", "Please add images first!")
returncollage_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()
Stvorite instancu Tkinter i Aplikacija ImageCollage razreda. The glavna petlja() funkcija govori Pythonu da pokrene Tkinter petlju događaja i osluškuje događaje dok ne zatvorite prozor.
if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()
Testiranje različitih značajki Image Collage Maker-a
Prilikom pokretanja programa pojavljuje se prozor s dva gumba, Dodaj sliku, i Napravite kolaž. Pritiskom na Dodaj sliku gumb, dijaloški okvir traži broj slika za kolažiranje. Kada unesete broj slika kao pet i odaberete ih, pojavit će se drugi dijaloški okvir. Traži broj redaka nakon kojih slijedi broj stupaca.
Ulaskom u dva retka i tri stupca, prozor organizira slike u mrežnu strukturu.
Pregled daje mogućnost povlačenja slika po želji. Pritiskom na Napravite kolaž gumb, program sprema sliku.
Gledajući sliku, možete potvrditi da je program uspješno izradio kolaž.
Poboljšanje funkcionalnosti Image Collage Maker-a
Umjesto tabelarnog formata, možete ponuditi različite zadane predloške koje korisnik može izabrati. Dodajte značajke za promjenu boje pozadine, dodavanje teksta, primjenu filtara na slike i umetanje naljepnica s interneta.
Dok dodajete ove značajke, olakšajte uređivanje kolaža uz opciju poništavanja ili ponavljanja. Neka korisnik izreže, promijeni veličinu i okrene slike prema svojim željama. Također biste trebali dodati opciju za spremanje slike u željenom formatu.