FA-TOOLS — Header Component
تغییر اندازه همزمان و گروهی تصاویر مختلف با استفاده از برنامه‌نویسی پایتون

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون

خلاصه کاربردی: در این راهنما، ۳ کد آماده و کاملاً تست‌شده پایتون برای تغییر سایز خودکار صدها تصویر به طور همزمان را دریافت می‌کنید. یاد می‌گیرید که چگونه ابعاد تصاویر را بدون دفرمه شدن (حفظ نسبت تصویر) و با سرعت بالا تغییر دهید تا زمان خود را برای کارهای تکراری هدر ندهید.

چرا پایتون بهترین ابزار برای تغییر اندازه دسته‌جمعی تصاویر است؟

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون — تصویر 1

تغییر اندازه دسته‌جمعی تصاویر با پایتون به شما امکان می‌دهد صدها فایل تصویری را در چند ثانیه به ابعاد دلخواه درآورید و در زمان خود صرفه‌جویی کنید. این روش برخلاف ابزارهای آنلاین، کاملاً رایگان، بدون محدودیت حجم، و با حفظ کامل حریم خصوصی روی سیستم خودتان اجرا می‌شود.

اگر صاحب یک فروشگاه اینترنتی هستید یا به عنوان وب‌مستر فعالیت می‌کنید، احتمالاً بارها با مشکل تصاویر سنگین و ناهمگون مواجه شده‌اید. آپلود تک‌تک تصاویر در فتوشاپ یا سایت‌های کاهش حجم نه تنها طاقت‌فرسا است، بلکه کنترل کیفیت خروجی را هم از دست شما خارج می‌کند. پایتون با چند خط کد ساده این فرآیند را کاملاً خودکار می‌کند.

پیش‌نیازها و راه‌اندازی اولیه

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون — تصویر 2

برای اجرای کدهای این مقاله، فقط به خود پایتون و یک کتابخانه بسیار قدرتمند به نام Pillow (نسخه پیشرفته PIL) نیاز دارید. این کتابخانه استانداردترین ابزار پردازش تصویر در پایتون است.

ابتدا ترمینال یا Command Prompt خود را باز کنید و دستور زیر را برای نصب کتابخانه وارد کنید:

pip install Pillow

اگر به دنبال یادگیری بیشتر درباره خودکارسازی وظایف با پایتون هستید، می‌توانید بخش مجموعه تکه‌کدهای پایتون را در سایت ما بررسی کنید تا با پروژه‌های کاربردی دیگر نیز آشنا شوید.

روش اول: تغییر اندازه ساده و دسته‌جمعی با Pillow

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون — تصویر 3

تغییر اندازه ساده تصاویر به یک بعد ثابت (مثلاً ۸۰۰ در ۶۰۰ پیکسل)، ابتدایی‌ترین روش پردازش تصویر است. این روش برای تصاویری که نسبت ابعاد اولیه آن‌ها یکسان است عالی عمل می‌کند.

کد زیر تمام تصاویر موجود در یک پوشه را اسکن کرده، اندازه آن‌ها را تغییر می‌دهد و خروجی را در یک پوشه جدید ذخیره می‌کند:

# import required libraries
import os
from PIL import Image

def resize_bulk_images(input_dir, output_dir, size=(800, 600)):
    # Create output directory if it doesn’t exist
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    # Loop through all files in the directory
    for filename in os.listdir(input_dir):
        if filename.lower().endswith((‘.png’, ‘.jpg’, ‘.jpeg’, ‘.webp’)):
            img_path = os.path.join(input_dir, filename)
            try:
                with Image.open(img_path) as img:
                    # Resize using LANCZOS filter for high quality
                    resized_img = img.resize(size, Image.Resampling.LANCZOS)
                    resized_img.save(os.path.join(output_dir, filename), quality=90)
                    print(f”Successfully resized: {filename}”)
            except Exception as e:
                print(f”Failed to process {filename}: {e}”)

