flask서버에서 이미지파일 리사이징

코변·2022년 5월 9일
0

개발일지

목록 보기
15/41
post-custom-banner

image를 스토리지에 저장하고 url을 db에 저장하는게 제일 효율적이지만 이번 프로젝트에서는 base64인코딩을 해서 db에 저장하기로 했다. 그러던 중 사진을 리사이징하고 싶다는 욕심이 생겼고 처음에는 bytesIO 버퍼에 대한 개념없이 코드를 긁어와서 썼더니 오류가 났다.

file = request.files['img']
extension = file.filename.split('.')[-1]
format = 'JPEG' if extension.lower() == 'jpg' else extension.upper()
img = Image.open(file)
wpercent = (614/ float(img.size[0]))
h_size = int((float(img.size[1]) * float(wpercent)))
img_resize = img.resize((614, h_size))
buffered = BytesIO()
img_resize.save(buffered, format)
image_base64 = base64.b64encode(img_resize.read())

오류메시지는 read를 불러올 수 없다는 거였고 나는 방법을 바꿔서 로컬에 저장해버리자고 생각했다. 그런데 이건 아무래도 아니다 싶어 bytesIO에 대해 공부해보니 byte형태로 메모리를 열어서 잠시 저장하는 거라고 이해했고 이 코드를 보니 buffer에 저장을 해놓고 아예 쓰지 않은 거였다. 역시 긁어온 코드를 내 코드로 만드려면 이해가 필수적으로 동반되어야 한다. 공부 이후에 바뀐 코드는 다음과 같다.

from PIL import Image
from io import BytesIO

file = request.files['img']
extension = file.filename.split('.')[-1]
format = 'JPEG' if extension.lower() == 'jpg' else extension.upper()
img = Image.open(file)
wpercent = (614/ float(img.size[0]))
h_size = int((float(img.size[1]) * float(wpercent)))
img_resize = img.resize((614, h_size))
buffered = BytesIO()
img_resize.save(buffered, format)
image_base64 = base64.b64encode(buffered.getvalue())
profile
내 것인 줄 알았으나 받은 모든 것이 선물이었다.
post-custom-banner

2개의 댓글

comment-user-thumbnail
2022년 5월 10일

resize까지 시도를 하셨군요! 엄청나네요!

1개의 답글