FA-TOOLS — Header Component
آموزش Pillow — ویرایش تصویر با پایتون

آموزش Pillow — ویرایش تصویر با پایتون

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

خلاصه سریع و دستاورد شما از این مقاله

  • یادگیری گام‌به‌گام کار با تصاویر (برش، چرخش و تغییر فرمت)
  • فرموله کردن فرآیندهای تکراری و بهینه‌سازی تصاویر وب با متدهای فشرده‌سازی
  • توانایی افزودن واترمارک‌های متنی و لوگو روی هزاران تصویر تنها در چند ثانیه
  • آموزش ترفندهای کاربردی پایتون برای بهبود عملکرد کدهای پردازش تصویر

۱. کتابخانه Pillow چیست؟

آموزش Pillow — ویرایش تصویر با پایتون — تصویر 1

پاسخ کوتاه: کتابخانه Pillow نسخه به‌روزرسانی شده و قدرتمند کتابخانه قدیمی PIL (Python Imaging Library) است که امکان باز کردن، ویرایش، فشرده‌سازی و ذخیره فایل‌های تصویری با فرمت‌های مختلف (مانند PNG، JPEG، WebP و GIF) را در پایتون فراهم می‌کند.

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

۲. نصب و راه‌اندازی اولیه

آموزش Pillow — ویرایش تصویر با پایتون — تصویر 2

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

pip install Pillow

نکته: توجه داشته باشید که نام پکیجی که نصب می‌کنید با حروف بزرگ یا کوچک (Pillow) نوشته می‌شود، اما موقع نوشتن کد و ایمپورت کردن آن، باید از نام قدیمی آن یعنی PIL استفاده کنید.

۳. کارهای پایه: باز کردن، نمایش و ذخیره تصویر

آموزش Pillow — ویرایش تصویر با پایتون — تصویر 3

پاسخ کوتاه: برای شروع کار با تصاویر در Pillow، ابتدا کلاس Image را از کتابخانه PIL فراخوانی می‌کنیم؛ سپس با متد open() تصویر را بارگذاری کرده و با متدهای show() و save() آن را نمایش داده یا با فرمتی دیگر ذخیره می‌کنیم.

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

from PIL import Image

# باز کردن تصویر موجود در پوشه پروژه
try:
    image = Image.open('nature.jpg')
    
    # چاپ مشخصات اصلی تصویر
    print(f"Format: {image.format}")
    print(f"Size: {image.size}")  # خروجی به صورت (عرض, ارتفاع)
    print(f"Mode: {image.mode}")  # حالت رنگی مثل RGB یا RGBA
    
    # نمایش تصویر در نمایشگر پیش‌فرض سیستم
    image.show()
    
    # ذخیره تصویر با فرمتی دیگر (مثلاً تبدیل به PNG)
    image.save('nature_converted.png')
    print("تصویر با موفقیت ذخیره شد!")
    
except FileNotFoundError:
    print("خطا: فایل تصویر مورد نظر یافت نشد. لطفاً مسیر فایل را بررسی کنید.")

۴. تغییر اندازه، برش و چرخش تصاویر

آموزش Pillow — ویرایش تصویر با پایتون — تصویر 4

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

الف) تغییر اندازه (Resize)

برای تغییر ابعاد تصویر از متد resize() استفاده می‌کنیم. این متد یک تاپل شامل عرض و ارتفاع جدید دریافت می‌کند:

# تغییر ابعاد تصویر به 800 در 600 پیکسل
resized_image = image.resize((800, 600))
resized_image.save('resized_image.jpg')

ب) برش زدن تصاویر (Crop)

برای برش زدن یک مستطیل خاص از تصویر، باید مختصات چهار نقطه اصلی آن را به صورت یک تاپل به شکل (left, top, right, bottom) به متد crop() بدهید:

# تعریف محدوده برش (از پیکسل 100،100 تا 500،500)
crop_area = (100, 100, 500, 500)
cropped_image = image.crop(crop_area)
cropped_image.save('cropped_image.jpg')

ج) چرخش و معکوس کردن (Rotate & Flip)

متد rotate() تصویر را بر اساس زاویه‌ای که به آن می‌دهید (به صورت پاد ساعتگرد) می‌چرخاند. همچنین متد transpose() به شما امکان معکوس کردن افقی یا عمودی تصویر را می‌دهد:

# چرخش 90 درجه‌ای تصویر
rotated_image = image.rotate(90)
rotated_image.save('rotated_90.jpg')

