دليل شامل لمعالجة الصور باستخدام مكتبة Pillow في بايثون خطوة بخطوة

目次

١. المقدمة

نظرة عامة على Python وPillow

تُعتبر لغة البرمجة Python من أكثر اللغات شعبية بين المبرمجين وعلماء البيانات، حيث تتميز ببساطتها وتوفر مكتبات متنوعة تُستخدم في مختلف المجالات. من بين هذه المكتبات، تُعدّ مكتبة معالجة الصور Pillow (والتي كانت تُعرف سابقًا باسم PIL: Python Imaging Library) الخيار الأبرز لمعالجة الصور في Python.

تدعم مكتبة Pillow العديد من صيغ الصور مثل JPEG وPNG وGIF وغيرها، كما تتيح القيام بعمليات متعددة مثل تغيير الحجم والقص وإضافة الفلاتر والنصوص، مما يجعلها مناسبة لمعظم احتياجات معالجة الصور. تُستخدم Pillow في العديد من المشاريع والتطبيقات لقراءة الصور وتعديلها وحفظها بسهولة.

هدف هذا المقال

في هذا المقال، سنشرح بشكل شامل كيفية استخدام مكتبة Pillow في Python لمعالجة الصور، بدءًا من العمليات الأساسية مثل قراءة الصور وحفظها، ووصولًا إلى العمليات المتقدمة كإعادة تحجيم الصور وتدويرها وتطبيق الفلاتر، بالإضافة إلى إضافة النصوص ودمج الصور.

من خلال قراءة هذا الدليل، ستتعلم كيفية استخدام مكتبة Pillow بشكل احترافي، واكتساب المهارات اللازمة لتطبيقها في مشاريعك البرمجية.

٢. طريقة تثبيت مكتبة Pillow

٢.١ كيفية تثبيت Pillow على بيئة Python

لتتمكن من استخدام مكتبة Pillow، يجب أولاً تثبيتها في بيئة Python الخاصة بك. طريقة التثبيت سهلة جدًا، فقط أدخل الأمر التالي في الطرفية (أو في موجه الأوامر على ويندوز):

pip install Pillow

أداة pip هي مدير الحزم الرئيسي في Python، وبمجرد تنفيذ هذا الأمر سيتم تثبيت مكتبة Pillow تلقائيًا. عند اكتمال التثبيت بنجاح، يمكنك البدء في معالجة الصور مباشرة.

٢.٢ طريقة التأكد من عمل المكتبة بشكل صحيح

بعد الانتهاء من تثبيت Pillow، يمكنك التأكد من عملها من خلال تنفيذ كود بسيط كما يلي. اكتب الشيفرة التالية في ملف Python وقم بتشغيله:

from PIL import Image

# كود التحقق من عمل مكتبة Pillow
img = Image.new('RGB', (100, 100), color = 'red')
img.save('test_image.png')

يقوم هذا الكود بإنشاء صورة حمراء بمقاس ١٠٠×١٠٠ بكسل وحفظها باسم “test_image.png”. إذا تم إنشاء الملف بنجاح، فهذا يعني أن التثبيت تم بشكل صحيح.

٢.٣ المشاكل الشائعة عند التثبيت وحلولها

أحيانًا قد تواجه بعض المشكلات أثناء تثبيت مكتبة Pillow. فيما يلي أكثر المشاكل شيوعًا مع حلولها:

  1. استخدام إصدار قديم من Python
    تدعم مكتبة Pillow إصدارات Python 3.x فقط. إذا كنت تستخدم إصدارًا أقدم، قد لا يكتمل التثبيت. تحقق من إصدار Python لديك باستخدام python --version وقم بالتحديث إذا لزم الأمر.
  2. مشكلات في الحزم التابعة
    قد تظهر أخطاء أثناء التثبيت بسبب نقص بعض الحزم التابعة. في هذه الحالة، اتبع رسائل الخطأ لتثبيت الحزم الناقصة، أو أضف الخيار التالي لتثبيت جميع الحزم التابعة تلقائيًا:
   pip install Pillow --upgrade
  1. إعداد متغيرات البيئة
    في بعض الحالات على نظام Windows، قد يرجع سبب المشكلة إلى عدم إعداد مسارات Python أو pip في متغيرات البيئة بشكل صحيح. تأكد من إعداد المسارات بشكل سليم.

