ویژگی تصویر

کتابخانه pillow در پایتون

  /  پایتون   /  کتابخانه pillow در پایتون
بنر تبلیغاتی الف

کتابخانه Pillow یک کتابخانهٔ محبوب برای پردازش تصویر در پایتون است که ادامه‌دهندهٔ پروژهٔ PIL (Python Imaging Library) می‌باشد. این کتابخانه برای خواندن، نوشتن، دستکاری و تبدیل تصاویر در فرمت‌های مختلف کاربرد دارد و در پروژه‌های وب، تحلیل تصویر، تولید تصاویر پویا و اتوماسیون پردازش تصویر بسیار مفید است.

کلمات کلیدی (SEO)

  • Pillow Python
  • کتابخانه تصویر پایتون
  • Image processing Python
  • تبدیل عکس، تغییر اندازه تصویر
  • ImageDraw، ImageFilter

نصب و آماده‌سازی محیط

برای نصب Pillow کافی است از pip استفاده کنید:

pip install pillow

این دستور بستهٔ اصلی را نصب می‌کند. در محیط‌های مجازی (virtualenv یا venv) نصب را داخل همان محیط انجام دهید تا وابستگی‌ها مدیریت شوند.

مفاهیم پایه‌ای و API اصلی

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

  • ImageDraw — رسم خط، متن، شکل‌ها.
  • ImageFont — کار با فونت‌ها برای رسم متن.
  • ImageFilter — اعمال فیلترها مثل بلور و شارپ.
  • ImageOps — عملیات سطح بالا مثل آینه کردن، برش هوشمند، تبدیل رنگی.

باز کردن و نمایش تصویر

from PIL import Image

img = Image.open("input.jpg")
print(img.format, img.size, img.mode)
img.show() 

در این قطعه:

  • Image.open فایل تصویری را باز می‌کند و یک شیء Image بازمی‌گرداند.
  • img.format فرمت فایل (مثلاً JPEG یا PNG) را نگه می‌دارد.
  • img.size یک تاپل (width, height) برمی‌گرداند.
  • img.mode حالت رنگی را نشان می‌دهد (مثل "RGB", "RGBA", "L" برای خاکستری).
  • img.show() تصویر را با مشاهده‌گر پیش‌فرض سیستم نمایش می‌دهد — مناسب برای دیباگ سریع ولی نه برای تولید.

تغییر اندازه و نسبت‌ها

from PIL import Image

img = Image.open("input.jpg")
resized = img.resize((800, 600), Image.LANCZOS)
resized.save("resized.jpg", quality=90) 

توضیح:

  • resize تصویر را به اندازهٔ جدید تغییر می‌دهد؛ باید مراقب باشید که نسبت ابعاد (aspect ratio) حفظ شود در غیر این صورت تصویر کشیده یا فشرده می‌شود.
  • برای حفظ نسبت بهتر است از thumbnail استفاده کنید که با حفظ نسبت تصویر را کوچک می‌کند:
img = Image.open("input.jpg")
img.thumbnail((800, 800))  # حداکثر عرض/ارتفاع 800، نسبت حفظ می‌شود
img.save("thumb.jpg")

در thumbnail تصویر در محل تغییر می‌کند و اگر تصویر کوچک‌تر باشد تغییری صورت نمی‌گیرد.

برش (Crop) و چسباندن (Paste)

img = Image.open("input.jpg")
crop_box = (100, 100, 400, 400)  # (left, top, right, bottom)
cropped = img.crop(crop_box)
cropped.save("cropped.jpg")

# چسباندن

background = Image.new("RGB", (800, 600), (255,255,255))
background.paste(cropped, (50, 50))
background.save("pasted.jpg") 

توضیح:

  • crop یک باکس مشخص را برمی‌گرداند. مختصات به صورت (چپ، بالا، راست، پایین) هستند.
  • Image.new یک تصویر جدید می‌سازد؛ می‌توان پس‌زمینهٔ سفیدی ایجاد و تصاویر دیگر را با paste در آن قرار داد.

تبدیل فرمت و حالت رنگی

