💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    9. 이미지처리 | ✅ 저자: 이유정(박사)

    (venv) pip install Pillow
    

    Pillow의 리사이즈 방식 비교 빨간 화살표는 fit() 방식 강조:
    이미지를 정해진 사이즈에 맞춰 자르고 정확히 맞추는 기능

    썸네일 생성 함수 + 모델에 적용 utils.py create_thumbnail() 함수 utils.py 같은 헬퍼 파일에 작성하는 것이 일반적 이미지 코드에 있는 주요 단계

    • Image.open() – 이미지 열기
    • img.convert('RGB') – RGB 변환
    • ImageOps.fit() – 썸네일 리사이징
    • BytesIO – 메모리 버퍼에 저장
    • ContentFile – Django가 저장할 수 있는 파일 객체로 변환

    UserProfile 모델 확장 models.py

    • profile_image: 원본 이미지 저장
    • thumbnail: 썸네일 이미지 저장
    • save() 오버라이드 → 저장 시 자동으로 썸네일 생성

    이미지 코드에 있는 주요 단계

    • 프로필 이미지가 존재할 경우
    • create_thumbnail() 호출로 썸네일 생성
    • self.thumbnail.save()로 저장
    • super().save()로 나머지 저장 처리

    your_app/utils.py – 썸네일 생성 함수

    from PIL import Image, ImageOps
    from io import BytesIO
    from django.core.files.base import ContentFile
    
    
    def create_thumbnail(image, size=(300, 300)):
        """이미지를 썸네일로 리사이징하고 ContentFile로 반환"""
        img = Image.open(image)
        img = img.convert('RGB')  # RGBA → RGB
        thumb = ImageOps.fit(img, size, Image.ANTIALIAS)  
        # 자르면서 리사이징
    
        thumb_io = BytesIO()
        thumb.save(thumb_io, format='JPEG')
        return ContentFile(thumb_io.getvalue(), name=image.name)
    

    your_app/models.py – UserProfile 모델

    from django.db import models
    from .utils import create_thumbnail
    
    
    class UserProfile(models.Model):
        user = models.OneToOneField('auth.User', on_delete=models.CASCADE)
        profile_image = models.ImageField(upload_to='profiles/', null=True, blank=True)
        thumbnail = models.ImageField(upload_to='profiles/thumbnails/', null=True, blank=True)
    
        def save(self, *args, **kwargs):
            # 원본 이미지가 있을 경우 썸네일 생성
            if self.profile_image:
                thumb = create_thumbnail(self.profile_image)
                self.thumbnail.save(f"thumb_{self.profile_image.name}", thumb, save=False)
            super().save(*args, **kwargs)
    

    settings.py – 미디어 파일 경로 설정 (필수)

    MEDIA_URL = '/media/'
    MEDIA_ROOT = BASE_DIR / 'media'
    

    admin.py – (선택) 관리자에서 이미지 미리보기

    from django.contrib import admin
    from .models import UserProfile
    
    
    @admin.register(UserProfile)
    class UserProfileAdmin(admin.ModelAdmin):
        list_display = ['user', 'profile_image', 'thumbnail']
    

    실제 적용 예시

    사용자가 프로필 이미지 업로드  
    → UserProfile.save()가 호출됨  
    → utils.create_thumbnail()로 썸네일 자동 생성  
    → .thumbnail.save()로 저장됨
    
    TOP
    preload preload