למד הכל על טיפול בתמונה ב- Python עם הכלי הפשוט אך השימושי הזה שתוכל לבנות בעצמך.
קולאז' הוא דרך יפה להציג זיכרונות ולהציג סטים של תמונות. ליצרני קולאז'ים מקוונים עשויים להיות חששות אבטחה ואפליקציות לא מקוונות עשויות לעלות כסף ולהיעדר את התכונות הדרושות לך.
על ידי בניית יוצר קולאז' תמונות משלך תוכל לבטל את החששות הללו ולשמור על שליטה מלאה. אז איך אתה יכול לבנות אחד?
מודול Tkinter ו-PIL
כדי לבנות יישום קולאז' תמונות אתה צריך את Tkinter ואת מודול PIL. Tkinter מאפשר לך ליצור יישומי שולחן עבודה. הוא מציע מגוון של ווידג'טים שמקלים על זה לפתח ממשקי GUI.
ספריית הכרית - מזלג של ספריית הדמיה של Python (PIL) - מספקת יכולות עיבוד תמונה המסייעות בעריכה, יצירה, המרת פורמטים של קבצים, ושמירת תמונות.
כדי להתקין את Tkinter וכרית, פתח מסוף והפעל:
pip install tk pillow
הגדרת GUI ועיבוד תמונה
אתה יכול למצוא את קוד המקור של הפרויקט הזה בו מאגר GitHub.
מתחילים ב ייבוא המודולים הנדרשים. צור כיתה, ImageCollageApp, והגדר את הכותרת והמידות של החלון. הגדר קנבס באמצעות tk. בַּד() והגדר את רכיב האב שלו, רוחב, גובה וצבע רקע.
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()
צור שני כפתורים: להוסיף תמונה, ו צור קולאז'. הגדר את רכיב האב, הטקסט להצגה, הפקודה להפעלה וסגנונות הגופנים. ארגן את הכפתורים על ידי הוספת ריפוד מתאים. לְאַתחֵל 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. חשב את המרחק האופקי והאנכי שהמשתמש הזיז את העכבר במהלך הגרירה ועדכן את מיקום התמונה בהתאם. אחסן את הקואורדינטות המעודכנות של התמונה תחת איקס ו y מפתחות של 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
הגדירו שיטה, 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))
הגדירו שיטה, הוסף תמונות. צור תיבת דו-שיח המבקשת מהמשתמש להזין את מספר התמונות עבור הקולאז'. אם המשתמש סיפק מספר חוקי, פתח תיבת דו-שיח של קובץ המאפשרת למשתמש לבחור רק קובצי תמונה. לאחר שהמשתמש בחר תמונה אחת או יותר, פתח כל אחת מהן עם כרית Image.open() שיטה.
תתקשר ל שינוי גודל_תמונה שיטה וליצור תואם 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()
הגדירו שיטה, שינוי גודל_תמונה. קבל את הרוחב והגובה של התמונה וחשב את יחס הרוחב-גובה שלה. אם זה יותר מאחד, הגדר את הרוחב החדש להיות מחצית מרוחב הקולאז'. חשב את הגובה החדש המתאים תוך שמירה על יחס הגובה-רוחב.
אם יחס הרוחב-גובה קטן מאחד, הגדר את הגובה החדש להיות מחצית מגובה הקולאז'. באופן דומה, חשב את הרוחב המתאים. השתמש בכרית שנה גודל שיטה להחזרת תמונה בגודל שונה באמצעות הפרמטרים המחושבים.
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. נקה את כל הפריטים ובקש מהמשתמש את המספר הרצוי של שורות ועמודות באמצעות תיבת דו-שיח של קובץ. הגדר את הרוחב והגובה של הקולאז' כך שייקח מחצית מגודל הקולאז' שצוין. מנקה את רשימת מיקומי התמונה. לְאַתחֵל איקס ו y היסט לאפס, כך שתוכל לעקוב אחר קיזוז המיקום לסידור תמונות בשורות ובעמודות.
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 לאפס. זה מציין את ההתחלה של שורה חדשה. הוסף חצי מגובה הקולאז' כדי להגדיר את y קואורדינטות לשורה הבאה.
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!")
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 מעמד. ה mainloop() הפונקציה אומרת לפייתון להפעיל את לולאת האירועים של Tkinter ולהקשיב לאירועים עד שתסגור את החלון.
if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()
בדיקת תכונות שונות של יוצר קולאז' התמונות
בהפעלת התוכנית, מופיע חלון עם שני לחצנים, להוסיף תמונה, ו צור קולאז'. בלחיצה על להוסיף תמונה לחצן, תיבת דו-שיח מבקשת את מספר התמונות לקולאז'. בהזנת מספר התמונות כחמש ובחירתן, מופיעה תיבת דו-שיח נוספת. הוא מבקש את מספר השורות ואחריו מספר העמודות.
בכניסה לשתי שורות ושלוש עמודות, החלון מארגן את התמונות במבנה רשת.
התצוגה המקדימה נותנת את היכולת לגרור את התמונות לפי הרצון. בלחיצה על צור קולאז' כפתור, התוכנית שומרת את התמונה.
בצפייה בתמונה, אתה יכול לאשר שהתוכנית יצרה את הקולאז' בהצלחה.
שיפור הפונקציונליות של יוצר קולאז' התמונות
במקום פורמט טבלה, אתה יכול לספק תבניות ברירת מחדל שונות לבחירת המשתמש. הוסף תכונות לשינוי צבע הרקע, הוספת טקסט, החלת מסננים על תמונות והכנסת מדבקות מהאינטרנט.
בזמן הוספת התכונות הללו, הקל על עריכת הקולאז' עם אפשרות לבטל או לבצע מחדש. תן למשתמש לחתוך, לשנות גודל ולהפוך את התמונות לפי רצונו. כדאי להוסיף גם אפשרות לשמור את התמונה בפורמט הרצוי.