٣. قراءة وعرض الصور

٣.١ كيفية قراءة ملف صورة باستخدام Python

قراءة الصور تُعد الخطوة الأساسية في معالجة الصور باستخدام مكتبة Pillow. يمكنك فتح أي صورة بسهولة عبر الدالة Image.open().

فيما يلي مثال على قراءة صورة:

from PIL import Image

# قراءة ملف الصورة
img = Image.open('sample.jpg')

# عرض معلومات عن الصورة
print(img.format)  # نوع الملف (مثال: JPEG, PNG)
print(img.size)    # الأبعاد (العرض، الارتفاع)
print(img.mode)    # وضع الألوان (مثال: RGB, L)

يقوم هذا الكود بقراءة ملف الصورة وطباعه معلومات مثل النوع والأبعاد ونمط الألوان.

٣.٢ عرض الصورة

لعرض الصورة بعد قراءتها، استخدم الدالة show()، والتي تفتح الصورة في عارض الصور الافتراضي للنظام.

from PIL import Image

# قراءة ملف الصورة
img = Image.open('sample.jpg')

# عرض الصورة
img.show()

يفتح الكود أعلاه الصورة في البرنامج الافتراضي لعرض الصور، ما يسمح لك بمراجعة الصورة بسهولة.

٣.٣ الحصول على معلومات تفصيلية عن الصورة

يمكنك الحصول على تفاصيل مثل أبعاد الصورة ونوعها ووضع الألوان باستخدام خصائص الكائن img.

from PIL import Image

# قراءة ملف الصورة
img = Image.open('sample.jpg')

# طباعة تفاصيل الصورة
print(f'أبعاد الصورة: {img.size}')   # (العرض، الارتفاع)
print(f'نوع الملف: {img.format}')    # نوع الصورة (JPEG, PNG, إلخ)
print(f'وضع الألوان: {img.mode}')    # وضع الألوان (RGB, L, إلخ)

هذه المعلومات تفيدك في تعديل الصور بحسب متطلباتك، مثل تغيير الحجم أو الاقتصاص.

٣.٤ صيغ الصور المدعومة في Pillow

تدعم مكتبة Pillow صيغ صور عديدة مثل:

  • JPEG
  • PNG
  • GIF
  • BMP
  • TIFF

لذلك يمكنك معالجة معظم صيغ الصور الشهيرة بسهولة، بما في ذلك الصور المرفوعة من قبل المستخدمين على المواقع الإلكترونية.

٤. المعالجة الأساسية للصور

٤.١ تغيير حجم الصورة

يُعد تغيير حجم الصور من العمليات الأساسية في معالجة الصور، ويساعد في تكييف الصور لاستخدامها في المواقع أو التطبيقات. استخدم دالة resize() لتغيير الأبعاد بسهولة.

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# تغيير حجم الصورة (العرض 400 بكسل، الارتفاع 300 بكسل)
resized_img = img.resize((400, 300))

# حفظ الصورة الجديدة
resized_img.save('resized_sample.jpg')

تم في هذا المثال تغيير أبعاد الصورة وحفظ النسخة الجديدة.

٤.٢ قص جزء من الصورة (Trim)

يسمح لك القص باستخلاص جزء معين من الصورة، مثل الاقتصاص حول وجه أو عنصر مهم. استخدم دالة crop() لتحديد المنطقة المطلوبة.

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# قص جزء من الصورة (من النقطة (100,100) إلى (300,300))
cropped_img = img.crop((100, 100, 300, 300))

# حفظ الجزء المقصوص
cropped_img.save('cropped_sample.jpg')

٤.٣ تدوير الصورة

يمكنك تدوير الصور بزوايا محددة عبر دالة rotate(). استخدم الخيار expand=True لمنع اقتطاع أجزاء من الصورة بعد التدوير.

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# تدوير الصورة ٤٥ درجة مع توسيع الأبعاد
rotated_img = img.rotate(45, expand=True)

# حفظ الصورة المدورة
rotated_img.save('rotated_sample.jpg')

٤.٤ عكس الصورة (الانعكاس)