img = Image.open("input.png")
rgb = img.convert("RGB")
rgb.save("out.jpg", "JPEG", quality=85)

توضیح:

  • convert("RGB") تصویر را به فضای رنگ RGB تبدیل می‌کند؛ این کار هنگام ذخیرهٔ PNG با شفافیت (RGBA) به JPEG الزامی است زیرا JPEG از آلفا پشتیبانی نمی‌کند.
  • در هنگام ذخیره می‌توان پارامترهایی مثل quality را تنظیم کرد که روی اندازهٔ فایل تاثیر دارد.

نقاشی و افزودن متن

from PIL import Image, ImageDraw, ImageFont

img = Image.open("input.jpg").convert("RGBA")
txt_layer = Image.new("RGBA", img.size, (255,255,255,0))
draw = ImageDraw.Draw(txt_layer)

font = ImageFont.truetype("arial.ttf", 40)
draw.text((50, 50), "سلام، Pillow!", font=font, fill=(255,0,0,255))

combined = Image.alpha_composite(img, txt_layer)
combined.save("with_text.png") 

توضیحات:

  • برای افزودن متن بهتر است از لایهٔ شفاف (RGBA) استفاده کنید تا متن به صورت غیرمخرب روی تصویر اصلی قرار گیرد.
  • ImageFont.truetype برای بارگذاری فونت سیستم است؛ اگر فونت موجود نیست باید مسیر فونت مناسب را قرار دهید یا از فونت پیش‌فرض استفاده کنید.
  • alpha_composite دو تصویر RGBA را با هم ترکیب می‌کند و شفافیت را حفظ می‌کند.

فیلترها و پردازش تصویری

from PIL import ImageFilter

img = Image.open("input.jpg")
blurred = img.filter(ImageFilter.GaussianBlur(radius=2))
sharpened = img.filter(ImageFilter.UnsharpMask(radius=2, percent=150, threshold=3))
blurred.save("blur.jpg")
sharpened.save("sharpen.jpg") 

توضیح:

  • ماژول ImageFilter فیلترهایی چون بلور، شارپ، لبه‌یابی و … را فراهم می‌کند.
  • فیلترها می‌توانند سنگین باشند؛ برای مجموعه تصاویر بزرگ یا پردازش دسته‌ای، استفاده از threading/ multiprocessing یا کتابخانه‌های سطح پایین‌تر (مثل OpenCV) ممکن است لازم باشد.

پردازش دسته‌ای (Batch Processing)

import os
from PIL import Image

input_dir = "images_in"
output_dir = "images_out"
os.makedirs(output_dir, exist_ok=True)

for fname in os.listdir(input_dir):
if not fname.lower().endswith((".jpg",".jpeg",".png")):
continue
path = os.path.join(input_dir, fname)
img = Image.open(path)
img.thumbnail((1024,1024))
img.save(os.path.join(output_dir, fname), optimize=True, quality=85) 

توضیح:

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

نکات بهترین شیوه (Best Practices)

  • حفظ نسبت تصویر: هنگام تغییر اندازه از thumbnail یا محاسبه ابعاد جدید با نسبت اصلی استفاده کنید.
  • مدیریت حافظه: بعد از کار با تصویر img.close() را فراخوانی کنید یا از دستورات context manager استفاده کنید:
from PIL import Image

with Image.open("input.jpg") as img:
img.thumbnail((800,800))
img.save("out.jpg")

# پس از خروج از بلوک فایل بسته می‌شود

توضیح:

استفاده از context manager تضمین می‌کند که فایل‌ها حتی در صورت بروز استثنا بسته شوند.

  • ذخیرهٔ بهینه: برای JPEG از پارامترهای quality و optimize=True استفاده کنید. برای PNG از compress_level.
  • استفاده از فرمت مناسب: برای تصاویر با شفافیت از PNG یا WebP استفاده کنید. WebP معمولاً اندازهٔ فایل کوچک‌تر و کیفیت مشابه دارد.
  • بررسی مد تصویر: قبل از عملیات‌هایی که نیاز به کانال آلفا دارند، مد تصویر را بررسی و در صورت نیاز تبدیل کنید.

