Opi kaikki Pythonin kuvien käsittelystä tällä yksinkertaisella mutta hyödyllisellä työkalulla, jonka voit rakentaa itse.

Kollaasi on kaunis tapa esitellä muistoja ja näyttää kuvasarjoja. Verkkokollaasien tekijöillä voi olla turvallisuusongelmia, ja offline-sovellukset voivat maksaa rahaa ja niistä puuttuu tarvitsemiasi ominaisuuksia.

Rakentamalla oman kuvakollaasivalmistajan voit poistaa nämä huolenaiheet ja säilyttää täydellisen hallinnan. Joten kuinka voit rakentaa sellaisen?

Tkinter- ja PIL-moduuli

Kuvakollaasisovelluksen rakentamiseen tarvitset Tkinterin ja PIL-moduulin. Tkinterin avulla voit luoda työpöytäsovelluksia. Se tarjoaa erilaisia ​​widgetejä, jotka helpottavat sitä GUI: iden kehittämiseen.

Pillow-kirjasto – Python Imaging Libraryn (PIL) haarukka – tarjoaa kuvankäsittelyominaisuuksia, jotka auttavat muokkaamaan, luomaan, tiedostomuotojen muuntaminenja kuvien tallentamiseen.

Asenna Tkinter ja Pillow avaamalla pääte ja suorittamalla:

pip install tk pillow

GUI-asetukset ja kuvankäsittely

instagram viewer

Löydät tämän projektin lähdekoodin siitä GitHub-arkisto.

Aloita tuoda tarvittavat moduulit. Luo luokka, ImageCollageAppja aseta ikkunan otsikko ja mitat. Määrittele kangas käyttämällä tk. Kangas() ja aseta sen pääelementti, leveys, korkeus ja taustaväri.

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

Luo kaksi painiketta: Lisää kuva, ja Luo kollaasi. Määritä pääelementti, näytettävä teksti, suoritettava komento ja kirjasintyylit. Järjestä painikkeet lisäämällä sopivat pehmusteet. Alustaa drag_data tallentaaksesi tietoja raahauksesta.

Alustaa image_positions tallentaaksesi kuvien sijainnit kankaalle. Määritä kolme tapahtumakäsittelijää, jotka vastaavat kuvien valintaan, vetämiseen ja vapauttamiseen.

 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)

Määritä menetelmä, on_press. Hae lähin kangaskohde paikasta, jossa käyttäjä napsauttaa hiirtä, ja tallenna se sen alle kohde avain drag_data sanakirja. Tallenna hiiren napsautuksen x- ja y-koordinaatit. Käytät tätä laskeaksesi etäisyyden, jonka käyttäjä siirtää hiirtä vetämällä.

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

Määritä menetelmä, on_drag. Laske vaaka- ja pystyetäisyys, jonka käyttäjä liikutti hiirtä vetämällä, ja päivitä kuvan sijainti vastaavasti. Tallenna kuvan päivitetyt koordinaatit alle x ja y avaimet drag_data sanakirja.

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

Määritä menetelmä, on_release. Poista viittaus kuvaan, jota käyttäjä veti mukana sen koordinaatteineen. Soita update_image_positions päivittää kaikkien kuvien sijainnit kankaalla, kun käyttäjä on vetänyt ja vapauttanut sen.

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

Määritä menetelmä, update_image_positions. Tyhjennä image_positions luettele ja toista kaikki kanvas-kohteet. Etsi kunkin kohteen koordinaatit ja lisää ne luetteloon.

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

Määritä menetelmä, add_images. Luo valintaikkuna, joka kehottaa käyttäjää syöttämään kollaasin kuvien lukumäärän. Jos käyttäjä antoi kelvollisen numeron, avaa tiedoston valintaikkuna, jossa käyttäjä voi valita vain kuvatiedostoja. Kun käyttäjä on valinnut yhden tai useamman kuvan, avaa kukin niistä Pillow'silla Image.open() menetelmä.

Soita resize_image menetelmä ja luo Tkinter-yhteensopiva PhotoImage. Lisää tämä kohtaan image_refs lista ja soita update_canvas menetelmä.

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

