python pillow 패키지에는 두 함수가 있습니다. resize 함수와 thumbnail 이 있는데요. 사진의 width와 height를 줄이거나 늘릴 때 쓰곤 합니다. 이 둘이 어떻게 다른지 간단하게 알아보겠습니다. 실습에 사용될 이미지는 아래와 같습니다. 가로 640px, 세로 640px의 사진입니다.

pillow thumbnail 함수
먼저, thumbnail 입니다. size로 tuple을 주는데요. width와 height를 줍니다. gh_bag_1.jpg를 읽어서 thumbnail 함수로 사진 크기를 줄여봅시다.

이 함수에 대한 설명을 봅시다. 설명을 잘 읽어보면 3개의 키워드가 중요하다는 것을 볼 수 있어요.
- preserve aspect of image
- no larger than given size
보존하는데, 이미지의 aspect. 양상, 특성 정도를 보존한다. 이 정도로 해석할 수 있어요. aspect ratio of image는 이미지의 비율을 뜻해요. 그리고, size로 주어진 크기를 초과하지 않는다고 되어 있어요. 그러면, 예제를 보겠습니다.

예제 1번을 보면, Image.open 함수로 gh_bag_1.jpg를 열고 있어요. 다음 pillow thumbnail 함수를 호출하는데요. size는 width가 320, height가 256입니다. 원본 크기는 640 by 640 이였어요. 같은 비율로 줄일 거에요.

thumbnail 함수에서 요청한 건 가로 320, 세로 256 이였습니다. 그림에서 색깔로 칠해진 부분은 320 by 320입니다. 그리고 320 by 256은 노란색 부분이고요. 색깔로 칠해진 부분은 세로 크기가 노란색 부분의 세로 크기보다는 큽니다. 따라서, 320 by 320으로 줄여지지 않습니다.
256 by 256은 어떨까요?

320 by 256 보다는 작거나 같습니다. 가로 크기도, 세로 크기도. 고로 size를 (320, 256)으로 넘겨주면, 가로 256 픽셀, 세로 256 픽셀의 사진으로 줄여줍니다.

실행 결과는 위와 같습니다. 256 by 256으로 줄어들었음을 볼 수 있어요. ratio 또한 유지되고 있음을 알 수 있는데요. 원래 1:1 비율의 사진 이였습니다. 주의해야 할 것은, 이 함수는 image의 object를 변경합니다. 따라서, 원본 이미지를 보존해야 한다면 copy를 써야 합니다.
pillow resize 함수
반면에 pillow resize 함수는 다릅니다. 어떻게 다른지 설명을 봅시다.

이것은 단순히 리사이즈 된 이미지의 복사본을 리턴한다 되어 있어요. ratio가 보존되지는 않아요. 어떻게 작동하는지 예제 프로그램 2번을 보도록 하겠습니다.

640 by 640 짜리 gh_bag_1.jpg를 엽니다. 그리고, resize를 하는데요. 인자로 width는 320, height는 240으로 설정해 달라는 tuple을 넘겼네요. resize는 thumbnail과 다르게 image object를 리턴합니다. 고로, 원본에 변화는 없습니다. 4번째 줄에 resize의 결과를 다시 im 객체가 받기 때문에, 변형된 이미지 객체를 저장한다는 것을 보시면 됩니다.
결과를 보겠습니다.

320 by 256의 사진이 생성되었음을 볼 수 있어요. thumbnail과는 다르게 이미지의 가로 세로 비율이 보존되지 않았다는 것 짚고 넘어가시면 됩니다.
정리하기
아래 이미지를 봅시다.

이 그림 파일은 480 by 640 입니다. 아래 예제 3번을 보겠습니다.

실행 결과는 어떻게 나올까요? 원래 size가 480 by 640이니까, 비율로 표시하면 3 : 4가 됩니다. 가로가 256px 이라면, 세로는 341px이 나오겠네요. 당연히 세로 크기가 요청 사이즈보다 크니 무시됩니다. 세로 가 128px 이라면 어떨까요? 이 경우, 가로는 96px이 나옵니다. 이는 256 by 128에 들어오는 크기입니다.
따라서 96 x 128의 사진이 나오게 됩니다. 정말 그런지 볼까요?

정확하게 96 by 128의 사진이 나왔습니다. 이제 예제 4를 보겠습니다.

예제 4번에서는 pillow resize 함수를 썼습니다. 요청 size가 가로 256, 세로 256이네요. 원본인 480 by 640 이였습니다. 이 경우, 256 by 256의 사진이 나오게 되는데요. resize가 image ratio를 보존하지 않기 때문에 그렇습니다.
세로가 더 눌러진 형태의 사진으로 나오겠네요. 결과를 봅시다.

256 by 256의 사진이 나오게 됩니다. 그리고 3 : 4에서 1 : 1로 바뀌면서 원본 대비 가로가 약간 길쭉하게 늘어지게 되었습니다.