Django

⌘K
  1. Home
  2. Django
  3. Django তে কিভাবে কাজ করতে...
  4. Image Processing with Pillow

Image Processing with Pillow

Django-তে Pillow ব্যবহার

Django-তে আমরা সাধারণত ImageField ব্যবহার করে ইমেজ আপলোড করি। Pillow ব্যবহার করে আমরা ইমেজ আপলোড করার সময় সেটিকে প্রসেস করতে পারি, যেমন রিসাইজ, অপটিমাইজ, ইত্যাদি।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

এখানে আমরা একটি Profile মডেল তৈরি করেছি, যেখানে ImageField ব্যবহার করা হয়েছে।

সিগন্যাল ব্যবহার করে ইমেজ প্রসেসিং

আপনি Django সিগন্যাল ব্যবহার করে ইমেজ আপলোড হওয়ার সাথে সাথে সেটিকে প্রসেস করতে পারেন। এখানে আমরা ইমেজ রিসাইজ করার জন্য একটি উদাহরণ দেখব।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

এই উদাহরণে, যখনই প্রোফাইল পিকচার আপলোড হবে, এটি স্বয়ংক্রিয়ভাবে ৩০০x৩০০ পিক্সেলে রিসাইজ করা হবে।

Pillow এর আরও উন্নত ফিচার

ইমেজের থাম্বনেইল তৈরি

থাম্বনেইল তৈরি করার জন্য thumbnail() মেথড ব্যবহার করা হয়। এটি আসল ইমেজের উপর কাজ করে এবং ইমেজের অ্যাসপেক্ট রেশিও ঠিক রাখে।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

ইমেজে টেক্সট যোগ করা

আপনি ইমেজে কাস্টম টেক্সট যোগ করতে পারেন Pillow এর ImageDraw এবং ImageFont মডিউল ব্যবহার করে।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

ইমেজের বিভিন্ন ফিল্টার প্রয়োগ করা

Pillow দিয়ে আপনি ইমেজের উপর বিভিন্ন ফিল্টার প্রয়োগ করতে পারেন, যেমন ব্লার, শার্পেনিং ইত্যাদি।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

ইমেজের কন্ট্রাস্ট, ব্রাইটনেস এবং রঙ সমন্বয়

ImageEnhance মডিউল ব্যবহার করে ইমেজের বিভিন্ন গুণমান নিয়ন্ত্রণ করা যায়।

from PIL import ImageEnhance

# কন্ট্রাস্ট সমন্বয় করা
enhancer = ImageEnhance.Contrast(image)
enhanced_image = enhancer.enhance(1.5)
enhanced_image.show()

# ব্রাইটনেস সমন্বয় করা
brightness_enhancer = ImageEnhance.Brightness(image)
bright_image = brightness_enhancer.enhance(1.2)
bright_image.show()

Django Admin ইন্টারফেসে ইমেজ প্রদর্শন

নিচে Django-তে Pillow ব্যবহার করে ইমেজ আপলোড অপ্টিমাইজ করার সম্পূর্ণ বাংলা গাইড দেওয়া হলো। আমরা ইমেজ রিসাইজ, কোয়ালিটি কমিয়ে সাইজ কমানো এবং অটোমেটিক অপ্টিমাইজেশনের পদ্ধতি দেখবো:


ধাপ ১: Pillow ইন্সটল করুন

প্রথমে Pillow প্যাকেজটি ইন্সটল করুন:

pip install Pillow

ধাপ ২: মডেলে ইমেজ ফিল্ড তৈরি করুন

আপনার models.py ফাইলে নিচের মতো মডেল তৈরি করুন:

from django.db import models

class OptimizedImage(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='optimized_images/')
    created_at = models.DateTimeField(auto_now_add=True)

ধাপ ৩: ইমেজ অপ্টিমাইজেশন ফাংশন তৈরি করুন

একটি নতুন ফাইল utils.py তৈরি করুন এবং নিচের কোড যোগ করুন:

from PIL import Image
import os

def optimize_image(image_path, max_size=1200, quality=70):
    """
    ইমেজ রিসাইজ ও কোয়ালিটি কমিয়ে অপ্টিমাইজ করে
    Args:
        image_path: ইমেজের ফুল পাথ (Ex: /media/images/img.jpg)
        max_size: সর্বোচ্চ width/height (বর্গাকার ইমেজের জন্য)
        quality: জেপিজি কোয়ালিটি (1-100)
    """
    img = Image.open(image_path)

    # ইমেজ মোড চেক করুন (RGBA হলে RGB তে কনভার্ট)
    if img.mode in ('RGBA', 'LA'):
        img = img.convert('RGB')

    # রিসাইজ লজিক
    width, height = img.size
    if width > max_size or height > max_size:
        img.thumbnail((max_size, max_size))

    # ওভাররাইট করবেন নাকি নতুন সেভ করবেন?
    img.save(
        image_path,
        'JPEG' if image_path.lower().endswith('.jpg') else 'PNG',
        optimize=True,
        quality=quality
    )

