Uzziniet visu par attēlu apstrādi Python, izmantojot šo vienkāršo, bet noderīgo rīku, ko varat izveidot pats.

Kolāža ir lielisks veids, kā demonstrēt atmiņas un parādīt attēlu kopas. Tiešsaistes kolāžu veidotājiem var būt drošības problēmas, un bezsaistes lietotnes var maksāt naudu, un tām var nebūt nepieciešamo funkciju.

Izveidojot savu attēlu kolāžu veidotāju, jūs varat novērst šīs bažas un saglabāt pilnīgu kontroli. Tātad, kā jūs varat to izveidot?

Tkinter un PIL modulis

Lai izveidotu attēlu kolāžas lietojumprogrammu, jums ir nepieciešams Tkinter un PIL modulis. Tkinter ļauj izveidot darbvirsmas lietojumprogrammas. Tas piedāvā dažādus logrīkus, kas to atvieglo izstrādāt GUI.

Pillow bibliotēka — Python Imaging Library (PIL) daļa — nodrošina attēlu apstrādes iespējas, kas palīdz rediģēt, izveidot, failu formātu konvertēšanaun attēlu saglabāšana.

Lai instalētu Tkinter un Pillow, atveriet termināli un palaidiet:

pip install tk pillow

GUI iestatīšana un attēlu manipulācijas

Jūs varat atrast šī projekta pirmkodu tajā GitHub repozitorijs.

instagram viewer

Sāciet ar nepieciešamo moduļu importēšana. Izveidot klasi, ImageCollageAppun iestatiet loga nosaukumu un izmērus. Definējiet audekls, izmantojot tk. Audekls() un iestatiet tā pamatelementu, platumu, augstumu un fona krāsu.

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

Izveidojiet divas pogas: Pievienot attēlu, un Izveidot kolāžu. Definējiet vecāku elementu, parādāmo tekstu, izpildāmo komandu un fontu stilus. Sakārtojiet pogas, pievienojot atbilstošu polsterējumu. Palaist drag_data lai saglabātu informāciju par vilkšanas darbību.

Palaist image_positions lai saglabātu attēlu pozīcijas uz audekla. Definējiet trīs notikumu apdarinātājus, lai reaģētu uz attēlu atlasi, vilkšanu un atbrīvošanu.

 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)

Definējiet metodi, on_press. Izgūstiet tuvāko audekla vienumu no vietas, kur lietotājs noklikšķina ar peli, un saglabājiet to zem lieta atslēga no drag_data vārdnīca. Saglabājiet peles klikšķa x un y koordinātas. Jūs to izmantosit, lai aprēķinātu attālumu, kādā lietotājs pārvieto peli vilkšanas laikā.

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

Definējiet metodi, on_drag. Aprēķiniet horizontālo un vertikālo attālumu, kādā lietotājs pārvietoja peli vilkšanas laikā, un attiecīgi atjauniniet attēla pozīciju. Saglabājiet atjauninātās attēla koordinātas zem x un y atslēgas drag_data vārdnīca.

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

Definējiet metodi, on_release. Notīriet atsauci uz attēlu, kuru lietotājs vilka kopā ar tā koordinātām. Zvaniet uz update_image_positions lai atjauninātu visu attēlu pozīcijas uz audekla pēc tam, kad lietotājs to vilks un atlaiž.

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

Definējiet metodi, update_image_positions. Notīriet image_positions sarakstu un atkārtojiet visus audekla vienumus. Katram vienumam atrodiet koordinātas un pievienojiet tās sarakstam.

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

Definējiet metodi, pievienot_attēlus. Izveidojiet dialoglodziņu, kurā lietotājam ir jāievada kolāžai paredzēto attēlu skaits. Ja lietotājs ir norādījis derīgu numuru, atveriet faila dialoglodziņu, kas ļauj lietotājam atlasīt tikai attēlu failus. Kad lietotājs ir atlasījis vienu vai vairākus attēlus, atveriet katru no tiem, izmantojot Pillow's Image.open() metodi.

Zvaniet uz attēla lieluma maiņa metodi un izveidojiet ar Tkinter saderīgu Fotoattēls. Pievienojiet šo image_refs sarakstu un zvaniet uz update_canvas metodi.

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

