Tudjon meg mindent a Python képkezeléséről ezzel az egyszerű, de hasznos eszközzel, amelyet saját maga is elkészíthet.

A kollázs gyönyörű módja az emlékek és képsorozatok bemutatásának. Az online kollázskészítőknek biztonsági aggályai lehetnek, az offline alkalmazások pedig pénzbe kerülhetnek, és nem rendelkeznek a szükséges funkciókkal.

Saját képkollázs készítőjének elkészítésével kiküszöbölheti ezeket az aggályokat, és megőrizheti a teljes ellenőrzést. Szóval, hogyan építhetsz egyet?

A Tkinter és a PIL modul

Képkollázs-alkalmazás készítéséhez szüksége van a Tkinterre és a PIL modulra. A Tkinter lehetővé teszi az asztali alkalmazások létrehozását. Különféle widgeteket kínál, amelyek megkönnyítik a munkát grafikus felhasználói felületek fejlesztésére.

A Pillow könyvtár – a Python Imaging Library (PIL) egyik formája – olyan képfeldolgozási lehetőségeket biztosít, amelyek segítik a szerkesztést, a fájlformátumok konvertálásaés képek mentése.

A Tkinter és a Pillow telepítéséhez nyisson meg egy terminált, és futtassa:

instagram viewer
pip install tk pillow

GUI beállítása és képkezelés

A projekt forráskódja megtalálható benne GitHub adattár.

Kezdje a szükséges modulok importálása. Hozzon létre egy osztályt, ImageCollageApp, és állítsa be az ablak címét és méreteit. Határozzon meg egy vásznat a használatával tk. Vászon() és állítsa be a szülőelemet, a szélességet, a magasságot és a háttérszínt.

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

Hozzon létre két gombot: Kép hozzáadása, és Kollázs létrehozása. Határozza meg a szülőelemet, a megjelenítendő szöveget, a futtatandó parancsot és a betűstílusokat. Rendszerezze a gombokat megfelelő kitöltés hozzáadásával. Inicializálás drag_data a húzási művelettel kapcsolatos információk tárolására.

Inicializálás image_positions hogy eltárolja a képek pozícióját a vásznon. Határozzon meg három eseménykezelőt, amelyek reagálnak a képek kiválasztására, húzására és kiadására.

 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)

Határozzon meg egy módszert, on_press. Keresse ki a legközelebbi vászonelemet arról a helyről, ahol a felhasználó az egérrel kattint, és tárolja a tétel kulcsa a drag_data szótár. Tárolja el az egérkattintás x és y koordinátáit. Ezzel kiszámíthatja azt a távolságot, amelyet a felhasználó az egeret húzás közben mozgatja.

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

Határozzon meg egy módszert, on_drag. Számítsa ki azt a vízszintes és függőleges távolságot, amelyet a felhasználó húzás közben mozgott az egérrel, és ennek megfelelően frissítse a kép helyzetét. Tárolja a kép frissített koordinátáit a x és y kulcsai a drag_data szótár.

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

Határozzon meg egy módszert, on_release. Törölje a hivatkozást arra a képre, amelyet a felhasználó húzott, és annak koordinátáit. Hívja a update_image_positions az összes kép pozíciójának frissítéséhez a vásznon, miután a felhasználó elhúzza és elengedi.

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

Határozzon meg egy módszert, update_image_positions. Törölje a image_positions listázza és ismételje meg az összes vászonelemet. Keresse meg az egyes elemek koordinátáit, és adja hozzá a listához.

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

Határozzon meg egy módszert, add_images. Hozzon létre egy párbeszédpanelt, amely felkéri a felhasználót, hogy adja meg a kollázs képeinek számát. Ha a felhasználó érvényes számot adott meg, nyissa meg a fájl párbeszédpanelt, amely csak a képfájlok kiválasztását teszi lehetővé. Miután a felhasználó kiválasztott egy vagy több képet, nyissa meg mindegyiket a Pillow's segítségével Image.open() módszer.

Hívja a resize_image módszert, és hozzon létre egy Tkinter-kompatibilist PhotoImage. Adja hozzá ezt a image_refs listázza és hívja a update_canvas módszer.

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

