Naučte sa všetko o práci s obrázkami v Pythone pomocou tohto jednoduchého, ale užitočného nástroja, ktorý si môžete vytvoriť sami.

Koláž je krásny spôsob, ako predviesť spomienky a zobraziť súbory obrázkov. Tvorcovia online koláží môžu mať obavy o bezpečnosť a offline aplikácie môžu stáť peniaze a chýbať im funkcie, ktoré požadujete.

Vytvorením vlastného nástroja na vytváranie koláží obrázkov môžete tieto obavy odstrániť a zachovať si úplnú kontrolu. Ako si ho teda môžete postaviť?

Modul Tkinter a PIL

Na vytvorenie aplikácie koláže obrázkov potrebujete Tkinter a modul PIL. Tkinter vám umožňuje vytvárať desktopové aplikácie. Ponúka množstvo miniaplikácií, ktoré to uľahčujú na vývoj GUI.

Knižnica Pillow – vidlica knižnice Python Imaging Library (PIL) – poskytuje možnosti spracovania obrázkov, ktoré pomáhajú pri úpravách, vytváraní, konvertovanie formátov súborova ukladanie obrázkov.

Ak chcete nainštalovať Tkinter a Pillow, otvorte terminál a spustite:

pip install tk pillow

Nastavenie GUI a manipulácia s obrázkami

instagram viewer

Zdrojový kód tohto projektu nájdete v ňom úložisko GitHub.

Začnite tým importovanie požadovaných modulov. Vytvorte triedu, ImageCollageAppa nastavte nadpis a rozmery okna. Definujte plátno pomocou tk. Plátno() a nastavte jeho nadradený prvok, šírku, výšku a farbu pozadia.

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

Vytvorte dve tlačidlá: Pridať obrázok, a Vytvorte koláž. Definujte nadradený prvok, text, ktorý sa má zobraziť, príkaz na spustenie a štýly písma. Usporiadajte tlačidlá pridaním vhodného čalúnenia. Inicializovať drag_data na uloženie informácií o operácii ťahania.

Inicializovať image_positions na ukladanie pozícií obrázkov na plátne. Definujte tri obslužné programy udalostí, ktoré budú reagovať na výber, ťahanie a uvoľňovanie obrázkov.

 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)

Definujte metódu, on_press. Získajte najbližšiu položku plátna z miesta, kde používateľ klikne myšou, a uložte ju pod položka kľúč od drag_data slovník. Uložte súradnice x a y kliknutia myšou. Toto použijete na výpočet vzdialenosti, o ktorú používateľ pohybuje myšou počas ťahania.

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

Definujte metódu, on_drag. Vypočítajte horizontálnu a vertikálnu vzdialenosť, o ktorú používateľ pohol myšou počas ťahania, a podľa toho aktualizujte polohu obrázka. Uložte aktualizované súradnice obrázka pod X a r kľúče od drag_data slovník.

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

Definujte metódu, on_release. Vymažte odkaz na obrázok, ktorý používateľ ťahal, spolu s jeho súradnicami. Zavolajte na update_image_positions na aktualizáciu pozícií všetkých obrázkov na plátne potom, čo ho používateľ potiahne a uvoľní.

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

Definujte metódu, update_image_positions. Vyčistite image_positions zoznam a opakovanie všetkých položiek plátna. Pre každú položku nájdite súradnice a pridajte ich do zoznamu.

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

Definujte metódu, pridať_obrázky. Vytvorte dialógové okno, ktoré používateľa vyzve na zadanie počtu obrázkov pre koláž. Ak používateľ zadal platné číslo, otvorte dialógové okno súboru, ktoré umožňuje používateľovi iba vybrať obrazové súbory. Keď používateľ vyberie jeden alebo viac obrázkov, otvorte každý z nich pomocou vankúša Image.open() metóda.

Zavolajte na zmeniť veľkosť_obrázka a vytvorte Tkinter kompatibilný PhotoImage. Pridajte toto do image_refs zoznam a zavolajte na update_canvas metóda.

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