Definējiet metodi, attēla lieluma maiņa. Iegūstiet attēla platumu un augstumu un aprēķiniet tā malu attiecību. Ja tas ir vairāk nekā viens, iestatiet jauno platumu uz pusi no kolāžas platuma. Aprēķiniet atbilstošo jauno augstumu, saglabājot malu attiecību.

Ja malu attiecība ir mazāka par vienu, iestatiet jauno augstumu uz pusi no kolāžas augstuma. Līdzīgi aprēķiniet atbilstošo platumu. Izmantojiet spilvenu mainīt izmērus metode, lai atgrieztu attēlu ar mainītu izmēru, izmantojot aprēķinātos 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))

Definējiet metodi, update_canvas. Notīriet visus vienumus un faila dialoglodziņā pieprasiet lietotājam vajadzīgo rindu un kolonnu skaitu. Iestatiet kolāžas platumu un augstumu, lai tas aizņemtu pusi no norādītā kolāžas izmēra. Notīra attēla pozīciju sarakstu. Palaist x un y nobīde līdz nullei, lai jūs varētu sekot līdzi pozīciju nobīdēm, kārtojot attēlus rindās un kolonnās.

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

Atkārtojiet pāri image_refs sarakstu un izveidojiet attēlu uz audekla, izmantojot norādīto nobīdi. Iestatiet enkuru uz ziemeļrietumiem, lai attēla augšējais kreisais stūris tiktu novietots norādītajās koordinātēs. Pievienojiet šīs koordinātas image_positions sarakstu.

Atjauniniet x_offset lai pievienotu pusi no kolāžas platuma, sagatavotos nākamā attēla ievietošanai. Ja pašreizējā rindā ievietoto attēlu skaits ir norādītā kolonnu skaita reizinājums, iestatiet x_offset uz nulli. Tas norāda uz jaunas rindas sākumu. Pievienojiet pusi no kolāžas augstuma, lai iestatītu y koordinātas nākamajai rindai.

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

Kolāžas izveide un saglabāšana

Definējiet metodi, izveidot_kolāžu. Ja kolāžā nav attēlu, parādiet brīdinājumu. Apkopojiet kolāžas platumu un augstumu. Izveidojiet spilvenu Attēls ar baltu fonu. Atkārtojiet, izmantojot attēlus sarakstu un ielīmējiet katru attēlu uz fona norādītajās pozīcijās.

Saglabājiet kolāžu un parādiet to, izmantojot noklusējuma attēlu skatītāju.

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

Izveidojiet Tkinter gadījumu un Lietotne ImageCollage klasē. The mainloop() funkcija liek Python palaist Tkinter notikumu cilpu un klausīties notikumus, līdz aizverat logu.

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

Attēlu kolāžu veidotāja dažādu funkciju pārbaude

Palaižot programmu, parādās logs ar divām pogām, Pievienot attēlu, un Izveidot kolāžu. Noklikšķinot uz Pievienot attēlu pogai, dialoglodziņā tiek jautāts kolāžas attēlu skaits. Ievadot attēlu skaitu kā piecus un atlasot tos, tiek parādīts cits dialoglodziņš. Tas prasa norādīt rindu skaitu, kam seko kolonnu skaits.

Ievadot divas rindas un trīs kolonnas, logs sakārto attēlus režģa struktūrā.

Priekšskatījums dod iespēju vilkt attēlus pēc vēlēšanās. Noklikšķinot uz Izveidot kolāžu pogu, programma saglabā attēlu.

Apskatot attēlu, varat pārliecināties, ka programma ir veiksmīgi izveidojusi kolāžu.

Attēlu kolāžu veidotāja funkcionalitātes uzlabošana

Tabulas formāta vietā varat nodrošināt dažādas noklusējuma veidnes, no kurām lietotājs var izvēlēties. Pievienojiet funkcijas fona krāsas maiņai, teksta pievienošanai, filtru pielietošanai attēliem un uzlīmju ievietošanai no interneta.

Pievienojot šīs funkcijas, atvieglojiet kolāžas rediģēšanu ar iespēju atsaukt vai atkārtot. Ļaujiet lietotājam apgriezt, mainīt izmērus un apgriezt attēlus atbilstoši savām vēlmēm. Jums vajadzētu arī pievienot iespēju saglabāt attēlu vēlamajā formātā.