# قرینه‌سازی افقی تصویر (آینه‌ای)
flipped_image = image.transpose(Image.FLIP_LEFT_RIGHT)
flipped_image.save('flipped_horizontal.jpg')

۵. کار با رنگ‌ها و اعمال فیلترهای جذاب

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

from PIL import Image, ImageFilter

# باز کردن تصویر اصلی
original = Image.open('nature.jpg')

# ۱. تبدیل تصویر به حالت سیاه و سفید (Grayscale)
grayscale_img = original.convert('L')
grayscale_img.save('black_white.jpg')

# ۲. اعمال فیلتر محوکنندگی شدید (Blur)
blurred_img = original.filter(ImageFilter.GaussianBlur(radius=5))
blurred_img.save('blurred.jpg')

# ۳. برجسته‌سازی لبه‌ها (Find Edges) - مناسب برای کارهای هنری یا پردازش تصویر
edges_img = original.filter(ImageFilter.FIND_EDGES)
edges_img.save('edges.jpg')

۶. نوشتن متن و افزودن واترمارک روی تصویر

پاسخ کوتاه: با استفاده از کلاس ImageDraw و متد text() می‌توانیم انواع متن‌ها یا واترمارک‌ها را با فونت، سایز و رنگ دلخواه روی لایه بالایی تصویر ترسیم کنیم و حق کپی‌رایت تصاویر اختصاصی خود را حفظ کنیم.

برای این کار به یک فونت با پسوند .ttf نیاز دارید که می‌توانید آن را در پوشه پروژه خود قرار دهید. در زیر نمونه کد افزودن متن فارسی یا انگلیسی به تصویر را مشاهده می‌کنید:

from PIL import Image, ImageDraw, ImageFont

# باز کردن تصویر اصلی
base_image = Image.open('nature.jpg').convert('RGBA')

# ساخت یک لایه شفاف برای ترسیم واترمارک
txt_layer = Image.new('RGBA', base_image.size, (255, 255, 255, 0))

# انتخاب یک فونت استاندارد و تنظیم اندازه آن
try:
    font = ImageFont.truetype("arial.ttf", 40)
except IOError:
    # در صورت عدم دسترسی به فونت سیستم، از فونت پیش‌فرض استفاده می‌شود
    font = ImageFont.load_default()

# ایجاد شیء ترسیم‌کننده روی لایه متنی
draw = ImageDraw.Draw(txt_layer)

# موقعیت قرارگیری متن (X, Y) و نوشتن متن با رنگ سفید و کمی شفافیت (Alpha = 128)
draw.text((50, 50), "Copyright © fa-tools.ir", fill=(255, 255, 255, 128), font=font)

# ادغام تصویر اصلی با لایه متنی شفاف
watermarked_image = Image.alpha_composite(base_image, txt_layer)

# تبدیل مجدد به حالت RGB برای ذخیره به صورت JPG
final_img = watermarked_image.convert('RGB')
final_img.save('watermarked_output.jpg')
print("واترمارک با موفقیت روی تصویر اعمال شد!")

۷. مقایسه متدهای تغییر سایز (جدول کاربردی)

وقتی تصاویر را با متد resize() تغییر اندازه می‌دهید، کیفیت تصویر خروجی بستگی شدیدی به فیلتر نمونه‌برداری مجدد (Resampling) انتخابی شما دارد. جدول زیر راهنمای سریعی برای انتخاب بهترین متد است:

متد نمونه‌برداری مجدد (Resampling) ویژگی‌ها و بهترین زمان استفاده
Image.Resampling.NEAREST بسیار سریع، اما کیفیت بسیار پایینی دارد. برای تصاویر پیکسلی (Pixel Art) یا مواردی که زمان اهمیت دارد استفاده می‌شود.
Image.Resampling.BILINEAR سرعت متوسط و کیفیت قابل قبول. برای کارهای معمولی وب گزینه مناسبی است.
Image.Resampling.BICUBIC کیفیت عالی و بالا با الگوریتم‌های محاسباتی قوی‌تر. زمان پردازش کمی بیشتر است اما نتایج واضح‌تری دارد.
Image.Resampling.LANCZOS بهترین و باکیفیت‌ترین فیلتر موجود برای کوچک کردن عکس‌ها بدون تار شدن جزئیات. انتخاب اول برای بهینه‌سازی تصاویر وب‌سایت‌ها.

۸. سناریوی واقعی: بهینه‌سازی دسته‌ای تصاویر برای وب

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

