Python 사진 사이즈 변경 resize() 사용 방법

파이썬 Pillow(PIL) 라이브러리를 사용해 사진 사이즈를 확대하거나 축소하는 등 크기를 변경하는 방법을 알아보겠습니다.

사진 사이즈를 변경하기 위한 방법으로는 resize() 사용해 크기를 조절할 수 있습니다.

resize()를 사용해 사진을 크기를 변경할 때 필터를 설정해야 합니다.

필터 설정은 생략도 가능하지만 한 번 알아보겠습니다.

Filters

– NEAREST

– BOX

– BILINEAR

– HAMMING

– BICUBIC

– LANCZOS

 

 

생략한 경우에는 기본값인 NEAREST가 설정됩니다.

필터 설정을 할 때 NEAREST보다 아래로 내려 갈수록 처리시간은 길어지지만 품질은 높습니다.

from PIL import Image

img = Image.open('data/src/sample.png')

img_resize = img.resize((256, 256))
img_resize.save('data/dst/sample_pillow_resize_nearest.jpg')

img_resize_lanczos = img.resize((256, 256), Image.LANCZOS)
img_resize_lanczos.save('data/dst/sample_pillow_resize_lanczos.jpg')

 

resize()에 가로 256 세로 256으로 사이즈를 지정해 크기를 변경했습니다.

직접 사이즈를 지정해 크기를 변경할 수도 있지만 원본 사진을 반으로 줄이거나 크게 하고 싶은 경우는 원본 사진에 계산을 해서 크기를 변경할 수 있습니다.

from PIL import Image

img = Image.open('data/src/sample.png')

img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
img_resize_lanczos.save('data/dst/sample_pillow_resize_half.jpg')

 

사이즈를 지정할 때에는 정수로 값을 설정해야 하기 때문에 int()를 사용해야 합니다.

여러개의 사진을 일괄로 사이즈를 변경하고 싶은 경우는 glob()을 사용해 한 번에 처리할 수 있습니다.

확장자가 jpg인 파일만 추출해서 사진 크기를 반으로 줄이는 예제를 보겠습니다.

import os
import glob
from PIL import Image

files = glob.glob('./data/temp/images/*.jpg')

for f in files:
    img = Image.open(f)
    img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
    title, ext = os.path.splitext(f)
    img_resize.save(title + '_half' + ext)

 

만야 지정한 폴더에 사진 파일 확장자가 여러개인 경우도 있을 수 있습니다.

이러한 경우는 모든 파일을 취득한 뒤 확장자를 확인해 사진 파일일 경우에만 사이즈를 변경하도록 하면 됩니다.

import os
import glob
from PIL import Image

files = glob.glob('./data/temp/images/*')

for f in files:
    title, ext = os.path.splitext(f)
    if ext in ['.jpg', '.png']:
        img = Image.open(f)
        img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
        img_resize.save(title + '_half' + ext)

 

파일 확장자가 jpg 또는 png인 사진 파일은 크기를 반으로 줄이도록 하고 있습니다.

또는 Pillow(PIL)에서 인식 가능한 사진 파일 확장자를 이용하면 조금 더 편리하게 사용할 수 있습니다.

확장자 파일이 2개가 아닌 3개, 4개… 등 점점 늘어나는 경우에는 계속해서 추가해 줘야 하는 번거로움이 있습니다.

import os
import glob
from PIL import Image

files = glob.glob('./data/temp/images/*')

for f in files:
    try:
        img = Image.open(f)
        img_resize = img.resize((int(img.width / 2), int(img.height / 2)))
        title, ext = os.path.splitext(f)
        img_resize.save(title + '_half' + ext)
    except OSError as e:
        pass

 

Image.open()를 사용해 사진 파일을 불러오도록 하고 있습니다.

사진 파일인 경우에는 사진 사이즈를 변경하는 처리를 하게 됩니다.

하지만 사진 파일이 아닌 경우에는 except가 발생해 아무런 처리를 하지 않습니다.

댓글