# Example Usage:
resize_bulk_images(‘my_photos’, ‘resized_photos’, (1024, 768))

در کد بالا، از فیلتر LANCZOS استفاده کرده‌ایم. این فیلتر بهترین الگوریتم موجود در کتابخانه Pillow برای کاهش ابعاد با حفظ حداکثری جزئیات و جلوگیری از تاری تصویر است.

روش دوم: تغییر اندازه هوشمند با حفظ نسبت تصویر (Aspect Ratio)

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون — تصویر 4

برای تغییر سایز تصاویر بدون کشیده شدن یا دفرمه شدن، باید عرض یا ارتفاع جدید را بر اساس نسبت تصویر اصلی (Aspect Ratio) محاسبه کنید. این روش به شما تضمین می‌دهد که تناسب اجزای داخل عکس کاملاً حفظ شود.

کد زیر به صورت پویا عرض یا ارتفاع را بر اساس اندازه پیش‌فرض شما هماهنگ می‌کند:

import os
from PIL import Image

def resize_aspect_ratio(input_dir, output_dir, max_width=800):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    for filename in os.listdir(input_dir):
        if filename.lower().endswith((‘.png’, ‘.jpg’, ‘.jpeg’)):
            img_path = os.path.join(input_dir, filename)
            try:
                with Image.open(img_path) as img:
                    # Calculate aspect ratio
                    w_percent = (max_width / float(img.size[0]))
                    h_size = int((float(img.size[1]) * float(w_percent)))
                    
                    resized_img = img.resize((max_width, h_size), Image.Resampling.LANCZOS)
                    resized_img.save(os.path.join(output_dir, filename), optimize=True, quality=85)
                    print(f”Resized with ratio: {filename}”)
            except Exception as e:
                print(f”Error processing {filename}: {e}”)

resize_aspect_ratio(‘raw_images’, ‘processed_images’, max_width=600)

در این کد، ما پارامتر optimize=True را به تابع ذخیره‌سازی اضافه کردیم. این کار باعث فشرده‌سازی بیشتر تصویر بدون افت کیفیت محسوس می‌شود و برای بهینه‌سازی سرعت سایت‌ها فوق‌العاده کاربردی است.

روش سوم: پردازش فوق‌سریع با Multithreading

کدهای آماده تغییر اندازه تصویر دسته‌جمعی با پایتون — تصویر 5

اگر هزاران تصویر دارید، پردازش خط به خط و تک‌تک آن‌ها ممکن است دقایق زیادی زمان ببرد. استفاده از قابلیت چندنخی (Multithreading) در پایتون به شما اجازه می‌دهد از تمام هسته‌های پردازنده خود کار بکشید و کار را تا ۵ برابر سریع‌تر انجام دهید.

کد حرفه‌ای زیر با بهره‌گیری از کتابخانه داخلی پایتون یعنی concurrent.futures طراحی شده است:

import os
from PIL import Image
from concurrent.futures import ThreadPoolExecutor

INPUT_FOLDER = ‘large_dataset’
OUTPUT_FOLDER = ‘fast_resized’
TARGET_WIDTH = 1200

def process_single_image(filename):
    if not filename.lower().endswith((‘.png’, ‘.jpg’, ‘.jpeg’)):
        return
    img_path = os.path.join(INPUT_FOLDER, filename)
    try:
        with Image.open(img_path) as img:
            w_percent = (TARGET_WIDTH / float(img.size[0]))
            h_size = int((float(img.size[1]) * float(w_percent)))
            resized_img = img.resize((TARGET_WIDTH, h_size), Image.Resampling.LANCZOS)
            resized_img.save(os.path.join(OUTPUT_FOLDER, filename), quality=80, optimize=True)
            print(f”Processed: {filename}”)
    except Exception as e:
        print(f”Error {filename}: {e}”)

