Gereksinimler ve Ön Hazırlık
Python ile resim işleme süreçlerine başlamadan önce geliştirme ortamınızı yapılandırmanız gerekir. 2026 yılı standartlarına göre, en güncel Python sürümünü kullanmanızı öneririm. Projemizde "Pillow" kütüphanesini kullanacağız; bu kütüphane, Python Görüntüleme Kütüphanesi'nin (PIL) güncel ve aktif olarak desteklenen halidir.
Öncelikle terminal veya komut istemcinizi açarak aşağıdaki komutla kütüphaneyi yükleyin:
pip install Pillow
Bu komut, sisteminize Pillow paketini indirir ve kurar. Kurulumun başarılı olup olmadığını anlamak için Python interaktif kabuğunda import PIL komutunu çalıştırabilirsiniz. Eğer hata almıyorsanız, ortamınız hazırdır.
Pillow Kütüphanesi ile Tek Bir Resmi Boyutlandırma
Bir resmi boyutlandırmanın ilk adımı, dosyayı Python belleğine yüklemek ve resize() metodunu kullanmaktır. Bu metod, yeni boyutları bir demet (tuple) olarak bekler. Aşağıdaki örnekte, bir resmi 800x600 piksel boyutuna nasıl getireceğinizi görebilirsiniz.
from PIL import Image
# Resmi açma
resim = Image.open("ornek_resim.jpg")
# Yeni boyutları belirleme (genişlik, yükseklik)
yeni_boyut = (800, 600)
# Yeniden boyutlandırma işlemi
boyutlandirilmis_resim = resim.resize(yeni_boyut)
# Kaydetme
boyutlandirilmis_resim.save("yeni_resim.jpg")
Burada dikkat etmeniz gereken nokta, resize() fonksiyonunun orijinal resmi değiştirmediği, yeni bir nesne oluşturduğudur. Bu nedenle save() metodunu kullanarak sonucu diske yazmanız zorunludur.
En Boy Oranını Koruyarak Boyutlandırma
Resimleri doğrudan verilen değerlere zorlamak, görüntünün bozulmasına (esnemesine) neden olabilir. Profesyonel bir betikte, en boy oranını (aspect ratio) korumak esastır. Bunun için thumbnail() metodunu kullanmak veya matematiksel hesaplama yapmak en sağlıklı yoldur.
from PIL import Image
resim = Image.open("ornek_resim.jpg")
# En boy oranını koruyarak maksimum 800 piksel genişlikte yeniden boyutlandırma
resim.thumbnail((800, 800))
resim.save("oranli_resim.jpg")
thumbnail() metodu, görüntüyü belirttiğiniz sınırların içine sığacak şekilde küçültür ancak asla büyütmez. Bu, görüntü kalitesini korumak için tercih edilen bir yöntemdir.
Klasördeki Tüm Resimleri Toplu İşleme
Gerçek dünya senaryolarında genellikle tek bir resimle değil, yüzlerce resimle çalışırsınız. os kütüphanesini kullanarak bir klasördeki tüm dosyaları tarayabilir ve her birini otomatik olarak boyutlandırabilirsiniz.
import os
from PIL import Image
klasor_yolu = "./resimler"
cikti_klasoru = "./cikti"
if not os.path.exists(cikti_klasoru):
os.makedirs(cikti_klasoru)
for dosya_adi in os.listdir(klasor_yolu):
if dosya_adi.endswith((".jpg", ".png", ".jpeg")):
yol = os.path.join(klasor_yolu, dosya_adi)
img = Image.open(yol)
img.thumbnail((500, 500))
img.save(os.path.join(cikti_klasoru, dosya_adi))
print(f"{dosya_adi} başarıyla işlendi.")
Bu betik, os.listdir() ile klasörü tarar, dosya uzantılarını kontrol eder ve işlenen dosyaları ayrı bir klasöre kaydeder. Hata yönetimi için try-except blokları eklemek, bozuk dosyaların betiği durdurmasını engeller.
Resim Boyutlandırma Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Resize() | Tam kontrol sağlar, istenen boyuta zorlar. | En boy oranı bozulabilir. |
| Thumbnail() | Oranı korur, görüntü bozulmaz. | Görüntüyü büyütemez. |
| ImageOps.fit() | Belirli bir alana tam oturtur (kırpar). | Görüntünün kenarlarından kayıp olabilir. |
Gelişmiş Teknik: Kalite Ayarları ve Format Dönüşümü
Boyutlandırma yaparken dosya boyutunu da optimize etmek isteyebilirsiniz. save() metodu içerisindeki quality parametresi, JPEG dosyaları için sıkıştırma oranını belirlemenizi sağlar.
from PIL import Image
resim = Image.open("yuksek_boyutlu.jpg")
resim = resim.resize((1024, 768), Image.Resampling.LANCZOS)
# Kaliteyi %85'e düşürerek kaydetme
resim.save("optimized_resim.jpg", quality=85, optimize=True)
Image.Resampling.LANCZOS parametresi, yeniden boyutlandırma sırasında oluşabilecek piksellenmeyi (aliasing) en aza indiren yüksek kaliteli bir filtreleme yöntemidir. 2026 standartlarında bu filtreyi kullanmak en iyi görsel sonucu verir.
Güvenlik Uyarısı: Kullanıcıdan gelen dosyaları işlerken her zaman dosya uzantısı kontrolü yapın. Rastgele dosya yüklemelerine karşı, dosya içeriğinin gerçekten bir resim olup olmadığını
Image.open()sonrasıverify()metodu ile kontrol etmeniz, sunucu güvenliğiniz açısından kritik öneme sahiptir.
Sorumluluk Reddi: Bu rehberdeki kodlar eğitim amaçlıdır. Üretim ortamında (production) büyük ölçekli resim işleme süreçlerinde, sunucu kaynaklarını tüketmemek için asenkron görev kuyrukları (Celery gibi) kullanılması önerilir.
Sıkça Sorulan Sorular
Python ile resim boyutlandırmak neden yavaştır?
Resim işleme CPU yoğun bir işlemdir. Eğer binlerce resmi aynı anda işliyorsanız, çoklu işlem (multiprocessing) kütüphanesini kullanarak işlemi çekirdeklere dağıtabilirsiniz.
PNG şeffaflığı boyutlandırma sırasında kaybolur mu?
Hayır, Pillow kütüphanesi RGBA modunu destekler. Ancak, JPEG formatına dönüştürürseniz şeffaflık siyah bir arka plana dönüşür. Şeffaflığı korumak için her zaman PNG olarak kaydedin.
Hangi yeniden örnekleme (resampling) filtresini seçmeliyim?
Küçültme işlemleri için LANCZOS veya BICUBIC filtreleri en keskin ve kaliteli sonuçları verir. NEAREST filtresi ise çok hızlıdır ancak görüntü kalitesi düşüktür.
Betiğim neden "OSError: cannot identify image file" hatası veriyor?
Bu hata, Pillow'un dosya formatını tanıyamadığı veya dosyanın bozuk olduğu anlamına gelir. Dosya yolunun doğruluğunu ve dosyanın gerçekten bir resim dosyası olup olmadığını kontrol edin.
Resim boyutlarını nasıl öğrenebilirim?
resim.size özelliği size (genişlik, yükseklik) şeklinde bir demet döndürür. Bu değeri kullanarak koşullu boyutlandırma yapabilirsiniz.
Hata Yönetimi ve Loglama Mekanizmaları
Büyük ölçekli resim işleme projelerinde, binlerce dosya arasında tek bir bozuk dosyanın tüm betiği durdurması istenmeyen bir durumdur. Bu nedenle, try-except blokları kullanarak hata yönetimini otomatikleştirmek profesyonel bir yaklaşımdır. Ayrıca, hangi dosyaların işlendiğini ve hangilerinde hata alındığını takip etmek için Python'un yerleşik logging modülünü kullanmalısınız.
import logging
from PIL import Image
import os
logging.basicConfig(filename='resim_isleme.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def guvenli_boyutlandir(dosya_yolu, hedef_klasor, boyut):
try:
with Image.open(dosya_yolu) as img:
img = img.resize(boyut)
kayit_yolu = os.path.join(hedef_klasor, os.path.basename(dosya_yolu))
img.save(kayit_yolu)
logging.info(f"Başarılı: {dosya_yolu}")
except Exception as e:
logging.error(f"Hata oluştu: {dosya_yolu} - {str(e)}")
# Kullanım örneği
guvenli_boyutlandir("resim.jpg", "cikti", (800, 600))
Performans Optimizasyonu: Çoklu İşlem (Multiprocessing)
Python'un Global Interpreter Lock (GIL) yapısı, CPU yoğunluklu işlemlerde tek çekirdek performansına takılmanıza neden olabilir. Resim boyutlandırma işlemi yoğun bir CPU aktivitesi gerektirdiğinden, multiprocessing modülü ile işlemi tüm çekirdeklere dağıtarak süreyi ciddi oranda kısaltabilirsiniz.
Aşağıdaki örnek, bir klasördeki tüm resimleri işlemci çekirdeklerini paralel kullanarak nasıl işleyeceğinizi gösterir:
import multiprocessing
from PIL import Image
import os
def islemci_gorevi(dosya_adi):
# İşleme mantığı buraya gelir
img = Image.open(f"girdi/{dosya_adi}")
img = img.resize((500, 500))
img.save(f"cikti/{dosya_adi}")
if __name__ == '__main__':
dosyalar = [f for f in os.listdir("girdi") if f.endswith('.jpg')]
# İşlemci çekirdek sayısı kadar havuz oluştur
with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
pool.map(islemci_gorevi, dosyalar)
print("Tüm resimler paralel olarak işlendi.")
İleri İpucu: Bellek Yönetimi
Çok yüksek çözünürlüklü (örneğin 40MP ve üzeri) resimlerle çalışırken, Pillow varsayılan olarak tüm resmi belleğe yükler. Bu durum MemoryError hatalarına yol açabilir. Bu tür durumlarda Image.draft() metodunu kullanarak resmi belleğe yüklemeden önce düşük çözünürlüklü bir önizlemesini alabilir veya ImageFile.LOAD_TRUNCATED_IMAGES = True ayarıyla bozuk dosya okumalarını yönetebilirsiniz.
| Yöntem | Avantajı | Kullanım Alanı |
|---|---|---|
| Multiprocessing | Hız artışı | Yüzlerce resim işleme |
| Logging | İzlenebilirlik | Otomatik sunucu görevleri |
| Drafting | Düşük RAM kullanımı | Büyük boyutlu RAW dosyaları |
Sonuç
Python ile resim boyutlandırma betiği hazırlamak, Pillow kütüphanesi sayesinde oldukça pratik ve güçlüdür. Bu makalede temel boyutlandırma tekniklerinden, en boy oranını korumaya ve toplu işlem yapmaya kadar birçok konuyu ele aldık. Bir sonraki adım olarak, bu betiği bir web arayüzüne (Flask veya FastAPI kullanarak) entegre ederek kendi resim düzenleme servisinizi oluşturmayı deneyebilirsiniz. Başarılar dilerim.


Yorumlar (0)
Yorum Yaz