تعلم كل شيء عن معالجة الصور في بايثون باستخدام هذه الأداة البسيطة والمفيدة التي يمكنك تصميمها بنفسك.

تعتبر الكولاج طريقة جميلة لعرض الذكريات وعرض مجموعات من الصور. قد يكون لدى صانعي الصور المجمعة عبر الإنترنت مخاوف أمنية وقد تكلف التطبيقات غير المتصلة بالإنترنت أموالاً وتفتقر إلى الميزات التي تحتاجها.

من خلال إنشاء صانع صور مجمعة خاص بك، يمكنك التخلص من هذه المخاوف والاحتفاظ بالتحكم الكامل. إذًا، كيف يمكنك بناء واحدة؟

وحدة Tkinter وPIL

لإنشاء تطبيق مجمع للصور، تحتاج إلى Tkinter ووحدة PIL. يسمح لك Tkinter بإنشاء تطبيقات سطح المكتب. فهو يقدم مجموعة متنوعة من الأدوات التي تسهل الأمر لتطوير واجهات المستخدم الرسومية.

توفر مكتبة الوسادة - وهي فرع من مكتبة تصوير بايثون (PIL) - إمكانات معالجة الصور التي تساعد في تحرير وإنشاء تحويل صيغ الملفات، وحفظ الصور.

لتثبيت Tkinter and Pillow، افتح الوحدة الطرفية وقم بتشغيل:

pip install tk pillow

إعداد واجهة المستخدم الرسومية ومعالجة الصور

يمكنك العثور على الكود المصدري لهذا المشروع في ملف مستودع جيثب.

ابدأ بها استيراد الوحدات المطلوبة. إنشاء فصل دراسي، ImageCollageApp

instagram viewer
، وقم بتعيين عنوان النافذة وأبعادها. تحديد قماش باستخدام تك. اللوحة القماشية() وقم بتعيين العنصر الأصلي والعرض والارتفاع ولون الخلفية.

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

إنشاء زرين: إضافة صورة، و إنشاء مجمعة. حدد العنصر الأصلي، والنص الذي سيتم عرضه، والأمر الذي سيتم تشغيله، وأنماط الخطوط. تنظيم الأزرار عن طريق إضافة الحشو المناسب. تهيئة Drag_data لتخزين المعلومات حول عملية السحب.

تهيئة 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. قم باسترجاع أقرب عنصر قماش من الموقع الذي ينقر فيه المستخدم بالماوس وقم بتخزينه ضمن غرض مفتاح Drag_data قاموس. قم بتخزين إحداثيات 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. احسب المسافة الأفقية والعمودية التي حركها المستخدم بالماوس أثناء السحب وقم بتحديث موضع الصورة وفقًا لذلك. قم بتخزين الإحداثيات المحدثة للصورة ضمن س و ذ مفاتيح Drag_data قاموس.

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. نظف ال 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))

تحديد الطريقة، إضافة الصور. قم بإنشاء مربع حوار يطالب المستخدم بإدخال عدد الصور المجمعة. إذا قدم المستخدم رقمًا صالحًا، فافتح مربع حوار ملف يسمح للمستخدم فقط بتحديد ملفات الصور. بمجرد قيام المستخدم بتحديد صورة واحدة أو أكثر، افتح كل صورة باستخدام "الوسادة". صورة.فتح() طريقة.

اتصل ب تغيير حجم الصورة طريقة وإنشاء 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 قم بإدراج وإنشاء صورة على القماش باستخدام الإزاحة المحددة. اضبط نقطة الارتساء على الشمال الغربي بحيث تضع الزاوية العلوية اليسرى للصورة عند الإحداثيات المحددة. قم بإلحاق هذه الإحداثيات بـ 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 و تطبيق إيماج كولاج فصل. ال الحلقة الرئيسية () تخبر الوظيفة Python بتشغيل حلقة حدث Tkinter والاستماع إلى الأحداث حتى تغلق النافذة.

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

اختبار الميزات المختلفة لصانع مجمعة الصور

عند تشغيل البرنامج تظهر نافذة بها زرين إضافة صورة، و إنشاء مجمعة. عند النقر على إضافة صورة الزر، يظهر مربع حوار يسألك عن عدد الصور المراد تجميعها. عند إدخال عدد الصور كخمسة واختيارها، يظهر مربع حوار آخر. ويسأل عن عدد الصفوف متبوعاً بعدد الأعمدة.

عند إدخال صفين وثلاثة أعمدة، تنظم النافذة الصور في بنية شبكية.

تمنح المعاينة إمكانية سحب الصور حسب الرغبة. عند النقر على إنشاء مجمعة الزر، يقوم البرنامج بحفظ الصورة.

عند عرض الصورة، يمكنك التأكد من أن البرنامج قام بإنشاء الصورة المجمعة بنجاح.

تعزيز وظيفة صانع الصور المجمعة

بدلاً من التنسيق الجدولي، يمكنك توفير قوالب افتراضية مختلفة ليختار منها المستخدم. إضافة ميزات لتغيير لون الخلفية وإضافة نص وتطبيق المرشحات على الصور وإدراج الملصقات من الإنترنت.

أثناء إضافة هذه الميزات، يمكنك تسهيل تحرير الصورة المجمعة باستخدام خيار التراجع أو الإعادة. اسمح للمستخدم بقص الصور وتغيير حجمها وقلبها حسب رغبته. يجب عليك أيضًا إضافة خيار لحفظ الصورة بالتنسيق المطلوب.