Сазнајте све о руковању сликама у Питхон-у помоћу овог једноставног, али корисног алата који можете сами да направите.

Колаж је предиван начин да прикажете успомене и прикажете скупове слика. Произвођачи колажа на мрежи могу имати забринутости за безбедност, а офлајн апликације могу коштати новац и немају функције које су вам потребне.

Изградњом сопственог произвођача колажа слика можете елиминисати ове бриге и задржати потпуну контролу. Па, како га можете изградити?

Ткинтер и ПИЛ модул

Да бисте направили апликацију за колаж слика, потребни су вам Ткинтер и ПИЛ модул. Ткинтер вам омогућава да креирате десктоп апликације. Нуди разне виџете који га чине лакшим да развије ГУИ.

Библиотека јастука — виљушка Питхон Библиотеке слика (ПИЛ) — пружа могућности обраде слика које помажу у уређивању, креирању, претварање формата датотека, и чување слика.

Да бисте инсталирали Ткинтер и Пиллов, отворите терминал и покрените:

pip install tk pillow

Подешавање ГУИ-ја и манипулација сликама

Изворни код овог пројекта можете пронаћи у његовом ГитХуб спремиште.

Почните од увоз потребних модула. Направите класу, ИмагеЦоллагеАпп, и подесите наслов и димензије прозора. Дефинишите платно помоћу тк. платно() и подесите његов родитељски елемент, ширину, висину и боју позадине.

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

Направите два дугмета: Додај слику, и Направите колаж. Дефинишите надређени елемент, текст за приказ, наредбу за покретање и стилове фонта. Организујте дугмад додавањем одговарајућих допуна. Иницијализујте драг_дата за чување информација о операцији превлачења.

Иницијализујте имаге_поситионс за чување положаја слика на платну. Дефинишите три руковаоца догађајима који ће одговорити на избор, превлачење и пуштање слика.

 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)

Дефинишите метод, он_пресс. Преузми најближу ставку платна са локације на којој корисник кликне мишем и сачувај је испод предмет кључ од драг_дата речник. Сачувајте к и и координате клика мишем. Ово ћете користити за израчунавање удаљености коју корисник помера мишем током превлачења.

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

Дефинишите метод, он_драг. Израчунајте хоризонталну и вертикалну удаљеност коју је корисник померио мишем током превлачења и ажурирајте положај слике у складу са тим. Сачувајте ажуриране координате слике испод Икс и и кључеви од драг_дата речник.

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

Дефинишите метод, он_релеасе. Обришите референцу на слику коју је корисник вукао заједно са њеним координатама. Звати упдате_имаге_поситионс за ажурирање положаја свих слика на платну након што их корисник превуче и пусти.

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

Дефинишите метод, упдате_имаге_поситионс. Обришите имаге_поситионс листајте и понављајте све ставке платна. За сваку ставку пронађите координате и додајте их на листу.

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

Дефинишите метод, адд_имагес. Направите оквир за дијалог који тражи од корисника да унесе број слика за колаж. Ако је корисник навео исправан број, отворите дијалошки оквир датотеке који кориснику омогућава само да изабере сликовне датотеке. Када корисник одабере једну или више слика, отворите сваку помоћу јастука Имаге.опен() методом.

Звати ресизе_имаге метод и креирајте Ткинтер компатибилан ПхотоИмаге. Додајте ово у имаге_рефс листу и позовите упдате_цанвас методом.

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

Дефинишите метод, ресизе_имаге. Добијте ширину и висину слике и израчунајте њен однос ширине и висине. Ако их је више, поставите нову ширину на половину ширине колажа. Израчунајте одговарајућу нову висину уз задржавање односа ширине и висине.

Ако је однос страница мањи од један, подесите нову висину на половину висине колажа. Слично томе, израчунајте одговарајућу ширину. Користите јастуке промените величину метод за враћање слике промењене величине помоћу израчунатих параметара.

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

Дефинишите метод, упдате_цанвас. Обришите све ставке и затражите од корисника жељени број редова и колона преко дијалошког оквира датотеке. Подесите ширину и висину колажа тако да заузимају половину наведене величине колажа. Брише листу позиција слика. Иницијализујте Икс и и помак на нулу, тако да можете пратити помаке положаја за распоређивање слика у редовима и колонама.

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

Итерирајте преко имаге_рефс листу и креирајте слику на платну користећи наведени офсет. Поставите сидро на северозапад тако да горњи леви угао слике поставите на наведене координате. Додајте ове координате у имаге_поситионс листа.

Ажурирајте к_оффсет да додате половину ширине колажа, да се припремите за постављање следеће слике. Ако је број слика постављених у тренутни ред вишеструки од наведеног броја колона, подесите к_оффсет на нулу. Ово указује на почетак новог реда. Додајте половину висине колажа да бисте поставили и координата за следећи ред.

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

Прављење колажа и његово чување

Дефинишите метод, цреате_цоллаге. Ако на колажу нема слика, прикажите упозорење. Прикупите ширину и висину колажа. Направите јастук Слика са белом позадином. Итерирајте кроз слике наведите и налепите сваку слику на позадину на наведеним позицијама.

Сачувајте колаж и прикажите га помоћу подразумеваног прегледача слика.

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

Направите инстанцу Ткинтер-а и Апликација ИмагеЦоллаге класа. Тхе маинлооп() функција каже Питхон-у да покрене Ткинтер петљу догађаја и ослушкује догађаје док не затворите прозор.

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

Тестирање различитих карактеристика Имаге Цоллаге Макер

Након покретања програма, појављује се прозор са два дугмета, Додај слику, и Направите колаж. Кликом на Додај слику дугме, дијалошки оквир тражи број слика за колаж. Када унесете број слика као пет и изаберете их, појављује се други оквир за дијалог. Пита се за број редова након чега следи број колона.

Када унесете два реда и три колоне, прозор организује слике у структуру мреже.

Преглед даје могућност превлачења слика по жељи. Кликом на Направите колаж дугме, програм чува слику.

Када погледате слику, можете потврдити да је програм успешно направио колаж.

Побољшање функционалности Имаге Цоллаге Макер

Уместо табеларног формата, можете да обезбедите различите подразумеване шаблоне које корисник може да бира. Додајте функције за промену боје позадине, додавање текста, примену филтера на слике и уметање налепница са интернета.

Док додајете ове функције, олакшајте уређивање колажа са опцијом за поништавање или понављање. Дозволите кориснику да исече, промени величину и преокрене слике према свом укусу. Такође би требало да додате опцију да сачувате слику у жељеном формату.