Herkese selamlar,
Sitelere onlarca resim yüklerken boyutları tek tek küçültmek büyük zaman kaybı. Kendi kullandığım, görüntü kalitesini gözle görülür şekilde bozmadan resimlerin dosya boyutunu %50-%80 oranında düşüren Python botunu sizlerle paylaşıyorum.
Nasıl Kullanılır? (Çok Basit)
  1. Bilgisayarınızda Python kurulu olmalı. CMD'yi (Terminal) açıp şu komutla kütüphaneyi kurun pip install Pillow
  2. Aşağıda paylaştığım Python kodunu bilgisayarınıza bot.py olarak kaydedin ve ilk kez çalıştırın.
  3. Çalıştırdığınızda kodun olduğu yere otomatik olarak ornek_klasor ve optimize_edilmis_resimler adında iki adet klasör açılacak.
  4. Boyutunu küçültmek istediğiniz tüm resimleri ornek_klasor içine atın.
  5. Botu tekrar çalıştırın. İşlem bu kadar! Bot saniyeler içinde tüm resimleri kalitesini koruyarak daraltıp optimize_edilmis_resimler klasörüne atacaktır. Orijinal resimlerinize kesinlikle dokunmaz.


    İyi çalışmalar dilerim, takıldığınız bir yer olursa konu altından sorabilirsiniz!

    import os
    from pathlib import Path
    from PIL import Image
    import concurrent.futures
    
    def compress_image(input_path: Path, output_path: Path, quality: int = 85) -> bool:
        """
        Görselin kalitesini koruyarak boyutunu küçültür ve yeni hedefe kaydeder.
        """
        try:
            with Image.open(input_path) as img:
                # Şeffaflık içeren (PNG) veya palet tabanlı (P) görselleri JPG uyumlu hale getirmek için RGB'ye çevir
                if img.mode in ("RGBA", "P"):
                    img = img.convert("RGB")
                
                # optimize=True parametresi, kaliteyi düşürmeden dosya boyutunu algoritmik olarak küçültür
                img.save(output_path, format="JPEG", quality=quality, optimize=True)
            return True
        except Exception as e:
            print(f"[HATA] {input_path.name} işlenirken bir sorun oluştu: {e}")
            return False
    
    def batch_compress_images(input_dir: str, output_dir: str, quality: int = 85):
        """
        Belirtilen klasördeki tüm görselleri asenkron olarak işler ve çıktı klasörüne aktarır.
        """
        input_path = Path(input_dir)
        output_path = Path(output_dir)
    
        # Çıktı klasörünü oluştur (varsa hata verme)
        output_path.mkdir(parents=True, exist_ok=True)
    
        # İşlenecek hedef dosya uzantıları
        valid_extensions = {".jpg", ".jpeg", ".png", ".webp", ".bmp"}
        
        # Klasördeki görselleri topla
        image_files = [f for f in input_path.iterdir() if f.is_file() and f.suffix.lower() in valid_extensions]
        
        if not image_files:
            print(f"[BİLGİ] '{input_dir}' klasöründe işlenecek uygun görsel bulunamadı.")
            return
    
        print(f"[BAŞLIYOR] Toplam {len(image_files)} görsel bulundu. Çoklu iş parçacığı ile işlem başlatılıyor...")
    
        success_count = 0
        
        # ThreadPoolExecutor ile işlemleri paralel olarak yürüterek CPU ve I/O bekleme sürelerini minimize ediyoruz
        with concurrent.futures.ThreadPoolExecutor() as executor:
            futures = {}
            for img_file in image_files:
                # Çıktı dosya adını belirle (Örn: resim_min.jpg)
                out_file = output_path / f"{img_file.stem}_min.jpg"
                
                # İşlemi havuza gönder
                futures[executor.submit(compress_image, img_file, out_file, quality)] = img_file
    
            # İşlemlerin tamamlanmasını takip et
            for future in concurrent.futures.as_completed(futures):
                if future.result():
                    success_count += 1
    
        print("-" * 50)
        print(f"[TAMAMLANDI] {success_count} / {len(image_files)} görsel başarıyla optimize edildi.")
        print(f"[KONUM] Çıktı klasörü: {output_path.absolute()}")
    
    if __name__ == "__main__":
        # --- YAPILANDIRMA ---
        INPUT_FOLDER = "ornek_klasor"             # Okunacak klasörün adı
        OUTPUT_FOLDER = "optimize_edilmis_resimler" # Oluşturulacak yeni klasörün adı
        COMPRESSION_QUALITY = 85                  # 85 kalitesi, gözle görülür kayıp olmadan en iyi optimizasyonu sağlar
        
        # Eğer input klasörü yoksa test amaçlı oluştur (hata almamak için)
        Path(INPUT_FOLDER).mkdir(exist_ok=True)
        
        batch_compress_images(INPUT_FOLDER, OUTPUT_FOLDER, quality=COMPRESSION_QUALITY)