파이썬 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가 발생해 아무런 처리를 하지 않습니다.
댓글