말랑말랑제리스타일

파이썬으로 Pillow로 이미지 비율 맞춰서 크기 조정하기 본문

프로그래밍/파이썬

파이썬으로 Pillow로 이미지 비율 맞춰서 크기 조정하기

제리제리 2023. 11. 21. 09:15

파이썬의 이미지 작업에는 Pillow나 Open CV 중 하나가 주로 사용됩니다. 여기서 오늘은 좀 더 간단한 Pillow를 이용해서 파이썬에서 이미지 크기를 조절하는 방법을 알아봅시다.

먼저 이미지 비율과 관계없이 크기를 조절하는 방법을 알아보고 두 번째로 이미지 비율에 맞춰서 가로 세로 비율이 깨지지 않게 이미지 크기를 조절하는 방법을 알아볼 겁니다.

파이썬 이미지 크기 조정 준비 사항 - 파이썬, Pillow 설치

먼저 파이썬으로 이미지 크기를 조정하기 위해 준비되어야 할 사항입니다.

일단 파이썬을 이용할 것이기 때문에 파이썬이 설치되어있어야 하고 라이브러리를 제대로 땡겨쓸 수 있어야겠죠.

두 번째로 파이썬의 이미지 컨트롤 라이브러리인 Pillow가 설치되어있지 않다면 하기 명령을 터미널에 입력해서 Pillow를 설치해 줍니다.

pip install pillow

 

언제나 그렇듯 파이썬에서 라이브러리를 설치하는 건 상당히 간단하죠.

파이썬 Pillow로 이미지 비율 관계없이 크기 조절하기

자 Pillow 설치까지 끝났다면 먼저 이미지 비율 관계 없이 이미지 크기를 조절하는 방법입니다.

먼저 512 * 512의 sample.png라는 이미지를 가져왔습니다.

그리고 main.py를 하단과 같이 작성해 줍니다.

from PIL import Image

img = Image.open('sample.png')

img_resize = img.resize((120,120))

img_resize.save('sample2.png')

그리고 실행하면 sample2.png라는 파일이 생기고 이미지 사이즈는 120 * 120으로 바뀌어있을 겁니다.

배경이 투명한 그림이라면 당연히 투명한 배경의 이미지로 저장이 됩니다.

파이썬 pillow로 이미지 줄이기
파이썬 pillow로 이미지 줄이기

여기서 사용된 메서드는 open이라는 이미지를 열어주는 메서드, img_resize라는 새로운 객체에 열어온 이미지 사이즈를 바꿔서 넣어주는 resize 메서드, img_resize 객체를 이미지 형태로 저장해 주는 save 메서드가 사용되었습니다.

resize 메서드에서는 보간 방법을 선형 보간이라던지 지정할 수 있는데 일단 생략하도록 하겠습니다.

 

하지만 여기서 문제가 발생하죠.

사이즈 비율을 동일하게 줄이거나 키울 때는 문제가 되지 않지만 resize를 120 * 512 등으로 사이즈 비율을 다르게 적용을 하면 이미지가 늘어나버립니다.

파이썬 pillow로 이미지 사이즈 변경
파이썬 pillow로 이미지 사이즈 변경

이런 경우 우리는 이미지 크기는 120 * 512로 바꾸되, 배율 밖의 영역은 검은색, 흰색 등 비워놓고 싶을 수 있죠.

 

저 같은 경우 이모티콘 생성할 때 제출처마다 크기 양식이 달라서 고민을 했습니다.

그래서 찾은 방법은 Pillow를 이용해서 이미지 비율을 해치지 않고 이미지 크기를 조절하는 방법입니다.

 

파이썬 Pillow로 이미지 비율 유지한 채로 크기 조절하기

앞선 단순 Resize에서 이미지가 늘어나거나 비율이 틀어지는 현상을 막기 위해 찾은 방법으로 Pillow 라이브러리의 이미지 객체를 만들어주는 new라는 메서드를 사용합니다.