def main():
    if not os.path.exists(OUTPUT_FOLDER):
        os.makedirs(OUTPUT_FOLDER)
    
    files = os.listdir(INPUT_FOLDER)
    # Use max 8 threads for optimal multi-core performance
    with ThreadPoolExecutor(max_workers=8) as executor:
        executor.map(process_single_image, files)

if __name__ == “__main__”:
    main()

این روش به شدت کارآمد است؛ چرا که زمان‌های هدررفته پردازنده برای خواندن و نوشتن فایل روی هارد (I/O) را به حداقل می‌رساند.

برای توسعه پروژه‌های وب و یادگیری کدهای پایه‌ای اینترنت می‌توانید به مرجع تکه‌کدهای کاربردی ما سر بزنید و نمونه کدهای فرانت‌اند و بک‌اند را دانلود کنید.

جدول مقایسه روش‌های تغییر اندازه تصویر در پایتون

نام متد / قابلیت بهترین سناریوی استفاده
تغییر اندازه ساده (متد اول) تصاویری با نسبت ابعاد مشابه که نیاز به یک اندازه مشخص و فیکس دارند.
برش و نسبت تصویر (متد دوم) بهینه‌سازی تصاویر وبلاگ و فروشگاه برای جلوگیری از کج شدن تصاویر.
چندنخی یا Multithreading (متد سوم) پردازش سریع گالری‌های بسیار بزرگ با حجم بالای چند گیگابایت.

عیب‌یابی سریع و رفع خطاهای رایج

هنگام اجرای کدهای پایتون روی پوشه‌های محلی، ممکن است با خطاهای زیر مواجه شوید که به سادگی قابل حل هستند:

  • ۱. خطای FileNotFoundError: این خطا زمانی رخ می‌دهد که آدرس پوشه ورودی را اشتباه وارد کرده باشید. مسیرهای نسبی را دقیق چک کنید یا از مسیرهای مطلق (مثل C:/Users/Name/Pictures) استفاده کنید.
  • ۲. خطای OSError (Unsupported image format): برخی فایل‌ها فرمت غیراستاندارد دارند. مطمئن شوید که شرط endswith در حلقه فایل‌ها به درستی فیلتر شده است تا پایتون فایل‌های سیستمی مانند Thumbs.db را بررسی نکند.
  • ۳. خطای تاری یا کیفیت بد پس از کوچک کردن تصویر: اطمینان حاصل کنید که پارامتر فیلتر تصویر شما حتماً روی Image.Resampling.LANCZOS تنظیم شده باشد.

پرسش‌های متداول

آیا این کدها فایل‌های اصلی من را پاک می‌کنند؟

خیر، تمام کدهای ارائه شده خروجی‌های بهینه‌شده را در یک پوشه جدید به صورت کاملاً مجزا ذخیره می‌کنند و به تصاویر اصلی شما آسیبی وارد نخواهد شد.

آیا کیفیت تصاویر خروجی در این روش افت می‌کند؟

خیر، با استفاده از فیلتر باکیفیت Lanczos و تنظیم دستی مقدار پارامتر quality روی ۸۵ الی ۹۰ درصد، خروجی‌ها بدون هیچ‌گونه افت کیفیت چشمگیر و با حجم بسیار کمتر تولید می‌شوند.

چطور می‌توانم فرمت تصاویر را نیز همزمان به WebP تغییر دهم؟

برای این کار کافی است در متد save، فرمت فایل جدید را با پسوند .webp مشخص کنید. کتابخانه Pillow به صورت خودکار عملیات تبدیل فرمت را انجام می‌دهد.

چرا کدهای آماده من خطا می‌دهند؟

بیشترین دلیل خطا در کدهای آماده پایتون، نبود لایبرری Pillow یا اشتباه بودن آدرس فولدرها در سیستم عامل شما است. پس از نصب لایبرری حتماً یکبار ادیتور خود را ری‌استارت کنید.

Table of Contents

آخرین نوشته‌ها