Pelajari semua tentang penanganan gambar dengan Python dengan alat sederhana namun berguna yang dapat Anda buat sendiri.
Kolase adalah cara yang indah untuk menampilkan kenangan dan menampilkan kumpulan gambar. Pembuat kolase online mungkin memiliki masalah keamanan dan aplikasi offline mungkin memerlukan biaya dan tidak memiliki fitur yang Anda perlukan.
Dengan membuat pembuat kolase gambar Anda sendiri, Anda dapat menghilangkan kekhawatiran ini dan mempertahankan kendali penuh. Jadi, bagaimana cara membuatnya?
Modul Tkinter dan PIL
Untuk membangun aplikasi kolase gambar Anda memerlukan modul Tkinter dan PIL. Tkinter memungkinkan Anda membuat aplikasi desktop. Ia menawarkan berbagai widget yang membuatnya lebih mudah untuk mengembangkan GUI.
Pustaka Pillow—cabang dari Python Imaging Library (PIL)—menyediakan kemampuan pemrosesan gambar yang membantu dalam mengedit, membuat, mengonversi format file, dan menyimpan gambar.
Untuk menginstal Tkinter dan Pillow, buka terminal dan jalankan:
pip install tk pillow
Pengaturan GUI dan Manipulasi Gambar
Anda dapat menemukan kode sumber proyek ini di dalamnya Repositori GitHub.
Mulailah dengan mengimpor modul yang diperlukan. Buat kelas, Aplikasi Kolase Gambar, dan atur judul dan dimensi jendela. Definisikan kanvas menggunakan tk. Kanvas() dan atur elemen induknya, lebar, tinggi, dan warna latar belakangnya.
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()
Buat dua tombol: Menambahkan gambar, Dan Buat Kolase. Tentukan elemen induk, teks yang akan ditampilkan, perintah yang akan dijalankan, dan gaya font. Atur tombol dengan menambahkan padding yang sesuai. Inisialisasi seret_data untuk menyimpan informasi tentang operasi menyeret.
Inisialisasi posisi_gambar untuk menyimpan posisi gambar di kanvas. Tentukan tiga pengendali kejadian untuk merespons pemilihan, menyeret, dan melepaskan gambar.
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)
Tentukan metode, di_tekan. Ambil item kanvas terdekat dari lokasi di mana pengguna mengklik mouse dan simpan di bawah barang kunci dari seret_data kamus. Menyimpan koordinat x dan y dari klik mouse. Anda akan menggunakan ini untuk menghitung jarak pengguna menggerakkan mouse saat menyeret.
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
Tentukan metode, di_seret. Hitung jarak horizontal dan vertikal pengguna menggerakkan mouse selama menyeret dan memperbarui posisi gambar sesuai dengan itu. Simpan koordinat gambar yang diperbarui di bawah X Dan kamu kunci dari seret_data kamus.
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
Tentukan metode, pada_rilis. Hapus referensi ke gambar yang diseret pengguna beserta koordinatnya. Hubungi perbarui_posisi_gambar untuk memperbarui posisi semua gambar di kanvas setelah pengguna menyeret dan melepaskannya.
defon_release(self, event):
self.drag_data["item"] = None
self.drag_data["x"] = 0
self.drag_data["y"] = 0
self.update_image_positions()
Tentukan metode, perbarui_posisi_gambar. Hapus posisi_gambar daftar dan ulangi semua item kanvas. Untuk setiap item, temukan koordinatnya dan tambahkan ke daftar.
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))
Tentukan metode, tambahkan_gambar. Buat kotak dialog yang meminta pengguna memasukkan jumlah gambar untuk kolase. Jika pengguna memberikan nomor yang valid, buka kotak dialog file yang hanya memungkinkan pengguna memilih file gambar. Setelah pengguna memilih satu atau lebih gambar, buka masing-masing gambar dengan Pillow's Gambar.buka() metode.
Hubungi Ubah ukuran gambar metode dan buat yang kompatibel dengan Tkinter Gambar Foto. Tambahkan ini ke gambar_refs daftar dan hubungi perbarui_kanvas metode.
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()
Tentukan metode, Ubah ukuran gambar. Dapatkan lebar dan tinggi gambar dan hitung rasio aspeknya. Jika lebih dari satu, atur lebar baru menjadi setengah lebar kolase. Hitung ketinggian baru yang sesuai sambil mempertahankan rasio aspek.
Jika rasio aspek kurang dari satu, atur tinggi baru menjadi setengah tinggi kolase. Demikian pula, hitung lebar yang sesuai. Gunakan Bantal mengubah ukuran metode untuk mengembalikan gambar yang diubah ukurannya menggunakan parameter yang dihitung.
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))
Tentukan metode, perbarui_kanvas. Hapus semua item dan tanyakan kepada pengguna jumlah baris dan kolom yang diinginkan melalui kotak dialog file. Atur lebar dan tinggi kolase menjadi setengah dari ukuran kolase yang ditentukan. Menghapus daftar posisi gambar. Inisialisasi X Dan kamu offset ke nol, sehingga Anda dapat melacak offset posisi untuk menyusun gambar dalam baris dan kolom.
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
Ulangi gambar_refs daftar dan buat gambar di kanvas menggunakan offset yang ditentukan. Atur jangkar ke Barat Laut sehingga Anda memposisikan sudut kiri atas gambar pada koordinat yang ditentukan. Tambahkan koordinat ini ke posisi_gambar daftar.
Perbarui x_offset untuk menambahkan setengah lebar kolase, untuk mempersiapkan penempatan gambar berikutnya. Jika jumlah gambar yang ditempatkan pada baris saat ini adalah kelipatan dari jumlah kolom yang ditentukan, atur x_offset ke nol. Ini menunjukkan dimulainya baris baru. Tambahkan setengah tinggi kolase untuk mengaturnya kamu koordinat untuk baris berikutnya.
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
Membuat Kolase dan Menyimpannya
Tentukan metode, buat_kolase. Jika tidak ada gambar pada kolase, tampilkan peringatan. Kumpulkan lebar dan tinggi kolase. Buat Bantal Gambar dengan latar belakang putih. Ulangi melalui gambar-gambar daftar dan tempel setiap gambar ke latar belakang pada posisi yang ditentukan.
Simpan kolase dan tampilkan menggunakan penampil gambar default.
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()
Buat sebuah instance dari Tkinter dan Aplikasi Kolase Gambar kelas. Itu loop utama() fungsi memberitahu Python untuk menjalankan loop acara Tkinter dan mendengarkan acara sampai Anda menutup jendela.
if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()
Menguji Berbagai Fitur Pembuat Kolase Gambar
Saat menjalankan program, sebuah jendela muncul dengan dua tombol, Menambahkan gambar, Dan Buat Kolase. Saat mengklik Menambahkan gambar tombol, kotak dialog menanyakan jumlah gambar yang akan dibuat kolase. Saat memasukkan jumlah gambar sebanyak lima dan memilihnya, kotak dialog lain muncul. Ia menanyakan jumlah baris diikuti dengan jumlah kolom.
Saat memasukkan dua baris dan tiga kolom, jendela mengatur gambar dalam struktur grid.
Pratinjau memberikan kemampuan untuk menyeret gambar sesuai keinginan. Saat mengklik Buat Kolase tombol, program akan menyimpan gambar.
Saat melihat gambar, Anda dapat mengonfirmasi bahwa program berhasil membuat kolase.
Meningkatkan Fungsi Pembuat Kolase Gambar
Daripada format tabel, Anda dapat menyediakan templat default yang berbeda untuk dipilih pengguna. Menambahkan fitur untuk mengubah warna latar belakang, menambahkan teks, menerapkan filter pada gambar, dan menyisipkan stiker dari internet.
Sambil menambahkan fitur ini, permudah pengeditan kolase dengan opsi untuk membatalkan atau mengulang. Biarkan pengguna memotong, mengubah ukuran, dan membalik gambar sesuai keinginannya. Anda juga harus menambahkan opsi untuk menyimpan gambar dalam format yang diinginkan.