Узнайте все об обработке изображений в Python с помощью этого простого, но полезного инструмента, который вы можете создать самостоятельно.

Коллаж — прекрасный способ продемонстрировать воспоминания и продемонстрировать наборы изображений. У онлайн-создателей коллажей могут возникнуть проблемы с безопасностью, а офлайн-приложения могут стоить денег и не иметь необходимых вам функций.

Создав свой собственный инструмент для создания коллажей, вы сможете устранить эти проблемы и сохранить полный контроль. Итак, как же его построить?

Модуль Tkinter и PIL

Для создания приложения для создания коллажей изображений вам понадобятся Tkinter и модуль PIL. Tkinter позволяет создавать настольные приложения. Он предлагает множество виджетов, которые упрощают работу. разрабатывать графические интерфейсы.

Библиотека Pillow — ответвление библиотеки изображений Python (PIL) — предоставляет возможности обработки изображений, которые помогают редактировать, создавать, конвертация форматов файлови сохранение изображений.

instagram viewer

Чтобы установить Tkinter и Pillow, откройте терминал и запустите:

pip install tk pillow

Настройка графического интерфейса и манипулирование изображениями

Вы можете найти исходный код этого проекта в его Репозиторий GitHub.

Начать с импорт необходимых модулей. Создать класс, Приложение ImageCollageи установите заголовок и размеры окна. Определите холст, используя тк. Холст() и установите его родительский элемент, ширину, высоту и цвет фона.

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

Создайте две кнопки: Добавить изображение, и Создать коллаж. Определите родительский элемент, отображаемый текст, команду для запуска и стили шрифта. Организуйте кнопки, добавив соответствующие отступы. Инициализировать перетаскивание_данных для хранения информации об операции перетаскивания.

Инициализировать image_positions для хранения положений изображений на холсте. Определите три обработчика событий, которые будут реагировать на выбор, перетаскивание и освобождение изображений.

 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

Определить метод, on_release. Очистите ссылку на изображение, которое пользователь перетаскивал, вместе с его координатами. Позвоните в 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. Очистить 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. Изображение.open() метод.

Позвоните в изменить размер_изображения метод и создайте Tkinter-совместимый Фотоизображение. Добавьте это в 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()

Определить метод, изменить размер_изображения. Получите ширину и высоту изображения и рассчитайте его соотношение сторон. Если их больше одного, установите новую ширину равной половине ширины коллажа. Рассчитайте соответствующую новую высоту, сохраняя соотношение сторон.

Если соотношение сторон меньше единицы, установите новую высоту равной половине высоты коллажа. Аналогично рассчитайте соответствующую ширину. Используйте подушки изменить размер метод для возврата изображения с измененным размером с использованием вычисленных параметров.

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

Определить метод, 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 list и создайте изображение на холсте, используя указанное смещение. Установите привязку на северо-запад, чтобы верхний левый угол изображения располагался в указанных координатах. Добавьте эти координаты в image_positions список.

Обновите x_offset чтобы добавить половину ширины коллажа, чтобы подготовиться к размещению следующего изображения. Если количество изображений, помещенных в текущую строку, кратно указанному количеству столбцов, установите параметр x_offset до нуля. Это указывает на начало новой строки. Добавьте половину высоты коллажа, чтобы установить й координата следующей строки.

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

Создайте экземпляр Tkinter и Приложение ImageCollage сорт. основной цикл() Функция сообщает Python запустить цикл событий Tkinter и прослушивать события, пока вы не закроете окно.

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

Тестирование различных функций программы Image Collage Maker

При запуске программы появляется окно с двумя кнопками: Добавить изображение, и Создать коллаж. При нажатии кнопки Добавить изображение Кнопка, диалоговое окно запрашивает количество изображений для создания коллажа. При вводе количества изображений (пять) и их выборе появляется другое диалоговое окно. Он запрашивает количество строк, а затем количество столбцов.

При вводе двух строк и трех столбцов окно организует изображения в виде сетки.

Предварительный просмотр дает возможность перетаскивать изображения по своему желанию. При нажатии кнопки Создать коллаж Кнопка, программа сохраняет изображение.

Просмотрев изображение, вы можете убедиться, что программа успешно создала коллаж.

Расширение функциональности средства создания коллажей изображений

Вместо табличного формата вы можете предоставить пользователю на выбор различные шаблоны по умолчанию. Добавьте функции изменения цвета фона, добавления текста, применения фильтров к изображениям и вставки наклеек из Интернета.

Добавляя эти функции, упростите редактирование коллажа с возможностью отмены или повтора. Позвольте пользователю обрезать, изменять размер и переворачивать изображения по своему вкусу. Вам также следует добавить возможность сохранять изображение в нужном формате.