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)
- Bilgisayarınızda Python kurulu olmalı. CMD'yi (Terminal) açıp şu komutla kütüphaneyi kurun pip install Pillow
- Aşağıda paylaştığım Python kodunu bilgisayarınıza bot.py olarak kaydedin ve ilk kez çalıştırın.
- Ç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.
- Boyutunu küçültmek istediğiniz tüm resimleri ornek_klasor içine atın.
- 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)