Määritä menetelmä, resize_image. Hanki kuvan leveys ja korkeus ja laske sen kuvasuhde. Jos niitä on enemmän kuin yksi, aseta uusi leveys puoleksi kollaasin leveydestä. Laske vastaava uusi korkeus säilyttäen kuvasuhteen.

Jos kuvasuhde on pienempi kuin yksi, aseta uudeksi korkeudeksi puolet kollaasin korkeudesta. Samoin laske vastaava leveys. Käytä tyynyjä muuttaa kokoa tapa palauttaa muutettu kuva laskettujen parametrien avulla.

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

Määritä menetelmä, update_canvas. Tyhjennä kaikki kohteet ja pyydä käyttäjältä haluttu määrä rivejä ja sarakkeita tiedostovalintaikkunan kautta. Aseta kollaasin leveys ja korkeus puoleen määritetystä kollaasin koosta. Tyhjentää kuvien sijaintiluettelon. Alustaa x ja y siirtymä nollaan, joten voit seurata sijaintisiirtymiä järjestettäessä kuvia riveihin ja sarakkeisiin.

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

Toista yli image_refs luettelo ja luo kuva kankaalle käyttämällä määritettyä siirtymää. Aseta ankkuri Luoteeseen niin, että sijoitat kuvan vasempaan yläkulmaan määritettyihin koordinaatteihin. Liitä nämä koordinaatit image_positions lista.

Päivitä x_offset lisätäksesi puolet kollaasin leveydestä, valmistautuaksesi seuraavan kuvan sijoittamiseen. Jos nykyiselle riville asetettujen kuvien määrä on monikerta määritetyn sarakkeiden lukumäärän kanssa, aseta x_offset nollaan. Tämä osoittaa uuden rivin alun. Lisää puolet kollaasin korkeudesta asettaaksesi y koordinaatit seuraavalle riville.

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

Kollaasin luominen ja tallentaminen

Määritä menetelmä, luo_kollaasi. Jos kollaasissa ei ole kuvia, näytä varoitus. Kerää kollaasin leveys ja korkeus. Luo tyyny Kuva valkoisella taustalla. Iteroi läpi kuvia luettele ja liitä jokainen kuva taustalle määritettyihin paikkoihin.

Tallenna kollaasi ja näytä se oletuskuvankatseluohjelmalla.

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

Luo esiintymä Tkinteristä ja ImageCollage-sovellus luokkaa. The mainloop() -toiminto käskee Pythonia suorittamaan Tkinterin tapahtumasilmukan ja kuuntelemaan tapahtumia, kunnes suljet ikkunan.

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

Image Collage Makerin eri ominaisuuksien testaus

Kun ohjelma suoritetaan, näkyviin tulee ikkuna, jossa on kaksi painiketta, Lisää kuva, ja Luo kollaasi. Napsauttamalla Lisää kuva -painiketta, valintaikkuna kysyy kollaasittavien kuvien määrää. Kun syötät kuvien lukumääräksi viisi ja valitset ne, toinen valintaikkuna tulee näkyviin. Se kysyy rivien lukumäärää ja sen jälkeen sarakkeiden lukumäärää.

Kun syötetään kaksi riviä ja kolme saraketta, ikkuna järjestää kuvat ruudukkorakenteeseen.

Esikatselu antaa mahdollisuuden vetää kuvia haluamallasi tavalla. Napsauttamalla Luo kollaasi -painiketta, ohjelma tallentaa kuvan.

Katsoessasi kuvaa voit varmistaa, että ohjelma on luonut kollaasin onnistuneesti.

Image Collage Makerin toimivuuden parantaminen

Taulukkomuodon sijaan voit tarjota erilaisia ​​oletusmalleja, joista käyttäjä voi valita. Lisää ominaisuuksia taustavärin vaihtamiseen, tekstin lisäämiseen, suodattimien käyttämiseen kuviin ja tarrojen lisäämiseen Internetistä.

Kun lisäät näitä ominaisuuksia, tee kollaasin muokkaamisesta helppoa kumoamis- tai toistamisvaihtoehdolla. Anna käyttäjän rajata, muuttaa niiden kokoa ja kääntää kuvia mielensä mukaan. Sinun tulee myös lisätä mahdollisuus tallentaa kuva haluamassasi muodossa.