ধাপ ৪: মডেলের save মেথড ওভাররাইড করুন

models.py ফাইল আপডেট করুন:

from django.db import models
from django.conf import settings
from .utils import optimize_image  # utils.py থেকে ফাংশন ইম্পোর্ট

class OptimizedImage(models.Model):
    # পূর্বের ফিল্ডগুলো...

    def save(self, *args, **kwargs):
        # প্রথমে মূল সেভ মেথড কল করুন
        super().save(*args, **kwargs)

        # ইমেজ অপ্টিমাইজেশন
        if self.image:
            full_path = os.path.join(settings.MEDIA_ROOT, self.image.name)
            try:
                optimize_image(full_path)
            except Exception as e:
                print(f"Error optimizing image: {e}")

ধাপ ৫: সিগন্যাল ব্যবহার করে অটোমেশন (ঐচ্ছিক)

সিগন্যাল ব্যবহার করতে signals.py ফাইল তৈরি করুন:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import OptimizedImage

@receiver(pre_save, sender=OptimizedImage)
def optimize_before_save(sender, instance, **kwargs):
    if instance.image:
        # নতুন ইমেজ আপলোড হলে মাত্র অপ্টিমাইজ করবে
        if not instance.pk:
            return
        old_image = OptimizedImage.objects.get(pk=instance.pk).image
        if old_image != instance.image:
            full_path = instance.image.path
            optimize_image(full_path)

apps.py এ সিগন্যাল রেজিস্টার করুন:

from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

    def ready(self):
        import myapp.signals

ধাপ ৬: অ্যাডমিনে রেজিস্টার করুন

admin.py ফাইল:

from django.contrib import admin
from .models import OptimizedImage

@admin.register(OptimizedImage)
class OptimizedImageAdmin(admin.ModelAdmin):
    list_display = ('title', 'image', 'created_at')

ধাপ ৭: টেমপ্লেটে ইমেজ প্রদর্শন

<!-- image_list.html -->
{% for img in images %}
    <div class="image-item">
        <h3>{{ img.title }}</h3>
        <!-- ওয়েবপেজে অপ্টিমাইজড ইমেজ শো করানো -->
        <img src="{{ img.image.url }}" alt="{{ img.title }}" style="max-width: 100%; height: auto;">
    </div>
{% endfor %}

বোনাস টিপস:

  1. WebP ফরম্যাট সাপোর্ট:
   # utils.py তে
   img.save(full_path, 'WEBP', quality=60)
  1. ইমেজ সাইজ ভ্যালিডেশন (forms.py):
   from django import forms
   from .models import OptimizedImage

   class ImageUploadForm(forms.ModelForm):
       class Meta:
           model = OptimizedImage
           fields = ['title', 'image']

       def clean_image(self):
           image = self.cleaned_data.get('image')
           if image:
               if image.size > 5 * 1024 * 1024:  # 5MB চেক
                   raise forms.ValidationError("ইমেজ সাইজ 5MB এর বেশি হতে পারবে না!")
               # রেজোলিউশন চেক
               img = Image.open(image)
               if img.width > 5000 or img.height > 5000:
                   raise forms.ValidationError("ইমেজ রেজোলিউশন অনেক বড়!")
           return image
  1. CDN ব্যবহার: Cloudflare বা AWS CloudFront ব্যবহার করে ইমেজ ক্যাশিং করুন

রেজাল্ট টেস্ট:

  • আপলোড前 ইমেজ: 4.2MB (4032×3024 pixels)
  • আপলোড后 ইমেজ: 450KB (1200×900 pixels, 70% quality)

সমস্যা সমাধান:

  • PNG ট্রান্সপারেন্সি সমস্যা: PNG ইমেজকে JPEG এ কনভার্ট করলে ব্যাকগ্রাউন্ড কালো হতে পারে। এজন্য আলাদা লজিক ব্যবহার করুন
  • EXIF ডেটা: কিছু ইমেজে EXIF ডেটা সাইজ বাড়ায়, img.info.pop('exif', None) ব্যবহার করে রিমুভ করুন

এই স্টেপগুলো ফলো করলে আপনার Django প্রজেক্টে ইমেজগুলো অটোমেটিক্যালি অপ্টিমাইজ হয়ে স্টোরেজ ও লোডিং স্পিড দুইই উন্নত হবে! 😊

How can we help?