Definujte metódu, zmeniť veľkosť_obrázka. Získajte šírku a výšku obrázka a vypočítajte jeho pomer strán. Ak je viac ako jedna, nastavte novú šírku na polovicu šírky koláže. Vypočítajte zodpovedajúcu novú výšku pri zachovaní pomeru strán.

Ak je pomer strán menší ako jedna, nastavte novú výšku na polovicu výšky koláže. Podobne vypočítajte zodpovedajúcu šírku. Použite vankúše zmeniť veľkosť metóda na vrátenie obrázka so zmenenou veľkosťou pomocou vypočítaných 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))

Definujte metódu, update_canvas. Vymažte všetky položky a požiadajte používateľa o požadovaný počet riadkov a stĺpcov prostredníctvom dialógového okna súboru. Nastavte šírku a výšku koláže tak, aby zaberala polovicu zadanej veľkosti koláže. Vymaže zoznam pozícií obrázkov. Inicializovať X a r posun na nulu, takže môžete sledovať posuny polohy pre usporiadanie obrázkov do riadkov a stĺpcov.

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

Iterovať cez image_refs zoznam a vytvorte obrázok na plátne pomocou zadaného posunu. Nastavte kotvu na severozápad tak, aby ste ľavý horný roh obrázka umiestnili na určené súradnice. Pripojte tieto súradnice k image_positions zoznam.

Aktualizujte x_offset pridať polovicu šírky koláže, pripraviť sa na umiestnenie ďalšieho obrázku. Ak je počet obrázkov umiestnených v aktuálnom riadku násobkom zadaného počtu stĺpcov, nastavte hodnotu x_offset na nulu. Označuje začiatok nového riadku. Na nastavenie pridajte polovicu výšky koláže r súradnice pre nasledujúci riadok.

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

Vytvorenie koláže a jej uloženie

Definujte metódu, vytvoriť_koláž. Ak na koláži nie sú žiadne obrázky, zobrazte varovanie. Zozbierajte šírku a výšku koláže. Vytvorte si vankúš Obrázok s bielym pozadím. Iterujte cez snímky zoznam a prilepte každý obrázok na pozadie na určené miesta.

Uložte koláž a zobrazte ju pomocou predvoleného prehliadača obrázkov.

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

Vytvorte inštanciu Tkinter a Aplikácia ImageCollage trieda. The mainloop() funkcia hovorí Pythonu, aby spustil slučku udalostí Tkinter a počúval udalosti, kým nezatvoríte okno.

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

Testovanie rôznych funkcií nástroja Image Collage Maker

Po spustení programu sa zobrazí okno s dvoma tlačidlami, Pridať obrázok, a Vytvorte koláž. Po kliknutí na Pridať obrázok zobrazí sa dialógové okno s požiadavkou na počet obrázkov na koláž. Po zadaní počtu obrázkov ako päť a ich výbere sa zobrazí ďalšie dialógové okno. Pýta sa na počet riadkov, za ktorými nasleduje počet stĺpcov.

Po zadaní dvoch riadkov a troch stĺpcov okno usporiada obrázky do mriežkovej štruktúry.

Náhľad umožňuje presúvať obrázky podľa želania. Po kliknutí na Vytvorte koláž tlačidlo, program uloží obrázok.

Pri prezeraní obrázka môžete potvrdiť, že program úspešne vytvoril koláž.

Zlepšenie funkčnosti nástroja Image Collage Maker

Namiesto tabuľkového formátu môžete používateľovi poskytnúť rôzne predvolené šablóny, z ktorých si môže vybrať. Pridajte funkcie na zmenu farby pozadia, pridávanie textu, používanie filtrov na obrázky a vkladanie nálepiek z internetu.

Pri pridávaní týchto funkcií uľahčite úpravu koláže s možnosťou vrátiť späť alebo zopakovať. Umožnite používateľovi orezať, zmeniť veľkosť a prevrátiť obrázky podľa svojich predstáv. Mali by ste tiež pridať možnosť uložiť obrázok v požadovanom formáte.