Gereksinimler ve Ortam Kurulumu
Pillow kütüphanesi, Python ekosisteminde görüntü işleme için standart kabul edilir. İşleme başlamadan önce sisteminizde Python 3.10 veya daha yeni bir sürümün yüklü olduğundan emin olmalısınız. Pillow kütüphanesini kurmak için terminal veya komut satırı üzerinden pip paket yöneticisini kullanacağız.
# Pillow kütüphanesini projeye dahil etmek için terminale yazın:
pip install Pillow
Kurulum tamamlandıktan sonra, kütüphanenin doğru çalışıp çalışmadığını kontrol etmek için bir test betiği oluşturabilirsiniz. Bu adım, Python ortamınızın kütüphaneyi başarıyla tanıdığını doğrular.
from PIL import Image
print(f"Pillow sürümü: {Image.__version__}")
Adım Adım Metin Tabanlı Filigran Ekleme
Metin tabanlı filigranlar, görsellerin üzerine telif hakkı bilgisi veya web sitesi adresi eklemek için en basit yöntemdir. Pillow'un ImageDraw modülü, resim üzerinde çizim yapmamıza ve metin yerleştirmemize olanak tanır.
from PIL import Image, ImageDraw, ImageFont
def metin_filigran_ekle(resim_yolu, cikis_yolu, metin):
resim = Image.open(resim_yolu).convert("RGBA")
txt = Image.new("RGBA", resim.size, (255, 255, 255, 0))
# Yazı tipi ve boyut ayarı
font = ImageFont.truetype("arial.ttf", 40)
draw = ImageDraw.Draw(txt)
# Metni sağ alt köşeye yerleştirme
genislik, yukseklik = resim.size
draw.text((genislik - 200, yukseklik - 50), metin, fill=(255, 255, 255, 128), font=font)
birlesik = Image.alpha_composite(resim, txt)
birlesik.convert("RGB").save(cikis_yolu)
metin_filigran_ekle("ornek.jpg", "sonuc_metin.jpg", "© 2026 YazilimEgitim")
Yukarıdaki kod bloğunda, RGBA modunu kullanarak metnin şeffaflık (alpha) değerini ayarladık. fill=(255, 255, 255, 128) parametresindeki 128 değeri, filigranın yarı saydam görünmesini sağlar.
Resim (Logo) Tabanlı Filigran Yerleştirme
Marka logoları, metinlere göre daha profesyonel bir görünüm sunar. Logo tabanlı filigran eklerken, logonun ana görselin boyutlarına oranla yeniden boyutlandırılması veya konumlandırılması gerekebilir.
def logo_filigran_ekle(ana_resim_yolu, logo_yolu, cikis_yolu):
ana_resim = Image.open(ana_resim_yolu)
logo = Image.open(logo_yolu).convert("RGBA")
# Logoyu küçültme
logo.thumbnail((100, 100))
# Konum belirleme
konum = (ana_resim.width - logo.width - 10, ana_resim.height - logo.height - 10)
ana_resim.paste(logo, konum, logo)
ana_resim.save(cikis_yolu)
logo_filigran_ekle("arkaplan.jpg", "logo.png", "sonuc_logo.jpg")
Bu yöntem, paste fonksiyonunun üçüncü parametresini (maske) kullanarak logonun şeffaf arka planını korumasını sağlar. thumbnail metodu ise logonun en boy oranını bozmadan boyutlandırılmasını garanti eder.
Gelişmiş Teknikler: Filigran Döndürme ve Konumlandırma
Bazen filigranın görselin ortasında veya çapraz bir şekilde durması istenebilir. Pillow'da metni döndürmek için rotate fonksiyonu kullanılır. Ancak, metni döndürmeden önce onu ayrı bir resim katmanı olarak oluşturmak en sağlıklı yöntemdir.
def egik_metin_filigran(resim_yolu, metin):
resim = Image.open(resim_yolu).convert("RGBA")
txt_layer = Image.new("RGBA", resim.size, (255, 255, 255, 0))
draw = ImageDraw.Draw(txt_layer)
# Metni yaz ve döndür
draw.text((100, 300), metin, fill=(255, 255, 255, 50))
txt_layer = txt_layer.rotate(45)
birlesik = Image.alpha_composite(resim, txt_layer)
birlesik.convert("RGB").save("egik_filigran.jpg")
Bu teknik, özellikle telif hakkı içeren görsellerin kolayca kırpılmasını engellemek için yaygın olarak kullanılır. Döndürme açısını ihtiyacınıza göre değiştirebilirsiniz.
Filigran Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Metin Filigran | Hızlı ve dinamik | Görsel karmaşada kaybolabilir |
| Logo Filigran | Marka bilinirliği yüksek | Ek dosya (logo.png) gerektirir |
| Döndürülmüş Metin | Kırpılması zor | Görsel estetiği bozabilir |
Kritik Güvenlik Uyarısı: Kullanıcı tarafından yüklenen resimleri işlerken her zaman dosya uzantısını ve türünü kontrol edin. Rastgele dosya yükleme (Unrestricted File Upload) açıklarına karşı, Pillow ile işlediğiniz dosyaların gerçek görsel formatında olduğundan emin olun ve dosya isimlerini sunucuda yeniden adlandırarak kaydedin.
Yaygın Hatalar ve Debug İpuçları
Pillow ile çalışırken en sık karşılaşılan hata OSError: cannot open resource hatasıdır. Bu genellikle yazı tipi dosyasının (font) belirtilen yolda bulunamamasından kaynaklanır. Yazı tipi yollarını mutlak (absolute) olarak belirtmek veya sistem font dizinini kullanmak bu sorunu çözer.
# Hata giderme için font yolu kontrolü
import os
font_yolu = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"
if not os.path.exists(font_yolu):
print("Font bulunamadı, varsayılan fonta dönülüyor.")
Bir diğer yaygın hata ise RGBA modundan RGB moduna geçerken oluşan siyah arka plan sorunudur. Bu, şeffaflık bilgisinin kaybolmasından kaynaklanır; her zaman alpha_composite kullanarak bu durumu yönetin.
Sıkça Sorulan Sorular
Pillow kütüphanesi ile çok sayıda resme aynı anda filigran ekleyebilir miyim?
Evet, bir klasördeki tüm resimleri os.listdir() ile listeleyip, bir döngü içerisinde yukarıdaki fonksiyonları çağırarak toplu işlem gerçekleştirebilirsiniz.
Filigranın şeffaflığını nasıl daha hassas ayarlayabilirim?
Metin veya logo katmanının RGBA değerindeki 'A' (Alpha) kanalını 0 ile 255 arasında değiştirerek şeffaflığı kontrol edebilirsiniz.
Pillow, HEIC gibi modern formatları destekliyor mu?
Pillow'un temel sürümü bazı modern formatlarda sınırlı olabilir. Bu durumda pillow-heif gibi ek kütüphaneler ile entegrasyon sağlamanız gerekebilir.
Filigranın resim boyutuna göre otomatik büyümesini nasıl sağlarım?
Resmin genişliğini resim.width ile alıp, filigran boyutunu bu değere oranlayarak (örneğin genişliğin %10'u kadar) dinamik bir ölçeklendirme yapabilirsiniz.
Sunucu ortamında performans sorunu yaşar mıyım?
Pillow oldukça hızlıdır ancak çok büyük resimlerde bellek yönetimi önemlidir. İşlem bittikten sonra resim.close() metodunu kullanarak kaynakları serbest bırakmayı unutmayın.
Otomatik Toplu İşleme İçin Klasör İzleme (Watchdog Entegrasyonu)
Pillow ile yüzlerce resmi tek tek işlemek yerine, bir klasörü sürekli izleyen ve yeni eklenen her resmi otomatik olarak filigranlayan bir "izleme servisi" oluşturabilirsiniz. Bunun için watchdog kütüphanesini Pillow ile birleştirmek en verimli yöntemdir.
Bu yöntem, özellikle bir sunucuya yüklenen görsellerin anında işlenmesi gereken senaryolarda hayat kurtarıcıdır.
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from PIL import Image
class WatermarkHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory and event.src_path.endswith(('.jpg', '.png')):
print(f"Yeni dosya algılandı: {event.src_path}")
apply_watermark(event.src_path)
def apply_watermark(image_path):
# Basit bir filigran uygulama fonksiyonu
base_image = Image.open(image_path)
watermark = Image.open("logo.png").resize((100, 100))
base_image.paste(watermark, (0, 0), watermark)
base_image.save(f"watermarked_{image_path.split('/')[-1]}")
observer = Observer()
observer.schedule(WatermarkHandler(), path='./girdiler', recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
Performans Optimizasyonu: Büyük Ölçekli Görsel İşleme
Pillow, CPU tabanlı bir kütüphanedir. Eğer binlerce yüksek çözünürlüklü görseli aynı anda işliyorsanız, sistem kaynaklarınızın tükendiğini görebilirsiniz. Performansı artırmak için şu stratejileri uygulayın:
- Thumbnail Kullanımı: Filigranı orijinal resmin tam boyutunda değil, önbelleğe alınmış küçük bir versiyonunda test edin.
- Multiprocessing: Python'un
multiprocessingmodülünü kullanarak, işlemci çekirdeklerinizi paralel çalıştırın. Her çekirdek farklı bir görseli işleyebilir. - Lazy Loading: Görselleri sadece işleneceği an belleğe yükleyin, işlem bittikten sonra
image.close()metodunu kullanarak bellekten atın.
Aşağıdaki örnek, multiprocessing kullanarak işlem süresini nasıl kısaltabileceğinizi gösterir:
from multiprocessing import Pool
import os
def process_image(filename):
# İşleme mantığınız buraya gelecek
print(f"İşleniyor: {filename}")
files = [f for f in os.listdir('./gorseller') if f.endswith('.jpg')]
if __name__ == '__main__':
with Pool(processes=4) as pool:
pool.map(process_image, files)
Görsel Kalitesini Korumak İçin İleri İpuçları
Filigran ekleme işlemi sırasında resmin kalitesini korumak için quality parametresini doğru yönetmek gerekir. Özellikle JPEG formatında, her kaydetme işlemi bir miktar veri kaybına neden olur.
| Parametre | Açıklama | Önerilen Değer |
|---|---|---|
| quality | Çıktı resminin sıkıştırma kalitesi | 85 - 95 |
| optimize | Dosya boyutunu küçültmek için ek tarama yapar | True |
| subsampling | Renk örneklemesi (0 en yüksek kalite) | 0 |
Örnek bir kaydetme komutu:
image.save("cikti.jpg", "JPEG", quality=95, optimize=True, subsampling=0)
Sonuç
Python ile Pillow kullanarak resimlere filigran eklemek, hem basit hem de oldukça esnek bir süreçtir. Bu rehberde öğrendiğiniz metin ve logo tabanlı yöntemleri, kendi projelerinizde ihtiyaçlarınıza göre özelleştirebilirsiniz. Unutmayın ki, filigranın amacı içeriğinizi korumak kadar, markanızın kimliğini de yansıtmaktır. Bir sonraki adım olarak, bu işlemi bir web API (örneğin FastAPI ile) haline getirerek, kullanıcıların kendi görsellerini yükleyip filigranlı hallerini indirebilecekleri bir servis geliştirmeyi deneyebilirsiniz.
Yasal Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Yazılım güvenliği ve telif hakları konusunda yerel yasalara uymak kullanıcının sorumluluğundadır. Başkasına ait görselleri izinsiz kullanmak veya filigranlarını kaldırmak yasal yaptırımlara tabidir.


Yorumlar (0)
Yorum Yaz