مقایسهٔ کوتاه: Pillow در برابر OpenCV

ویژگیPillowOpenCV
سادگیبسیار ساده برای کارهای عادیپیچیده‌تر اما قدرتمند
پردازش پیشرفتهمناسب برای فیلترها و ویرایشمناسب برای بینایی ماشین و پردازش سریع
پشتیبانی فرمتخوب برای فرمت‌های متداولخوب و سریع، ولی نیاز به مدیریت BGR/RGB
کاراییکافی برای اکثر وب/اپ‌هابهینه‌تر برای پردازش ویدیویی و realtime

خطاهای متداول و رفع آن‌ها

  • خطای بارگذاری فونت: اگر truetype پیدا نشد، مسیر کامل فونت را بدهید یا از فونت پیش‌فرض استفاده کنید.
  • حافظهٔ زیاد: از thumbnail و context manager استفاده کنید و از نگهداری همزمان تصاویر بزرگ پرهیز کنید.
  • مشکلات آلفا هنگام ذخیره به JPEG: قبل از ذخیره به JPEG حتماً convert("RGB") را فراخوانی کنید.

مثال پیشرفته — تولید تصویر بندانگشتی با واترمارک

from PIL import Image, ImageDraw, ImageFont, ImageEnhance

def make_thumbnail_with_watermark(input_path, output_path, size=(300,300), watermark_text="© MySite"):
with Image.open(input_path) as img:
img.thumbnail(size)
# ساخت لایهٔ متن
txt = Image.new("RGBA", img.size, (255,255,255,0))
draw = ImageDraw.Draw(txt)
font = ImageFont.truetype("arial.ttf", 16)
text_w, text_h = draw.textsize(watermark_text, font=font)
pos = (img.size[0] - text_w - 5, img.size[1] - text_h - 5)
draw.text(pos, watermark_text, font=font, fill=(255,255,255,128))
# ترکیب و ذخیره
watermarked = Image.alpha_composite(img.convert("RGBA"), txt)
# کاهش کمی روشنایی برای تطابق رنگ
enhancer = ImageEnhance.Brightness(watermarked)
final = enhancer.enhance(0.95)
final.convert("RGB").save(output_path, quality=85, optimize=True)

# استفاده

make_thumbnail_with_watermark("big.jpg", "thumb_wm.jpg") 

توضیح:

  • این تابع یک بندانگشتی تولید و یک واترمارک شفاف در گوشهٔ پایین-راست اضافه می‌کند.
  • استفاده از ImageEnhance برای کمی تنظیم روشنایی که می‌تواند ظاهر واترمارک را لطیف‌تر کند.
  • در پایان تصویر به RGB تبدیل و ذخیره می‌شود تا با فرمت‌های بدون آلفا سازگار باشد.

محدودیت‌ها و نکات تکمیلی

pillow برای اکثر کارهای ویرایش و پردازش تصویر مناسب است، اما برای تحلیل پیچیدهٔ تصاویر، تشخیص اشیاء، یا پردازش ویدیوهای realtime معمولاً OpenCV یا کتابخانه‌های یادگیری ماشین مناسب‌تر هستند. همچنین در پردازش تصاویر بسیار بزرگ (مثل تصاویر ماهواره‌ای) ممکن است نیاز به استفاده از ابزارهای تخصصی یا تقسیم تصویر به قطعات باشد.

خلاصه نکات فنی

  • از with Image.open() برای مدیریت بهتر منابع استفاده کنید.
  • برای پردازش زیاد، از روش‌های موازی و بهینه‌سازی فایل‌ها بهره ببرید.
  • همیشه قبل از ذخیره فرمت و مد رنگ مناسب را انتخاب کنید.
  • برای تولیدات وب، اندازه و کیفیت را متعادل نگه دارید تا بار شبکه کمتر شود.

اگر بخشی از مثال‌های کد یا فایل‌های فونت در محیط شما قابل اجرا نیستند (مثلاً فونت arial.ttf موجود نباشد) باید مسیر فونت مناسب سیستم خود را جایگزین کنید. در غیر این صورت کدها کار خواهند کرد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: