Python İle Basit Bir Resim Boyutlandırma Betiği Nasıl Yapılır?

Python İle Basit Bir Resim Boyutlandırma Betiği Nasıl Yapılır?
Python İle Basit Bir Resim Boyutlandırma Betiği Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Python ile resim işleme süreçlerini gerçekleştirmek için sektör standardı haline gelmiş olan Pillow (PIL Fork) kütüphanesini kullanacağız. Pillow, resim dosyalarını açma, manipüle etme ve kaydetme işlemlerini en hızlı ve güvenli şekilde yapmanıza olanak tanır.

Kurulumu yapmak için terminal veya komut satırınızı açıp şu komutu çalıştırmanız yeterlidir:

pip install Pillow

Bu komut, sisteminize Pillow kütüphanesini yükler. 2026 yılı itibarıyla Python 3.10 ve üzeri sürümlerin kullanılması, modern tip belirteçleri (type hinting) ve performans iyileştirmelerinden faydalanmanızı sağlar. Çalışma ortamınızda sanal bir ortam (virtual environment) kullanmanız, paket çakışmalarını önlemek adına en iyi uygulamadır.

Adım Adım İlk Resim Boyutlandırma Uygulaması

İlk adımda, tek bir resmi açıp belirli boyutlara getiren temel bir betik yazacağız. Bu, Pillow kütüphanesinin temel çalışma prensibini anlamanızı sağlayacaktır.

from PIL import Image

# Resmi açma
resim = Image.open("ornek_gorsel.jpg")

# Boyutlandırma (Genişlik, Yükseklik)
yeni_boyut = resim.resize((800, 600))

# Kaydetme
yeni_boyut.save("yeni_gorsel.jpg")

Yukarıdaki kod, Image.open ile resmi belleğe yükler, resize metodu ile belirtilen piksel değerlerine dönüştürür ve save ile diske yazar. Burada dikkat etmeniz gereken nokta, orijinal dosyanın üzerine yazmamak için farklı bir isimle kaydetmektir.

Boyutlandırma İşlemlerinde En-Boy Oranını Korumak

Resimleri doğrudan belirli bir piksel değerine zorlamak, görüntünün basık veya yayık görünmesine neden olabilir. Profesyonel bir yaklaşım, en-boy oranını (aspect ratio) koruyarak boyutlandırma yapmaktır.

from PIL import Image

def orantili_boyutlandir(dosya_yolu, genislik):
    resim = Image.open(dosya_yolu)
    w_percent = (genislik / float(resim.size[0]))
    h_size = int((float(resim.size[1]) * float(w_percent)))
    
    yeni_resim = resim.resize((genislik, h_size), Image.Resampling.LANCZOS)
    yeni_resim.save("yeniden_boyutlandirilmis.jpg")

orantili_boyutlandir("manzara.jpg", 400)

Burada Image.Resampling.LANCZOS filtresini kullanarak yüksek kaliteli bir ölçekleme sağlıyoruz. Bu yöntem, resim küçültülürken detay kaybını minimuma indirir.

Toplu Resim İşleme ve Klasör Yönetimi

Gerçek dünya senaryolarında tek bir resim yerine bir klasördeki tüm resimleri boyutlandırmanız gerekebilir. os kütüphanesi ile klasördeki dosyaları listeleyerek bu işlemi otomatize edebiliriz.

import os
from PIL import Image

klasor = "resimler/"
hedef_klasor = "cikti/"

if not os.path.exists(hedef_klasor):
    os.makedirs(hedef_klasor)

for dosya in os.listdir(klasor):
    if dosya.endswith((".jpg", ".png")):
        img = Image.open(os.path.join(klasor, dosya))
        img = img.resize((300, 300))
        img.save(os.path.join(hedef_klasor, dosya))