برای پیاده‌سازی این اسکریپت کاربردی، به کدهای پایتون و ماژول داخلی os نیاز داریم تا به راحتی فایل‌ها را در پوشه‌های سیستم مدیریت کنیم:

import os
from PIL import Image

def optimize_images(input_dir, output_dir, max_width=1200, quality=80):
    """
    تغییر اندازه و بهینه‌سازی گروهی تصاویر و تبدیل آن‌ها به فرمت سبک WebP
    """
    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', '.tiff')):
            input_path = os.path.join(input_dir, filename)
            output_filename = os.path.splitext(filename)[0] + '.webp'
            output_path = os.path.join(output_dir, output_filename)
            
            try:
                with Image.open(input_path) as img:
                    # حفظ نسبت ابعاد تصویر موقع تغییر اندازه
                    w_percent = (max_width / float(img.size[0]))
                    if w_percent  {output_filename}")
            except Exception as e:
                print(f"خطا در پردازش فایل {filename}: {e}")

# اجرای تابع (پوشه‌های فرضی ورودی و خروجی)
optimize_images('my_raw_images', 'optimized_for_web')

۹. عیب‌یابی سریع خطاهای رایج

هنگام کار با Pillow ممکن است با برخی از ارورهای متداول روبه‌رو شوید. در این بخش راه‌حل‌های سریع رفع آن‌ها را آماده کرده‌ایم:

۱. خطای OSError: cannot write mode RGBA as JPEG

علت: فرمت JPG از کانال شفافیت (Alpha) پشتیبانی نمی‌کند، اما تصویر شما حاوی رنگ‌های پس‌زمینه شفاف (RGBA) است.
راه‌حل: قبل از ذخیره به فرمت JPG، ابتدا آن را با کد img = img.convert('RGB') تبدیل کنید.

۲. خطای FileNotFoundError: [Errno 2] No such file or directory

علت: پایتون نمی‌تواند تصویر را در مسیر مشخص‌شده پیدا کند.
راه‌حل: از درستی املای نام فایل، پسوند آن (مثلاً فرق بین jpg و jpeg) و نوشتن مسیر مطلق یا آدرس‌دهی نسبیِ صحیح مطمئن شوید.

۳. خطای AttributeError: module ‘PIL.Image’ has no attribute ‘ANTIALIAS’

علت: در نسخه‌های جدید Pillow (نسخه ۱۰ به بعد)، ثابت قدیمی Image.ANTIALIAS حذف شده است.
راه‌حل: به جای آن از Image.Resampling.LANCZOS استفاده کنید تا مشکل کاملاً رفع شود.

۱۰. پرسش‌های متداول (FAQ)

تفاوت بین PIL و Pillow چیست؟

کتابخانه قدیمی PIL دیگر توسعه داده نمی‌شود و با پایتون ۳ سازگار نیست. پروژه Pillow به عنوان یک فورک فعال و مدرن معرفی شد تا علاوه بر حفظ کدهای قدیمی، قابلیت‌ها و پشتیبانی از پایتون ۳ را به همراه داشته باشد.

چطور می‌توانم حجم تصویر را بدون افت کیفیت شدید کاهش دهم؟

بهترین ترفند، ذخیره تصویر با فرمت‌های مدرنی مانند WebP و تنظیم پارامتر quality بین مقادیر ۷۵ تا ۸۵ در متد save() است. این کار حجم عکس را تا بیش از ۶۰ درصد کاهش می‌دهد بدون اینکه کیفیت بصری تغییر محسوسی داشته باشد.

چگونه یک لوگو را به عنوان واترمارک تصویر اصلی اضافه کنم؟

برای این کار باید لوگو را به عنوان یک فایل PNG باز کنید و با استفاده از متد paste() در مختصات مورد نظر بر روی تصویر اصلی جای‌گذاری کنید. حتماً پارامتر سوم متد paste را برابر با همان تصویر لوگو قرار دهید تا کانال آلفا (شفافیت) پس‌زمینه به درستی حفظ شود.

آیا Pillow گزینه‌ی مناسبی برای پردازش تصویر در یادگیری ماشین است؟

بله، این کتابخانه به عنوان بستر اولیه پیش‌پردازش داده‌ها در فریم‌ورک‌های معروفی مثل PyTorch و TensorFlow به کار می‌رود. با این حال، برای پردازش‌های سنگین‌تر ریاضی، ترکیب آن با کتابخانه NumPy یا OpenCV توصیه می‌شود.

Table of Contents

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