Sužinokite viską apie vaizdų tvarkymą Python naudodami šį paprastą, bet naudingą įrankį, kurį galite sukurti patys.

Koliažas yra puikus būdas parodyti prisiminimus ir rodyti vaizdų rinkinius. Internetinių koliažų kūrėjai gali turėti saugumo problemų, o neprisijungus naudojamos programos gali kainuoti ir trūkti jums reikalingų funkcijų.

Sukūrę savo vaizdo koliažų kūrėją galite pašalinti šiuos rūpesčius ir išlaikyti visišką kontrolę. Taigi, kaip jūs galite sukurti vieną?

„Tkinter“ ir „PIL“ modulis

Norėdami sukurti vaizdo koliažo programą, jums reikia Tkinter ir PIL modulio. „Tkinter“ leidžia kurti darbalaukio programas. Jame siūlomi įvairūs valdikliai, kurie palengvina darbą sukurti GUI.

„Pillow“ biblioteka – „Python Imaging Library“ (PIL) šakutė – suteikia vaizdo apdorojimo galimybes, kurios padeda redaguoti, kurti, failų formatų konvertavimasir išsaugoti vaizdus.

Norėdami įdiegti „Tkinter“ ir „Pillow“, atidarykite terminalą ir paleiskite:

pip install tk pillow

GUI sąranka ir vaizdo manipuliavimas

instagram viewer

Šio projekto šaltinio kodą galite rasti jame GitHub saugykla.

Pradėkite nuo importuoti reikiamus modulius. Sukurti klasę, „ImageCollageApp“.ir nustatykite lango pavadinimą bei matmenis. Apibrėžkite drobę naudodami tk. Drobė () ir nustatykite pagrindinį elementą, plotį, aukštį ir fono spalvą.

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

Sukurkite du mygtukus: Pridėti vaizdą, ir Sukurti koliažą. Apibrėžkite pirminį elementą, rodomą tekstą, komandą, kurią reikia vykdyti, ir šrifto stilius. Tvarkykite mygtukus pridėdami atitinkamą užpildą. Inicijuoti drag_data saugoti informaciją apie vilkimo operaciją.

Inicijuoti vaizdo_pozicijos vaizdų padėtims drobėje išsaugoti. Apibrėžkite tris įvykių tvarkykles, kurios reaguotų į vaizdų pasirinkimą, vilkimą ir išleidimą.

 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)

Apibrėžkite metodą, on_press. Paimkite artimiausią drobės elementą iš vietos, kur naudotojas spusteli pelę, ir išsaugokite jį po daiktas raktas drag_data žodynas. Išsaugokite pelės paspaudimo x ir y koordinates. Tai naudosite norėdami apskaičiuoti atstumą, kurį vartotojas perkelia pelės vilkimo metu.

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

Apibrėžkite metodą, on_drag. Apskaičiuokite horizontalų ir vertikalų atstumą, kurį vartotojas perkėlė pelę vilkdamas, ir atitinkamai atnaujinkite vaizdo padėtį. Išsaugokite atnaujintas vaizdo koordinates po x ir y raktai drag_data žodynas.

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

Apibrėžkite metodą, on_release. Išvalykite nuorodą į vaizdą, kurį vartotojas vilko, ir jo koordinates. Paskambinkite į update_image_positions atnaujinti visų vaizdų pozicijas drobėje, kai vartotojas jį nuvilko ir atleidžia.

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

Apibrėžkite metodą, update_image_positions. Išvalykite vaizdo_pozicijos išvardyti ir kartoti visus drobės elementus. Raskite kiekvieno elemento koordinates ir įtraukite jas į sąrašą.

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

Apibrėžkite metodą, pridėti_vaizdai. Sukurkite dialogo langą, kuriame vartotojas raginamas įvesti koliažo vaizdų skaičių. Jei vartotojas pateikė galiojantį numerį, atidarykite failo dialogo langą, kuriame vartotojas gali pasirinkti tik vaizdo failus. Kai vartotojas pasirinks vieną ar daugiau vaizdų, kiekvieną iš jų atidarykite naudodami „Pillow's“. Image.open() metodas.

Paskambinkite į keisti_vaizdo dydį metodą ir sukurti su Tkinter suderinamą PhotoImage. Pridėkite tai prie image_refs sąrašą ir paskambinkite update_canvas metodas.

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