Bu kod bloğu, resimler/ klasöründeki tüm .jpg ve .png uzantılı dosyaları bulur, 300x300 boyutuna getirir ve cikti/ klasörüne kaydeder. os.path.join kullanımı, farklı işletim sistemlerinde (Windows/Linux) dosya yolu hatalarını önlemek için kritik bir güvenlik ve uyumluluk pratiğidir.

Resim İşleme Yöntemlerinin Karşılaştırılması

Resim boyutlandırma süreçlerinde farklı kütüphaneler ve yöntemler farklı avantajlar sunar. Aşağıdaki tablo, yaygın yaklaşımları özetlemektedir.

Yöntem Avantajı Dezavantajı
Pillow (Resize) Kolay kullanım, hızlı sonuç Çok büyük dosyalarda RAM kullanımı
OpenCV İleri seviye bilgisayarlı görü desteği Öğrenme eğrisi daha dik
Thumbnail Metodu Otomatik en-boy oranı koruma Tam boyut kontrolü zor

Hata Yönetimi ve Güvenlik Uyarıları

Resim işleme betikleri yazarken kullanıcıdan gelen dosyaların bozuk veya zararlı içerik barındırma ihtimalini göz önünde bulundurmalısınız. Dosya uzantısı kontrolü tek başına yeterli bir güvenlik önlemi değildir.

Dikkat: Kullanıcı tarafından yüklenen resimleri işlerken mutlaka dosya türünü (MIME type) doğrulayın. Sadece dosya uzantısına güvenmek, zararlı kod içeren dosyaların sisteme sızmasına neden olabilir. Ayrıca, çok büyük resim dosyalarının belleği doldurmasını (DoS saldırısı) engellemek için dosya boyutu sınırlaması getirmeyi unutmayın.

try:
    with Image.open("yuklenen_resim.jpg") as img:
        img.verify() # Dosyanın bozuk olup olmadığını kontrol eder
except (IOError, SyntaxError) as e:
    print(f"Hatalı dosya formatı: {e}")

verify() metodu, dosyanın bir resim olup olmadığını ve bozuk olup olmadığını anlamanızı sağlar. with ifadesi ise dosyanın işlem bittiğinde otomatik olarak kapatılmasını garanti eder.

Sıkça Sorulan Sorular

Pillow kütüphanesinde neden LANCZOS filtresini kullanmalıyım?

LANCZOS, resim ölçekleme sırasında pikseller arası geçişi en iyi hesaplayan algoritmalardan biridir. Bu, resmin keskinliğini koruyarak daha kaliteli bir sonuç elde etmenizi sağlar.

Resim boyutlarını küçültmek dosya boyutunu da küçültür mü?

Evet, genellikle resim piksel boyutları azaldığında dosya boyutu da küçülür. Ancak, kaydetme aşamasında 'quality' parametresini kullanarak sıkıştırma oranını kendiniz belirleyebilirsiniz.

Python ile resimlerin üzerine yazı ekleyebilir miyim?

Evet, Pillow kütüphanesindeki ImageDraw modülünü kullanarak resimlerin üzerine filigran veya metin ekleyebilirsiniz.

Bu betik çok büyük boyutlu resimlerde hata verir mi?

Çok yüksek çözünürlüklü resimler (örneğin 50MP+) belleği zorlayabilir. Bu durumda Image.thumbnail() metodunu kullanarak resmi belleğe yüklemeden önce önizleme boyutuna getirmek daha güvenlidir.

Kodumu bir web sunucusunda nasıl çalıştırırım?

Bu betiği bir API (FastAPI veya Flask) içine entegre ederek, kullanıcıların resim yükleyip boyutlandırılmış halini indirebileceği bir servis haline getirebilirsiniz.

İleri Seviye Optimizasyon: Bellek Yönetimi ve Streaming

