Kendiniz oluşturabileceğiniz bu basit ama kullanışlı araçla Python'da görüntü işleme hakkında her şeyi öğrenin.
Kolaj, anıları sergilemenin ve görüntü gruplarını sergilemenin güzel bir yoludur. Çevrimiçi kolaj oluşturucuların güvenlik kaygıları olabilir ve çevrimdışı uygulamalar maliyetli olabilir ve ihtiyacınız olan özelliklere sahip olmayabilir.
Kendi görsel kolaj oluşturucunuzu oluşturarak bu endişeleri ortadan kaldırabilir ve kontrolü tamamen elinizde tutabilirsiniz. Peki nasıl bir tane inşa edebilirsiniz?
Tkinter ve PIL Modülü
Bir görüntü kolaj uygulaması oluşturmak için Tkinter ve PIL modülüne ihtiyacınız vardır. Tkinter, masaüstü uygulamaları oluşturmanıza olanak tanır. Bunu kolaylaştıran çeşitli widget'lar sunar GUI'ler geliştirmek.
Python Görüntüleme Kitaplığının (PIL) bir kolu olan Yastık kitaplığı, düzenlemeye, oluşturmaya yardımcı olan görüntü işleme yetenekleri sağlar. dosya formatlarını dönüştürmeve görüntüleri kaydetme.
Tkinter ve Pillow'u kurmak için bir terminal açın ve şunu çalıştırın:
pip install tk pillow
GUI Kurulumu ve Görüntü İşleme
Bu projenin kaynak kodunu kendi içinde bulabilirsiniz. GitHub deposu.
Başlamak gerekli modüllerin içe aktarılması. Bir sınıf oluşturun, ImageCollageAppve pencerenin başlığını ve boyutlarını ayarlayın. Kullanarak bir tuval tanımlayın teşekkürler. Tuval() ve ana öğesini, genişliğini, yüksekliğini ve arka plan rengini ayarlayın.
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()
İki düğme oluşturun: Resim eklemek, Ve Kolaj Oluştur. Ana öğeyi, görüntülenecek metni, çalıştırılacak komutu ve yazı tipi stillerini tanımlayın. Uygun dolgu ekleyerek düğmeleri düzenleyin. Başlat drag_data sürükleme işlemiyle ilgili bilgileri depolamak için.
Başlat resim_pozisyonları görüntülerin konumlarını tuval üzerinde saklamak için. Görüntülerin seçilmesine, sürüklenmesine ve serbest bırakılmasına yanıt verecek üç olay işleyicisi tanımlayın.
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)
Bir yöntem tanımlayın, on_press. Kullanıcının fareyi tıklattığı yerden en yakın tuval öğesini alın ve onu öğe anahtarı drag_data sözlük. Fare tıklamasının x ve y koordinatlarını saklayın. Bunu, sürükleme sırasında kullanıcının fareyi hareket ettirdiği mesafeyi hesaplamak için kullanacaksınız.
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
Bir yöntem tanımlayın, on_drag. Kullanıcının sürükleme sırasında fareyi hareket ettirdiği yatay ve dikey mesafeyi hesaplayın ve görüntünün konumunu buna göre güncelleyin. Görüntünün güncellenmiş koordinatlarını şuraya kaydedin: X Ve sen anahtarları drag_data sözlük.
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
Bir yöntem tanımlayın, on_release. Kullanıcının sürüklediği görüntünün referansını koordinatlarıyla birlikte temizleyin. Ara update_image_positions Kullanıcı tuvali sürükleyip bıraktıktan sonra tuval üzerindeki tüm görsellerin konumlarını güncellemek için.
defon_release(self, event):
self.drag_data["item"] = None
self.drag_data["x"] = 0
self.drag_data["y"] = 0
self.update_image_positions()
Bir yöntem tanımlayın, update_image_positions. Temizle resim_pozisyonları tüm tuval öğelerini listeleyin ve yineleyin. Her öğe için koordinatları bulun ve listeye ekleyin.
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))
Bir yöntem tanımlayın, Görsel ekle. Kullanıcının kolaj için resim sayısını girmesini isteyen bir iletişim kutusu oluşturun. Kullanıcı geçerli bir numara sağladıysa kullanıcının yalnızca görüntü dosyalarını seçmesine izin veren bir dosya iletişim kutusu açın. Kullanıcı bir veya daha fazla görsel seçtikten sonra her birini Pillow'un tuşuyla açın. Resim.open() yöntem.
Ara görüntüyü yeniden boyutlandırmak yöntemini kullanın ve Tkinter uyumlu bir yöntem oluşturun FotoğrafResim. Bunu ekle resim_refleri listeleyin ve arayın update_canvas yöntem.
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()
Bir yöntem tanımlayın, görüntüyü yeniden boyutlandırmak. Görüntünün genişliğini ve yüksekliğini alın ve en boy oranını hesaplayın. Birden fazlaysa yeni genişliği kolaj genişliğinin yarısı olacak şekilde ayarlayın. En boy oranını korurken karşılık gelen yeni yüksekliği hesaplayın.
En boy oranı birden azsa yeni yüksekliği kolajın yüksekliğinin yarısı olacak şekilde ayarlayın. Benzer şekilde karşılık gelen genişliği hesaplayın. Yastık Kullan yeniden boyutlandır Hesaplanan parametreleri kullanarak yeniden boyutlandırılmış bir görüntüyü döndürme yöntemi.
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))
Bir yöntem tanımlayın, update_canvas. Tüm öğeleri temizleyin ve bir dosya iletişim kutusu aracılığıyla kullanıcıdan istenen sayıda satır ve sütunu isteyin. Kolajın genişliğini ve yüksekliğini belirtilen kolaj boyutunun yarısını alacak şekilde ayarlayın. Görüntü konumlarının listesini temizler. Başlat X Ve sen sıfıra göre uzaklık, böylece görüntüleri satırlar ve sütunlar halinde düzenlemek için konum uzaklıklarını takip edebilirsiniz.
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
Üzerinde yineleyin resim_refleri belirtilen ofseti kullanarak tuval üzerinde bir görüntü listeleyin ve oluşturun. Görüntünün sol üst köşesini belirtilen koordinatlara konumlandırmak için bağlantı noktasını Kuzeybatı'ya ayarlayın. Bu koordinatları şuraya ekleyin: resim_pozisyonları liste.
Güncelleme x_offset sonraki görseli yerleştirmeye hazırlanmak için kolaj genişliğinin yarısını ekleyin. Geçerli satıra yerleştirilen görsellerin sayısı belirtilen sütun sayısının katıysa, x_offset sıfıra. Bu, yeni bir satırın başladığını gösterir. Ayarlamak için kolajın yüksekliğinin yarısını ekleyin. sen bir sonraki satırın koordinatlarını belirleyin.
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
Kolaj Oluşturma ve Kaydetme
Bir yöntem tanımlayın, create_collage. Kolajda resim yoksa bir uyarı görüntüleyin. Kolajın genişliğini ve yüksekliğini toplayın. Bir Yastık Yaratın Resim beyaz bir arka plana sahip. Yineleyin Görüntüler her resmi listeleyin ve belirtilen konumlardaki arka plana yapıştırın.
Kolajı kaydedin ve varsayılan resim görüntüleyiciyi kullanarak görüntüleyin.
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'ın bir örneğini oluşturun ve ImageCollage Uygulaması sınıf. Ana döngü() işlevi Python'a Tkinter olay döngüsünü çalıştırmasını ve siz pencereyi kapatana kadar olayları dinlemesini söyler.
if __name__ == "__main__":
root = tk.Tk()
app = ImageCollageApp(root)
root.mainloop()
Resim Kolajlayıcının Farklı Özelliklerini Test Etme
Programı çalıştırdığınızda iki düğmeli bir pencere açılır; Resim eklemek, Ve Kolaj Oluştur. Tıklandığında Resim eklemek düğmesinde, bir iletişim kutusu kolajlanacak görsellerin sayısını sorar. Görüntü sayısı beş olarak girilip seçildiğinde başka bir iletişim kutusu görüntülenir. Satır sayısını ve ardından sütun sayısını sorar.
İki satır ve üç sütun girildiğinde pencere, görüntüleri ızgara yapısında düzenler.
Önizleme, görüntüleri isteğe göre sürükleme olanağı sağlar. Tıklandığında Kolaj Oluştur düğmesine bastığınızda program görüntüyü kaydeder.
Resmi görüntülediğinizde programın kolajı başarıyla oluşturduğunu doğrulayabilirsiniz.
Görüntü Kolajlayıcının İşlevselliğini Artırma
Tablo formatı yerine kullanıcının seçebileceği farklı varsayılan şablonlar sağlayabilirsiniz. Arka plan rengini değiştirme, metin ekleme, resimlere filtre uygulama ve internetten çıkartma ekleme gibi özellikler ekleyin.
Bu özellikleri eklerken, geri alma veya yineleme seçeneğiyle kolajı düzenlemeyi kolaylaştırın. Kullanıcının görüntüleri beğenisine göre kırpmasına, yeniden boyutlandırmasına ve çevirmesine izin verin. Ayrıca görüntüyü istediğiniz formatta kaydetmek için bir seçenek de eklemelisiniz.