Apibrėžkite metodą, keisti_vaizdo dydį. Gaukite vaizdo plotį ir aukštį ir apskaičiuokite jo kraštinių santykį. Jei jis yra daugiau nei vienas, nustatykite naują plotį, kad jis būtų pusė koliažo pločio. Apskaičiuokite atitinkamą naują aukštį, išlaikydami kraštinių santykį.

Jei formato santykis yra mažesnis nei vienas, nustatykite naują aukštį, kad jis būtų pusė koliažo aukščio. Panašiai apskaičiuokite atitinkamą plotį. Naudokite pagalvę pakeisti dydį metodas grąžinti pakeisto dydžio vaizdą naudojant apskaičiuotus parametrus.

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

Apibrėžkite metodą, update_canvas. Išvalykite visus elementus ir failo dialogo lange paprašykite vartotojo nurodyti norimą eilučių ir stulpelių skaičių. Nustatykite koliažo plotį ir aukštį, kad jis užimtų pusę nurodyto koliažo dydžio. Išvalo vaizdo pozicijų sąrašą. Inicijuoti x ir y poslinkis iki nulio, kad galėtumėte sekti pozicijos poslinkius tvarkydami vaizdus eilutėse ir stulpeliuose.

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

Pakartokite per image_refs sąrašą ir sukurkite vaizdą drobėje naudodami nurodytą poslinkį. Nustatykite inkarą į šiaurės vakarus, kad viršutiniame kairiajame vaizdo kampe būtų nurodytos koordinatės. Pridėkite šias koordinates prie vaizdo_pozicijos sąrašą.

Atnaujinkite x_offset pridėti pusę koliažo pločio, pasiruošti įdėti kitą vaizdą. Jei dabartinėje eilutėje esančių vaizdų skaičius yra nurodyto stulpelių skaičiaus kartotinis, nustatykite x_offset iki nulio. Tai rodo naujos eilutės pradžią. Pridėkite pusę koliažo aukščio, kad nustatytumėte y kitos eilutės koordinates.

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

Koliažo kūrimas ir išsaugojimas

Apibrėžkite metodą, sukurti_koliažą. Jei koliaže nėra vaizdų, parodykite įspėjimą. Surinkite koliažo plotį ir aukštį. Sukurkite pagalvę Vaizdas su baltu fonu. Pakartokite per vaizdai sąrašą ir įklijuokite kiekvieną vaizdą į foną nurodytose vietose.

Išsaugokite koliažą ir parodykite jį naudodami numatytąją vaizdų peržiūros priemonę.

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

Sukurkite Tkinter egzempliorių ir „ImageCollage“ programa klasė. The mainloop () funkcija liepia Python paleisti Tkinter įvykių kilpą ir klausytis įvykių, kol uždarysite langą.

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

Įvairių vaizdo koliažo kūrimo priemonės funkcijų išbandymas

Paleidus programą, pasirodo langas su dviem mygtukais, Pridėti vaizdą, ir Sukurti koliažą. Spustelėjus Pridėti vaizdą mygtuką, dialogo langas klausia koliažuojamų vaizdų skaičiaus. Įvedus vaizdų skaičių kaip penkis ir juos pasirinkus, pasirodo kitas dialogo langas. Ji prašo eilučių skaičiaus, po kurio nurodomas stulpelių skaičius.

Įvedus dvi eilutes ir tris stulpelius, langas suskirsto vaizdus į tinklelio struktūrą.

Peržiūra suteikia galimybę vilkti vaizdus pagal pageidavimą. Spustelėjus Sukurti koliažą mygtuką, programa išsaugo vaizdą.

Peržiūrėdami vaizdą galite patvirtinti, kad programa sėkmingai sukūrė koliažą.

Vaizdų koliažo kūrimo priemonės funkcionalumo tobulinimas

Vietoj lentelės formato galite pateikti skirtingus numatytuosius šablonus, iš kurių vartotojas gali pasirinkti. Pridėkite fono spalvos keitimo, teksto pridėjimo, filtrų pritaikymo vaizdams ir lipdukų įterpimo iš interneto funkcijų.

Pridėdami šias funkcijas, palengvinkite koliažo redagavimą su galimybe anuliuoti arba perdaryti. Leiskite vartotojui apkarpyti, pakeisti dydį ir apversti vaizdus pagal savo skonį. Taip pat turėtumėte pridėti parinktį išsaugoti vaizdą norimu formatu.