Büyük boyutlu resimlerle çalışırken, özellikle yüksek çözünürlüklü fotoğrafları işlemek sistem belleğinde (RAM) ciddi bir yük oluşturabilir. Pillow kütüphanesi, varsayılan olarak resmi tamamen belleğe yükler. Çok sayıda büyük dosyayı aynı anda işliyorsanız, Image.draft() metodunu kullanarak veya ImageFile.LOAD_TRUNCATED_IMAGES ayarlarını yapılandırarak bellek tüketimini optimize edebilirsiniz.

Ayrıca, dosyaları doğrudan diske yazmak yerine bir io.BytesIO nesnesi kullanarak, resmi bellekte tutabilir ve ağ üzerinden (örneğin bir API yanıtı olarak) doğrudan istemciye gönderebilirsiniz. Bu yöntem, geçici dosya oluşturma maliyetini ortadan kaldırır.

import io
from PIL import Image

def optimize_memory_usage(image_path):
    with Image.open(image_path) as img:
        # Resmi daha düşük çözünürlükte taslak olarak yükle
        img.draft("RGB", (800, 800))
        
        # Bellek üzerinde işlem yap
        buffer = io.BytesIO()
        img.save(buffer, format="JPEG", quality=85, optimize=True)
        buffer.seek(0)
        return buffer

Alternatif Kütüphane: OpenCV ile Hızlı İşleme

Pillow, genel amaçlı resim düzenleme için harikadır; ancak bilgisayarlı görü (computer vision) veya çok yüksek performans gerektiren gerçek zamanlı uygulamalar için OpenCV (cv2) daha etkili olabilir. OpenCV, C++ tabanlı olduğu için özellikle büyük matris işlemlerinde ve toplu boyutlandırmalarda Pillow'dan daha hızlı sonuç verebilir.

Aşağıdaki örnekte, OpenCV kullanarak bir resmi nasıl yeniden boyutlandırabileceğinizi görebilirsiniz:

import cv2

def resize_with_opencv(image_path, output_path, width, height):
    # Resmi oku
    image = cv2.imread(image_path)
    
    # Boyutlandır (Interpolation metodu olarak INTER_AREA küçültme için idealdir)
    resized = cv2.resize(image, (width, height), interpolation=cv2.INTER_AREA)
    
    # Kaydet
    cv2.imwrite(output_path, resized)

# Kullanım
resize_with_opencv("input.jpg", "output_cv2.jpg", 800, 600)

Performans Karşılaştırma Tablosu

Özellik Pillow (PIL) OpenCV
Kullanım Kolaylığı Çok Yüksek Orta
Hız Orta Çok Yüksek
Odak Noktası Resim Düzenleme/Web Bilgisayarlı Görü/Analiz

Projenizin ihtiyaçlarına göre, basit bir web servisi geliştiriyorsanız Pillow'un sunduğu geniş format desteği ve kullanım kolaylığı yeterli olacaktır. Ancak, binlerce resmi saniyeler içinde işlemeniz gereken bir veri hattı (pipeline) kuruyorsanız, OpenCV'nin sunduğu düşük seviyeli optimizasyonlara yönelmeniz önerilir.

Sonuç

Python ile resim boyutlandırma, otomasyon dünyasına giriş yapmak için mükemmel bir projedir. Pillow kütüphanesi ile basit bir betikten başlayarak, toplu işlem yapan ve hata yönetimi güçlü olan profesyonel bir yapıya geçiş yapabilirsiniz. Bir sonraki adım olarak, boyutlandırılan resimlerin üzerine otomatik olarak filigran ekleyen bir modül geliştirmeyi deneyebilirsiniz.

Sorumluluk Reddi: Bu rehberde paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanacağınız uygulamalarda, dosya izinleri, bellek yönetimi ve kullanıcı girişi doğrulama gibi güvenlik katmanlarını mutlaka eklemelisiniz.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve ev düzeni konularında yıllardır içerik üretiyorum. Okuyuculara zaman kazandıran, uygulanabilir ve sürdürülebilir yaşam tarzı önerileri sunuyorum.

Yorumlar (0)

Yorum Yaz