누구나 할 수 있다.

django 이미지 변환 및 저장에 관련한 질문 본문

Django

django 이미지 변환 및 저장에 관련한 질문

실용주의 프로그래머 2021. 2. 27. 21:20

원 출처 : onion.haus/detail/4289

 

 

django 이미지 변환 및 저장에 관련한 질문 | O'NION

django 기반 이미지 변환 및 저장에 관련한 질문질문이 들어왔는데 글로 남겨 많은분들이 볼 수 있도록 하는 게 좋겠다 싶어 작성합니다.일단 질문의 요지는 변환된 이미지를 어떻게 저장하고 보

onion.haus

 

django 기반 이미지 변환 및 저장

 

질문이 들어왔는데 글로 남겨 많은분들이 볼 수 있도록 하는 게 좋겠다 싶어 작성합니다.

 

일단 질문의 요지는 변환된 이미지를 어떻게 저장하고 보여줄 것인지 입니다.

 

강좌에서 진행한 코드의 연장선에서 살펴보겠습니다.

저희는 강좌에서 image 컬럼을 추가하여 해당 컬럼에 업로드 하는 이미지를 저장했습니다.

 

 

Article 모델 내부 image 컬럼

 

이 이미지 컬럼만으로는 변환 이미지를 저장할 수 없기 때문에,

 

가적으로 image_converted 라는 컬럼을 생성해주도록 하겠습니다.

 

image_converted 컬럼 추가

 

물론 model을 수정했으니 migrate 하는 과정도 진행해주셔야겠죠?

해당 내용은 건너뛰도록 하겠습니다.

 

그렇다면 이제 이미지를 어떻게 변환하고, 이 컬럼에 할당할지가 문제입니다.

계속 진행하도록 하겠습니다.

 

첫번째로 Article model 안의 save 메서드를 덮어씌우겠습니다.

 

    def save(self, *args, **kwargs):
        self.convert_image()
        super(Article, self).save(*args, **kwargs)

 

위와 같이 기존의 save 를 하기 이전, 자체 메서드 convert_image를 실행시켜줍니다.

 

그렇다면 convert_image 를 구현해야겠죠?

해당 내용을 구현해줍니다.

 

    def convert_image(self, *args, **kwargs):
        image_converted = convert_test(self.image)
        self.image_converted = InMemoryUploadedFile(file=image_converted,
                                                    field_name="ImageField",
                                                    name=self.image.name,
                                                    content_type='image/jpeg',
                                                    size=sys.getsizeof(image_converted),
                                                    charset=None)

 

 

위와 같이 convert_image 를 구현했습니다.

django 에서 제공하는 InMemoryUploadedFile 을 사용해서 ImageField인 image_converted 에 이미지를 할당해줍니다.

 

그럼 위의 코드에서 볼 수 있듯, convert_test 라는 함수에 실제 변환 로직이 들어가는 것을 추측할 수 있겠죠?

해당 내용을 구현해줍니다.

 

 

def convert_test(img):
    img = Image.open(img)
    img = img.convert('RGB')
    img = img.resize((100, 100), Image.ANTIALIAS)
    return image_to_bytes(img)


def image_to_bytes(img):
    output = BytesIO()
    img.save(output, format='JPEG', quality=95)
    output.seek(0)
    return output

 

 

convert_image 내에서 간단하게 resize 를 구현했습니다.

안에 들어가는 변환 내용은 어떤 변환이든 상관 없습니다.

 

그리고 변환된 이미지를 다시 byte 스트림 버퍼로 변환해서 리턴하게 됩니다.

InMemoryUploadedFile 에서 필요한 값이 스트림 버퍼이기 때문에 해 주어야 하는 과정입니다.

 

그렇게 되면 최종 코드는 아래와 같습니다.

 

최종 코드

 

그리고 마지막으로 template 안에 원본 image 뿐만 아니라 image_converted 를 출력하는 태그를 추가하게 되면, 해당 변환 이미지도 정상적으로 출력 되는 것을 확인 할 수 있습니다.

 

변환 이미지 html 태그 추가

 

Comments