일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 리스트
- 추천 영상
- 탐욕 알고리즘
- flask
- nocookie
- 바로학교
- 유튜브
- 구글 드라이브
- 깃허브
- venv
- MongoDB
- List
- DB
- 알고리즘
- 링크
- 파이썬
- python
- pymongo
- gpu 병렬처리
- 장고
- 충북
- Django
- 코딩
- docker-compose
- selenium
- 단축어
- 아이폰
- 그리디 알고리즘
- G-Suite
- Google Drive
Archives
- Today
- Total
SSAMKO의 개발 이야기
pillow - 이미지 리사이즈 하기 | Django 본문
반응형
인스타그램 클론 코딩 중 이미지를 받아서 저장할 때,
모바일 특화 컨텐츠니까 굳이 큰 사이즈 이미지로 저장할 필요가 없겠다 싶어서
너비를 700픽셀로 리사이즈 할 필요가 있었다.
# views.py
def write(request):
template_name = 'post.html'
context = {}
if request.method == 'POST':
writer = request.POST.get('writer')
text = request.POST.get('context')
# 이미지는 option
try:
image = request.FILES['visitor_image']
# image resize required
image = rescale(image, 700)
except:
image = False
new_post = Visitor(writer=writer,
text=text)
if image:
new_post.image = image
new_post.save()
return redirect('/namustagram')
return render(request, template_name, context)
간단한 포맷이라 굳이 form을 사용한 class view를 쓰지 않고, 함수형 view를 사용했다.
포스팅에 이미지가 있으면 이미지를 리사이징한다. pillow에 있는 resize와 구분하기 위해 rescale이라고 함수명을 지어줬다.
def rescale(image, width):
img = pil.open(image)
src_width, src_height = img.size
src_ratio = float(src_height) / float(src_width)
dst_height = round(src_ratio * width)
img = img.resize((width, dst_height), pil.LANCZOS)
img.save(image.name, 'PNG')
image.file = img
# 이게 없으면 attribute error 발생
image.file.name = image.name
return image
인자로 이미지 파일image과 고정시키려는 너비width를 받는다.
너비만 고정시키고 높이는 원본의 비율을 따를거기 때문에
원본의 비율을 구해줬다. src_ratio
그리고 변환할 높이dst_height를 구해서 (pillow resize가 int로만 인자를 받기 때문에) 반올림해줬다.
이제 이미지를 resize해주고, 필터는 LANCZOS를 사용했다. (몇가지 필터가 있지만 pillow공식문서에서 가장 기본적으로 추천하는 필터)
alpha가 담긴 이미지들도 있기 때문에 PNG포맷으로 저장해주고, 기존의 이미지파일의 파일image.file을 리사이징된 이미지로 바꿔주었다.
*여기까지만 하고 장고 서버를 실행시켜보면 attribute 'name'을 찾을 수 없다는 에러가 발생한다.
저장할 때 파일 이름이 필요한데, 우리가 새롭게 만든 pillow이미지 파일에는 파일이름이 없기 때문에 발생하는 오류다.
따라서 기존 이미지의 이름을 파일 이름으로 지정해주는 과정(image.file.name = image.name)이 필요하다.
반응형
'Django' 카테고리의 다른 글
[Django] TestCase 이용해서 테스트 코드 짜기 (0) | 2021.01.14 |
---|---|
[GCP] django 개발서버 배포하기 (0) | 2021.01.13 |
[django] systemd, gunicorn, nginx 서버 배포하기 (0) | 2021.01.12 |
Django에서 하나의 폼으로 여러 테이블에 데이터 작성하기 | transaction.atomic (0) | 2020.03.29 |
한 페이지에서 여러 개의 폼(forms) 다루기 | Django (1) | 2020.03.28 |
Comments