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)- 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)