Django Pillow (이미지 CRUD)

Ryu Honggyu·2024년 8월 26일

Django

목록 보기
12/19
post-thumbnail

Pillow 라이브러리

  • Python Imaging Library(PIL)의 업그레이드 버전.
  • 이미지 CRUD 작업을 원활히 수행할 수 있게 보조해줌.
  • CRUD 외에도 이미지와 관련된 여러 기능들을 제공함.

기능 정리

기능설명
이미지 열기 및 저장JPEG, PNG, GIF, BMP 등 여러 포맷의 이미지 파일을 열고 저장할 수 있음.
이미지 변환이미지를 다른 포맷으로 변환하거나, 회전 & 자르기 등 편집 작업 가능.
텍스트 추가이미지에 텍스트를 추가할 수 있어 워터마크나 설명 추가에 용이.
이미지 합성이미지 병합, 콜라주 생성 등 이미지를 합성해 새 이미지를 만드는 작업 가능.
색상 변환흑백 변환, RGB 변환 등 색상과 관련된 다양한 변환 작업을 수행할 수 있음.
이미지 필터링블러 등 이미지 필터를 적용해 시각적 효과를 입힐 수 있음.

Pillow 사용법

1. Pillow 설치

  • pip install django 로 django 를 설치함.
  • pip install pillow 로 Pillow 라이브러리를 설치함.

2. 이미지 파일 업로드 폼 생성

  • 이미지 업로드용 forms.py 생성.
# articles/forms.py
from django import forms

class ImageUploadForm(forms.Form):
    title = forms.CharField(max_length=100)
    image = forms.ImageField()

3. 이미지 처리 뷰 함수 추가

  • 이미지 저장 & 처리용 views.py 생성.
# articles/views.py
from .forms import ImageUploadForm
from django.shortcuts import render
from PIL import Image

def upload_image(request):
    if request.method == "POST":
        form = ImageUploadForm(request.POST, request.FILES)
        if form.is_valid():
            image = Image.open(request.FILES['image'])
            image_path = 'path/to/save/image.jpg'
            image.save(image_path)
            image_url = '/media/path/to/image.jpg'  # 실제 저장된 이미지 경로로 대체해야 함
            return render(request, 'upload_success.html', {'image_url': image_url})
    else:
        form = ImageUploadForm()
    return render(request, 'upload_image.html', {'form': form})

4. 템플릿 작성

  • 이미지 업로드용 템플릿 생성.
<!-- upload_image.html -->
{% extends "base.html" %}

{% block content %}
<h1>이미지 업로드</h1>

<form action="" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">업로드</button>
</form>

{% endblock content %}
  • 이미지 업로드 완료 후 메시지용 템플릿 생성.
<!-- upload_success.html -->
{% extends "base.html" %}

{% block content %}
<h1>이미지 업로드 성공</h1>

<!-- 업로드된 이미지 표시 -->
<img src="{{ image_url }}" alt="업로드된 이미지">

<a href="{% url 'articles' %}">목록으로</a>
{% endblock content %}

etc. 추가 사용법

  • 아래 정리된 스크립트들을 기준으로 구글링 해볼 것.
기능스크립트
n도 만큼 이미지 회전image.rotate(n)
이미지 자르기image.crop((left, top, right, bottom))
이미지 크기 조절image.resize((width, height))
이미지 블러image.filter(ImageFilter.BLUR)
이미지 샤프닝(이미지 선명화)image.filter(ImageFilter.SHARPEN)
엣지 디텍션(윤곽선 강조)image.filter(ImageFilter.FIND_EDGES)
텍스트 추가ImageDraw.Draw(image).text((x, y), "텍스트", fill="색상")
흑백 변환image.convert("L")
이미지 합성Image.alpha_composite(image1, image2)

참고 자료

  • Pillow 설치 및 이미지 불러오기 [링크]
  • Pillow 공식 문서 [링크]
profile
알고리즘 & 웹 & CS & AI

0개의 댓글