Μάθετε τα πάντα για το χειρισμό εικόνων στην Python με αυτό το απλό αλλά χρήσιμο εργαλείο που μπορείτε να φτιάξετε μόνοι σας.

Ένα κολάζ είναι ένας όμορφος τρόπος για να αναδείξετε αναμνήσεις και να εμφανίσετε σύνολα εικόνων. Οι διαδικτυακοί κατασκευαστές κολάζ μπορεί να έχουν ανησυχίες για την ασφάλεια και οι εφαρμογές εκτός σύνδεσης μπορεί να κοστίζουν χρήματα και να μην έχουν τις δυνατότητες που χρειάζεστε.

Δημιουργώντας τον δικό σας δημιουργό κολάζ εικόνων, μπορείτε να εξαλείψετε αυτές τις ανησυχίες και να διατηρήσετε τον πλήρη έλεγχο. Λοιπόν, πώς μπορείτε να φτιάξετε ένα;

Η ενότητα Tkinter και PIL

Για να δημιουργήσετε μια εφαρμογή κολάζ εικόνων χρειάζεστε το Tkinter και τη μονάδα PIL. Το Tkinter σάς επιτρέπει να δημιουργείτε εφαρμογές επιφάνειας εργασίας. Προσφέρει μια ποικιλία γραφικών στοιχείων που το καθιστούν ευκολότερο για την ανάπτυξη GUI.

Η βιβλιοθήκη Pillow—μια διχάλα της Python Imaging Library (PIL)—παρέχει δυνατότητες επεξεργασίας εικόνας που βοηθούν στην επεξεργασία, τη δημιουργία, μετατροπή μορφών αρχείωνκαι αποθήκευση εικόνων.

instagram viewer

Για να εγκαταστήσετε το Tkinter και το Pillow, ανοίξτε ένα τερματικό και εκτελέστε:

pip install tk pillow

Ρύθμιση GUI και χειρισμός εικόνας

Μπορείτε να βρείτε τον πηγαίο κώδικα αυτού του έργου σε αυτό Αποθετήριο GitHub.

Ξεκινήστε από εισαγωγή των απαιτούμενων μονάδων. Δημιουργήστε μια τάξη, ImageCollage Appκαι ορίστε τον τίτλο και τις διαστάσεις του παραθύρου. Ορίστε έναν καμβά χρησιμοποιώντας tk. Καμβάς() και ορίστε το γονικό στοιχείο, το πλάτος, το ύψος και το χρώμα φόντου.

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 για να αποθηκεύσετε πληροφορίες σχετικά με τη λειτουργία μεταφοράς.

Αρχικοποίηση εικόνα_θέσεις για να αποθηκεύσετε τις θέσεις των εικόνων στον καμβά. Ορίστε τρεις χειριστές συμβάντων για να ανταποκρίνονται στην επιλογή, τη μεταφορά και την απελευθέρωση εικόνων.

 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. Καθαρίστε το εικόνα_θέσεις λίστα και επανάληψη σε όλα τα στοιχεία καμβά. Για κάθε στοιχείο, βρείτε τις συντεταγμένες και προσθέστε τις στη λίστα.

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() μέθοδος.

Καλέστε το αλλαγή μεγέθους_εικόνας μέθοδο και δημιουργήστε ένα συμβατό με 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_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. Διαγράψτε όλα τα στοιχεία και ζητήστε από τον χρήστη τον επιθυμητό αριθμό γραμμών και στηλών μέσω ενός πλαισίου διαλόγου αρχείου. Ρυθμίστε το πλάτος και το ύψος του κολάζ ώστε να λαμβάνεται το μισό από το καθορισμένο μέγεθος κολάζ. Διαγράφει τη λίστα θέσεων εικόνας. Αρχικοποίηση Χ και 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 λίστα και δημιουργήστε μια εικόνα στον καμβά χρησιμοποιώντας την καθορισμένη μετατόπιση. Ρυθμίστε την άγκυρα στη βορειοδυτική θέση έτσι ώστε να τοποθετήσετε την επάνω αριστερή γωνία της εικόνας στις καθορισμένες συντεταγμένες. Προσθέστε αυτές τις συντεταγμένες στο εικόνα_θέσεις λίστα.

Ενημερώστε το 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!")
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 τάξη. ο mainloop() Η συνάρτηση λέει στην Python να εκτελέσει τον βρόχο συμβάντων Tkinter και να ακούει συμβάντα μέχρι να κλείσει το παράθυρο.

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

Δοκιμή διαφορετικών χαρακτηριστικών του Image Collage Maker

Κατά την εκτέλεση του προγράμματος, εμφανίζεται ένα παράθυρο με δύο κουμπιά, Προσθέστε εικόνα, και Δημιουργία Κολάζ. Κάνοντας κλικ στο Προσθέστε εικόνα κουμπί, ένα πλαίσιο διαλόγου ζητά τον αριθμό των εικόνων για κολάζ. Με την εισαγωγή του αριθμού των εικόνων ως πέντε και την επιλογή τους, εμφανίζεται ένα άλλο παράθυρο διαλόγου. Ζητάει τον αριθμό των σειρών που ακολουθείται από τον αριθμό των στηλών.

Με την εισαγωγή δύο σειρών και τριών στηλών, το παράθυρο οργανώνει τις εικόνες σε μια δομή πλέγματος.

Η προεπισκόπηση δίνει τη δυνατότητα να σύρετε τις εικόνες ανάλογα με την επιθυμία σας. Κάνοντας κλικ στο Δημιουργία Κολάζ κουμπί, το πρόγραμμα αποθηκεύει την εικόνα.

Κατά την προβολή της εικόνας, μπορείτε να επιβεβαιώσετε ότι το πρόγραμμα δημιούργησε το κολάζ με επιτυχία.

Βελτίωση της λειτουργικότητας του Image Collage Maker

Αντί για μορφή πίνακα, μπορείτε να παρέχετε διαφορετικά προεπιλεγμένα πρότυπα για να επιλέξει ο χρήστης. Προσθέστε λειτουργίες για την αλλαγή του χρώματος φόντου, την προσθήκη κειμένου, την εφαρμογή φίλτρων σε εικόνες και την εισαγωγή αυτοκόλλητων από το διαδίκτυο.

Κατά την προσθήκη αυτών των δυνατοτήτων, διευκολύνετε την επεξεργασία του κολάζ με μια επιλογή αναίρεσης ή επανάληψης. Αφήστε τον χρήστη να περικόψει, να αλλάξει το μέγεθος και να αναποδογυρίσει τις εικόνες σύμφωνα με τις προτιμήσεις του. Θα πρέπει επίσης να προσθέσετε μια επιλογή αποθήκευσης της εικόνας στην επιθυμητή μορφή.