Határozzon meg egy módszert, resize_image. Szerezze meg a kép szélességét és magasságát, és számítsa ki a képarányát. Ha egynél több, állítsa be az új szélességet a kollázs szélességének felére. Számítsa ki a megfelelő új magasságot a képarány megtartása mellett.

Ha a képarány kisebb, mint egy, állítsa be az új magasságot a kollázs magasságának felére. Hasonlóképpen számítsa ki a megfelelő szélességet. Használjon párnát átméretezni módszer az átméretezett kép visszaadásához a számított paraméterek használatával.

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

Határozzon meg egy módszert, update_canvas. Törölje az összes elemet, és kérje meg a felhasználótól a kívánt sorok és oszlopok számát egy fájl párbeszédpanelen keresztül. Állítsa be a kollázs szélességét és magasságát a megadott kollázsméret felére. Törli a képpozíciók listáját. Inicializálás x és y eltolás nullára, így nyomon követheti a pozícióeltolásokat a képek sorokba és oszlopokba rendezéséhez.

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

Ismételje meg a image_refs listát, és hozzon létre egy képet a vásznon a megadott eltolás segítségével. Állítsa a horgonyt északnyugatra, hogy a kép bal felső sarkát a megadott koordinátákra helyezze. Adja hozzá ezeket a koordinátákat a image_positions lista.

Frissítse a x_offset a kollázs szélességének felének hozzáadásához, a következő kép elhelyezésének előkészítéséhez. Ha az aktuális sorban elhelyezett képek száma többszöröse a megadott számú oszlopnak, állítsa be a x_offset nullára. Ez egy új sor kezdetét jelzi. Adja hozzá a kollázs magasságának felét a beállításhoz y koordináta a következő sorhoz.

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

A kollázs létrehozása és mentése

Határozzon meg egy módszert, kollázs létrehozása. Ha nincsenek képek a kollázson, jelenítsen meg egy figyelmeztetést. Gyűjtsük össze a kollázs szélességét és magasságát. Hozzon létre egy párnát Kép fehér háttérrel. Iteráljon a képeket listázza ki és illessze be az egyes képeket a háttérre a megadott helyeken.

Mentse el a kollázst, és jelenítse meg az alapértelmezett képnézegetővel.

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

Hozzon létre egy példányt a Tkinterből és ImageCollage alkalmazás osztály. A mainloop() függvény azt mondja a Pythonnak, hogy futtassa a Tkinter eseményhurkot, és figyelje az eseményeket, amíg be nem zárja az ablakot.

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

Az Image Collage Maker különféle funkcióinak tesztelése

A program futtatásakor megjelenik egy ablak két gombbal, Kép hozzáadása, és Kollázs létrehozása. A gombra kattintva Kép hozzáadása gombot, egy párbeszédpanel megkérdezi a kollázni kívánt képek számát. Ha beírja a képek számát ötre és kiválasztja őket, egy másik párbeszédpanel jelenik meg. Kéri a sorok számát, majd az oszlopok számát.

Két sor és három oszlop beírásakor az ablak rácsszerkezetbe rendezi a képeket.

Az előnézet lehetővé teszi a képek tetszés szerinti húzását. A gombra kattintva Kollázs létrehozása gombot, a program elmenti a képet.

A kép megtekintésekor meggyőződhet arról, hogy a program sikeresen létrehozta a kollázst.

Az Image Collage Maker funkcionalitásának javítása

A táblázatos formátum helyett különböző alapértelmezett sablonokat is megadhat, amelyek közül választhat a felhasználó. Adjon hozzá funkciókat a háttérszín megváltoztatásához, szöveg hozzáadásához, szűrők alkalmazásához a képekhez és matricák beillesztéséhez az internetről.

Miközben ezeket a funkciókat hozzáadja, egyszerűvé teheti a kollázs szerkesztését a visszavonás vagy az újrakészítés lehetőségével. Hagyja, hogy a felhasználó tetszés szerint vágja le, méretezze át és fordítsa meg a képeket. Azt is meg kell adnia, hogy a képet a kívánt formátumban mentse.