يمكنك عكس الصورة أفقيًا أو عموديًا باستخدام الدالة transpose().

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# عكس الصورة أفقيًا
flipped_img = img.transpose(Image.FLIP_LEFT_RIGHT)

# حفظ الصورة المعكوسة
flipped_img.save('flipped_sample.jpg')

٤.٥ عمليات معالجة أخرى مدعومة في Pillow

بالإضافة إلى تغيير الحجم والقص والتدوير والعكس، يمكنك أيضًا ضبط السطوع والتباين، وتغيير وضع الألوان، وغير ذلك. تجعل هذه الوظائف المكتبة مناسبة لتطوير أدوات تحرير الصور أو أتمتة التعديلات.

侍エンジニア塾

٥. تحويل صيغ الصور وحفظها

٥.١ تحويل صيغ الصور

تتيح لك مكتبة Pillow تحويل الصور بسهولة من صيغة إلى أخرى. على سبيل المثال، يمكنك تحويل صورة من JPEG إلى PNG عبر بضع أسطر برمجية فقط. كل ما عليك هو قراءة الصورة ثم حفظها بصيغة مختلفة باستخدام الدالة save().

from PIL import Image

# قراءة صورة JPEG
img = Image.open('sample.jpg')

# حفظها بصيغة PNG
img.save('converted_image.png', 'PNG')

يقوم الكود أعلاه بفتح صورة باسم sample.jpg وحفظها كملف PNG جديد باسم converted_image.png. هذه الطريقة تُستخدم كثيرًا في المواقع أو التطبيقات التي تحتاج لتحويل الصور بين الصيغ المختلفة.

٥.٢ طرق حفظ الصور والإعدادات المتقدمة

بعد معالجة الصورة، يمكنك حفظها بعدة خيارات مثل تحديد الجودة أو ضغط الصورة أو تفعيل نمط JPEG المتدرج. على سبيل المثال، عند حفظ صورة بصيغة JPEG يمكنك تحديد جودة الصورة وخيارات التحسين:

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# حفظ الصورة بجودة 95% مع تحسين
img.save('optimized_image.jpg', 'JPEG', quality=95, optimize=True)

يمكنك تغيير قيمة quality (من 0 إلى 100) حسب الحاجة. الخيار optimize=True يقلل من حجم الملف النهائي قدر الإمكان.

٥.٣ حفظ صور JPEG بنمط Progressive

نمط Progressive JPEG يسمح بعرض الصورة تدريجيًا على صفحات الويب (تظهر أولاً بشكل غير واضح ثم تتحسن تدريجيًا). يمكنك تفعيل هذا النمط عند حفظ الصورة:

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# حفظ الصورة بنمط Progressive JPEG
img.save('progressive_image.jpg', 'JPEG', quality=85, progressive=True)

يفيد هذا النمط في تسريع تحميل الصور على الإنترنت وتقديم تجربة أفضل للمستخدم.

٥.٤ الاحتفاظ ببيانات EXIF

تحتوي بعض الصور (خاصة من الكاميرات) على بيانات وصفية تُسمى EXIF تشمل معلومات مثل تاريخ التصوير والإعدادات. يمكنك الاحتفاظ بهذه البيانات عند حفظ الصورة:

from PIL import Image

# قراءة الصورة
img = Image.open('sample.jpg')

# الحصول على بيانات EXIF
exif_data = img.info.get('exif')

# حفظ الصورة مع بيانات EXIF
img.save('exif_image.jpg', 'JPEG', exif=exif_data)

يساعد ذلك في الحفاظ على المعلومات الأصلية للصورة عند معالجتها أو إعادة حفظها.

٦. تطبيق الفلاتر والمؤثرات على الصور

٦.١ تعديل السطوع والتباين

تسمح مكتبة Pillow بتعديل سطوع الصورة أو تباينها بسهولة باستخدام الوحدة ImageEnhance.

from PIL import Image, ImageEnhance

# قراءة الصورة
img = Image.open('sample.jpg')

# تعديل السطوع (جعل الصورة أكثر سطوعاً 1.5 مرة)
enhancer = ImageEnhance.Brightness(img)
bright_img = enhancer.enhance(1.5)

# حفظ الصورة الجديدة
bright_img.save('bright_sample.jpg')

