Научете всичко за обработката на изображения в Python с този прост, но полезен инструмент, който можете да създадете сами.
Колажът е красив начин за показване на спомени и набори от изображения. Създателите на онлайн колажи може да имат проблеми със сигурността, а офлайн приложенията може да струват пари и да нямат необходимите функции.
Като създадете свой собствен инструмент за създаване на колажи за изображения, можете да премахнете тези проблеми и да запазите пълен контрол. И така, как можете да създадете такъв?
Модулът Tkinter и PIL
За да създадете приложение за колаж на изображения, вие се нуждаете от Tkinter и PIL модула. Tkinter ви позволява да създавате настолни приложения. Той предлага разнообразие от джаджи, които го улесняват за разработване на GUI.
Библиотеката Pillow—разклонение на Python Imaging Library (PIL)—осигурява възможности за обработка на изображения, които помагат при редактиране, създаване, конвертиране на файлови форматии запазване на изображения.
За да инсталирате Tkinter и Pillow, отворете терминал и стартирайте:
pip install tk pillow
Настройка на GUI и манипулиране на изображения
Можете да намерите изходния код на този проект в него GitHub хранилище.
Започнете с импортиране на необходимите модули. Създайте клас, ImageCollageAppи задайте заглавието и размерите на прозореца. Определете платно с помощта на т.к. Платно() и задайте неговия родителски елемент, ширина, височина и цвят на фона.
import tkinter as tk
from tkinter import filedialog, simpledialog, messagebox
from PIL import Image, ImageTkclassImageCollageApp:
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)
Определете метод, on_press. Извличане на най-близкия елемент от платното от мястото, където потребителят щраква с мишката, и го съхранява под вещ ключ на данни за плъзгане речник. Съхранявайте координатите x и y на щракването на мишката. Ще използвате това, за да изчислите разстоянието, на което потребителят премества мишката по време на плъзгане.
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
Определете метод, on_drag. Изчислете хоризонталното и вертикалното разстояние, на което потребителят е преместил мишката по време на плъзгане, и съответно актуализирайте позицията на изображението. Съхранявайте актуализираните координати на изображението под х и г ключове на данни за плъзгане речник.
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
Определете метод, при_пускане. Изчистете препратката към изображението, което потребителят е влачил заедно с неговите координати. Обадете се на update_image_positions за актуализиране на позициите на всички изображения върху платното, след като потребителят го плъзне и пусне.
defon_release(self, event):
self.drag_data["item"] = None
self.drag_data["x"] = 0
self.drag_data["y"] = 0
self.update_image_positions()
Определете метод, 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))
Определете метод, add_images. Създайте диалогов прозорец, който подканва потребителя да въведе броя на изображенията за колажа. Ако потребителят предостави валиден номер, отворете диалогов прозорец за файлове, който позволява на потребителя само да избира файлове с изображения. След като потребителят избере едно или повече изображения, отворете всяко от тях с Pillow's Image.open() метод.
Обадете се на resize_image метод и създайте Tkinter-съвместим PhotoImage. Добавете това към image_refs списък и се обадете на update_canvas метод.
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()
Определете метод, resize_image. Получете ширината и височината на изображението и изчислете съотношението му. Ако е повече от една, задайте новата ширина на половината от ширината на колажа. Изчислете съответната нова височина, като запазите съотношението на страните.
Ако съотношението е по-малко от едно, задайте новата височина на половината от височината на колажа. По същия начин изчислете съответната ширина. Използвайте възглавниците преоразмеряване метод за връщане на преоразмерено изображение, използвайки изчислените параметри.
defresize_image(self, image):
img_width, img_height = image.size
aspect_ratio = img_width / img_heightif 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))
Определете метод, update_canvas. Изчистете всички елементи и попитайте потребителя за желания брой редове и колони чрез диалогов прозорец за файлове. Задайте ширината и височината на колажа да заемат половината от определения размер на колажа. Изчиства списъка с позиции на изображението. Инициализиране х и г отместване до нула, така че можете да следите отместванията на позицията за подреждане на изображения в редове и колони.
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
Повторете върху image_refs списък и създайте изображение върху платното, като използвате указаното отместване. Задайте котвата на северозапад, така че да позиционирате горния ляв ъгъл на изображението на посочените координати. Добавете тези координати към изображения_позиции списък.
Актуализирайте x_офсет за да добавите половината от ширината на колажа, за да се подготвите за поставяне на следващото изображение. Ако броят на изображенията, поставени в текущия ред, е кратен на определения брой колони, задайте x_офсет до нула. Това показва началото на нов ред. Добавете половината от височината на колажа, за да зададете г координата за следващия ред.
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
Създаване на колаж и запазването му
Определете метод, create_collage. Ако в колажа няма изображения, покажете предупреждение. Съберете ширината и височината на колажа. Създайте възглавница Изображение с бял фон. Итерация през изображения избройте и поставете всяко изображение на фона на посочените позиции.
Запазете колажа и го покажете с помощта на програмата за преглед на изображения по подразбиране.
defcreate_collage(self):
if len(self.images) == 0:
messagebox.showwarning("Warning", "Please add images first!")
returncollage_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()
Създайте екземпляр на Tkinter и Приложение ImageCollage клас. The mainloop() функцията казва на Python да стартира цикъла на събитията на Tkinter и да слуша за събития, докато затворите прозореца.
if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()
Тестване на различни функции на Image Collage Maker
При стартиране на програмата се появява прозорец с два бутона, Добавете изображение, и Създаване на колаж. При щракване върху Добавете изображение бутон, диалогов прозорец пита броя на изображенията за колаж. След като въведете броя на изображенията като пет и ги изберете, се появява друг диалогов прозорец. Той пита за броя на редовете, последвани от броя на колоните.
При въвеждане на два реда и три колони прозорецът организира изображенията в мрежова структура.
Визуализацията дава възможност за плъзгане на изображенията по желание. При щракване върху Създаване на колаж бутон, програмата запазва изображението.
При преглед на изображението можете да потвърдите, че програмата е създала колажа успешно.
Подобряване на функционалността на Image Collage Maker
Вместо табличен формат, можете да предоставите различни шаблони по подразбиране, от които потребителят да избира. Добавете функции за промяна на цвета на фона, добавяне на текст, прилагане на филтри към изображения и вмъкване на стикери от интернет.
Докато добавяте тези функции, улеснете редактирането на колажа с опция за отмяна или повторение. Позволете на потребителя да изрязва, преоразмерява и обръща изображенията според предпочитанията си. Трябва също да добавите опция за запазване на изображението в желания формат.