کتابخانه 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
| ویژگی | Pillow | OpenCV |
|---|---|---|
| سادگی | بسیار ساده برای کارهای عادی | پیچیدهتر اما قدرتمند |
| پردازش پیشرفته | مناسب برای فیلترها و ویرایش | مناسب برای بینایی ماشین و پردازش سریع |
| پشتیبانی فرمت | خوب برای فرمتهای متداول | خوب و سریع، ولی نیاز به مدیریت 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 موجود نباشد) باید مسیر فونت مناسب سیستم خود را جایگزین کنید. در غیر این صورت کدها کار خواهند کرد.
آیا این مطلب برای شما مفید بود ؟