from PIL import Image

img = Image.open('sample.png')

img_resize = img.resize((120,120))

img_out = Image.new('RGBA', (120,512))

img_out.paste(img_resize, (0,0))

img_out.save('sample2.png')

소스는 이렇게 됩니다. 

resize 메서드를 이용해서 비율에 맞으면서 가로 세로 중 작은 사이즈에 맞게 크기를 변환해 img_resize 객체에 넣어줍니다.

그리고 img_out이라는 Image 객체를 하나 더 생성해서 new 메서드로 아무 픽셀 값이 없는 RGBA의 120,512 사이즈의 이미지를 하나 생성해 줍니다.

그리고 이 img_out에 img_resize를 붙여 넣어줍니다.

파이썬 pillow로 이미지 사이즈 배율 맞춰서 변경
파이썬 pillow로 이미지 사이즈 배율 맞춰서 변경

뒤에 오는 (0,0)은 위치로 그림의 맨 좌상단에 이미지를 위치시키는 것으로, 중앙에 놓고 싶다면 소스를 아래와 같이 수정하면 됩니다.

from PIL import Image

img = Image.open('sample.png')

img_resize = img.resize((120,120))

img_out = Image.new('RGBA', (120,512))

img_out.paste(img_resize, ((int)((120 - img_resize.width)/2), (int)((512 - img_resize.height)/2)))

img_out.save('sample2.png')

써놓고 보니 소스가 많이 지저분해졌네요.

일단 원리는 변경된 이미지 위치를 "(변경 후 이미지 크기 - 붙여 넣을 이미지 크기) / 2"로 계산해서 중간에 갖다 놓은 겁니다.

int 변수 두 개로 좀 정리를 해봅시다.

from PIL import Image

img = Image.open('sample.png')

width = 100
height = 512
minsize = min(width, height)

img_resize = img.resize((minsize,minsize))

img_out = Image.new('RGBA', (width,height))

img_out.paste(img_resize, ((int)((width - img_resize.width)/2), (int)((height - img_resize.height)/2)))

img_out.save('sample2.png')

이렇게 바꾸면 width와 height 변수 값을 바꾸기만 하면 바로 사용할 수 있는 소스가 되겠네요.

여기서 여백을 검은색으로 하고 싶다면 Image.new 메서드를 아래와 같이 바꾸면 됩니다.

img_out = Image.new('RGB', (width,height),(0,0,0))

파이썬 흰색으로 여백 채우고 이미지 확대
파이썬 흰색으로 여백 채우고 이미지 확대

흰색으로 채우고 싶다면 아래와 같이 바꿀 수 있겠죠.

img_out = Image.new('RGB', (width,height),(255,255,255))

물론 최초 원본 이미지가 가로, 세로 비율이 다른 경우도 생각해 볼 수 있습니다.

from PIL import Image

img = Image.open('sample.png')

width = 300
height = 212
minsize = min(width, height)

resize_mag = minsize / max(img.width, img.height)
resize_width = (int)(img.width * resize_mag)
resize_height = (int)(img.height * resize_mag)

img_resize = img.resize((resize_width,resize_height))

img_out = Image.new('RGB', (width,height),(255,255,255))

img_out.paste(img_resize, ((int)((width - img_resize.width)/2), (int)((height - img_resize.height)/2)))

img_out.save('sample2.png')

가로, 세로 중 작은 쪽을 찾고 resize_mag라는 변수에 줄일 비율을 계산한 뒤 resize_width, height 변수를 만들어 변환될 크기를 잡아주는 거죠.

여기까지 파이썬 Pillow를 이용해서 이미지를 확대하거나 축소하는 방법을 알아봤습니다.

생각보다 유용하고 외부에 반복문을 사용하면 10장 이상의 이미지를 한번 소스 돌려서 사이즈를 바꿀 수도 있으니 이모티콘 제작 등에 유용하게 사용할 수 있는 소스죠.

반응형
Comments