يمكنك أيضًا تعديل التباين لجعل الصورة أكثر وضوحًا:

from PIL import Image, ImageEnhance

# قراءة الصورة
img = Image.open('sample.jpg')

# تعزيز التباين مرتين
enhancer = ImageEnhance.Contrast(img)
contrast_img = enhancer.enhance(2.0)

# حفظ الصورة
contrast_img.save('contrast_sample.jpg')

٦.٢ تطبيق الفلاتر مثل التمويه والحدة

يمكنك تطبيق فلاتر مثل التمويه (blur) أو الحدة (sharpen) باستخدام الوحدة ImageFilter:

from PIL import Image, ImageFilter

# قراءة الصورة
img = Image.open('sample.jpg')

# تطبيق فلتر التمويه
blurred_img = img.filter(ImageFilter.BLUR)
blurred_img.save('blurred_sample.jpg')

ولتطبيق الحدة:

# تطبيق فلتر الحدة
sharpened_img = img.filter(ImageFilter.SHARPEN)
sharpened_img.save('sharpened_sample.jpg')

٦.٣ استخدام الفلاتر المتقدمة (كشف الحواف)

تتوفر أيضًا فلاتر متقدمة مثل كشف الحواف (Edge Detection):

from PIL import Image, ImageFilter

# قراءة الصورة
img = Image.open('sample.jpg')

# تطبيق فلتر كشف الحواف
edge_img = img.filter(ImageFilter.FIND_EDGES)
edge_img.save('edge_sample.jpg')

يُستخدم هذا النوع من الفلاتر عادةً في تحليلات الصور أو في تصميمات جرافيكية خاصة.

٧. رسم النصوص والأشكال على الصور

٧.١ طريقة رسم نص على الصورة باستخدام Pillow

تتيح لك مكتبة Pillow إضافة نصوص بسهولة على الصور باستخدام الوحدة ImageDraw. هذا مفيد لصناعة الشعارات، البانرات، أو العلامات المائية:

from PIL import Image, ImageDraw, ImageFont

# قراءة الصورة
img = Image.open('sample.jpg')

# إنشاء كائن للرسم
draw = ImageDraw.Draw(img)

# رسم نص على الصورة
draw.text((10, 10), 'Hello, Pillow!', fill=(255, 255, 255))

# حفظ الصورة
img.save('text_sample.jpg')

يحدد الوسيط fill لون النص (هنا أبيض).

٧.٢ تحديد نوع الخط (Font)

يمكنك استخدام خطوط مخصصة وأحجام مختلفة للنص عبر الوحدة ImageFont:

from PIL import Image, ImageDraw, ImageFont

# قراءة الصورة
img = Image.open('sample.jpg')

# إنشاء كائن للرسم
draw = ImageDraw.Draw(img)

# تحديد الخط (خط TrueType وحجم 40)
font = ImageFont.truetype('arial.ttf', 40)

# رسم نص بخط مخصص
draw.text((10, 10), 'Custom Font!', font=font, fill=(255, 255, 255))

# حفظ الصورة
img.save('font_sample.jpg')

٧.٣ رسم الأشكال الهندسية

يمكنك رسم خطوط، مستطيلات، ودوائر على الصورة بسهولة:

from PIL import Image, ImageDraw

# قراءة الصورة
img = Image.open('sample.jpg')

# إنشاء كائن للرسم
draw = ImageDraw.Draw(img)

# رسم خط
draw.line((0, 0, 100, 100), fill=(255, 0, 0), width=5)

# رسم مستطيل
draw.rectangle((50, 50, 150, 150), outline=(0, 255, 0), width=3)

# رسم دائرة (بيضاوي)
draw.ellipse((200, 200, 300, 300), outline=(0, 0, 255), width=3)

# حفظ الصورة
img.save('shape_sample.jpg')

يتم تحديد لون الحدود وسمك الخط عبر الوسيطين outline وwidth.

٧.٤ تطبيقات الرسم المتقدمة

تسمح لك المكتبة بدمج النصوص والأشكال لرسم تصميمات معقدة مثل بانرات الإعلانات أو صور السوشيال ميديا.

٨. تقنيات متقدمة: دمج الصور واستخدام القناع (Mask)

٨.١ دمج الصور

يمكنك دمج عدة صور في صورة واحدة بسهولة عبر دالة paste()—مثلاً لوضع صورة شفافة فوق صورة خلفية:

from PIL import Image

# فتح صورة الخلفية وصورة الدمج
background = Image.open('background.jpg')
overlay = Image.open('overlay.png')

# دمج overlay فوق الخلفية عند النقطة (100,100)
background.paste(overlay, (100, 100), overlay)

# حفظ الصورة النهائية
background.save('combined_image.jpg')

الدالة paste() تدعم القنوات الشفافة (Alpha) لجعل الدمج واقعيًا واحترافيًا.

٨.٢ قص الصور باستخدام القناع (Mask)

يمكنك قص الصور بأشكال مخصصة (دائرة أو نجمة مثلاً) عبر إنشاء صورة قناع وتطبيقها أثناء الدمج:

from PIL import Image, ImageDraw

# فتح الصورة
img = Image.open('sample.jpg')

# إنشاء قناع دائرة
mask = Image.new('L', img.size, 0)
draw = ImageDraw.Draw(mask)
draw.ellipse((100, 100, 300, 300), fill=255)

# تطبيق القناع لقص الصورة
result = Image.new('RGB', img.size)
result.paste(img, (0, 0), mask)

# حفظ الصورة النهائية
result.save('masked_image.jpg')

المناطق البيضاء في القناع تظهر في الصورة الناتجة، بينما السوداء تكون شفافة.

٨.٣ إنشاء صور شفافة باستخدام قناة Alpha

لجعل الصورة شفافة جزئيًا يمكنك التلاعب بقناة Alpha مباشرة:

from PIL import Image

# فتح الصورة وتحوّيلها إلى RGBA
img = Image.open('sample.jpg').convert('RGBA')

# تعديل قناة Alpha لجعل الشفافية 50%
alpha = img.split()[3]
alpha = alpha.point(lambda p: p * 0.5)
img.putalpha(alpha)

# حفظ الصورة الشفافة
img.save('transparent_image.png')

٨.٤ تطبيقات متقدمة باستخدام هذه التقنيات

يمكنك استخدام هذه التقنيات لابتكار صور مركبة، بانرات إعلانات، دمج شعارات شفافة، أو حتى إعداد بيانات صور لمشاريع الذكاء الاصطناعي وتعلم الآلة.

٩. الخلاصة

في هذا الدليل، شرحنا بالتفصيل كيفية استخدام مكتبة Pillow لمعالجة الصور باستخدام لغة Python. تعرفت على كيفية قراءة الصور، تعديلها، قصها، تدويرها، تطبيق الفلاتر، إضافة النصوص والأشكال، ودمج الصور.

٩.١ ملخص أساسيات استخدام مكتبة Pillow

بدأنا بطريقة تثبيت Pillow، ثم تعلمنا كيفية فتح الصور وعرضها، واستخراج معلوماتها الأساسية.

٩.٢ العمليات الأساسية مثل تغيير الحجم والقص والتدوير

أوضحنا كيف يمكن تغيير حجم الصور أو اقتصاص جزء منها أو تدويرها حسب الحاجة، ما يساعد في التكيّف مع مختلف متطلبات المشاريع البرمجية.

٩.٣ تطبيق الفلاتر والمؤثرات

تم شرح كيفية ضبط سطوع وتباين الصور وتطبيق فلاتر مثل التمويه والحدة وكشف الحواف.

٩.٤ إضافة النصوص والأشكال ودمج الصور

تعلمت كيفية رسم النصوص والأشكال الهندسية على الصور، وكيفية دمج أكثر من صورة بشكل احترافي واستخدام قنوات الشفافية.

٩.٥ التطلّع للاستفادة المستقبلية

لا تزال مكتبة Pillow توفّر العديد من الإمكانيات المتقدمة. يمكنك استكشاف المزيد عبر التوثيق الرسمي أو مصادر تعليمية إضافية، واستخدامها في أتمتة المعالجة، تحليل الصور في مشاريع البيانات، أو في تطبيقات الذكاء الاصطناعي.

استخدم ما تعلمته هنا لتطوير مشاريع احترافية في معالجة الصور ببايثون باستخدام Pillow.

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール