Python 라이브러리인 Pillow 로 이미지를 처리하는 몇가지 방법을 정리해 보았다.
우선 가상환경을 사용해 프로젝트 폴더 별로 파이썬 환경을 분리하고 라이브러리 설치 위치도 분리한다.
나는 direnv를 사용했다.
# .envrc
use python 3.8.0 # python 버전은 3.8.0을 사용
. envrc 파일 생성
direnv allow
. envrc파일을 생성하면 터미널에 Run `direnv allow` to approve its content
라는 명령어가 뜬다. (안뜨면 터미널에서 엔터를 한번 눌러보자)
allow 명령어로 현재 디렉터리의 .envrc 파일의 사용을 허가하면
디렉터리에 .direnv
폴더가 생성된다.
pip install Pillow
pip로 Pillow를 설치
pip show Pillow
Name: Pillow
Version: 8.0.1
...
Location: /Users/yeinlee/private_exercise/environ/.direnv/python-3.8.0/lib/python3.8/site-packages
...
Location을 보면 Pillow가 아까 만들어진 가상환경 폴더인 .direnv
아래에 설치된 걸 확인할 수 있다.
from PIL import Image
im = Image.open('original.png')
# 이미지 파일 객체
print(im) # <PIL.PngImagePlugin.PngImageFile image mode=RGB size=1200x599 at 0x104659700>
Pillow 라이브러리 패키지에서 Image를 임포트한다.
Image.open() 메서드는 이미지 파일을 열어 이미지 객체를 리턴한다.
print(im.size) # (1200, 599)
이미지 객체의 size 속성은 이미지의 크기(width, height)를 리턴한다.
print(im.format) # PNG
im.save('converted.gif')
save 메소드에 확장자를 변경한 파일명을 넘기면 확장자가 변경된 파일이 새로 저장된다.
Image객체.save() 메서드는 이미지 파일을 새로 저장할 때 사용
from PIL import Image
# 기존 이미지로 객체 생성
im = Image.open('original.png')
# 사이즈 출력
print(im.size) # (1200, 599)
# 사이즈가 변경된 새로운 이미지 객체 생성
im2 = im.resize((600, 600))
# 사이즈 출력
print(im2.size) # (600, 600)
im2.save('resized.gif')
from PIL import Image
im = Image.open('original.png')
print(im.size) # (1200, 599)
im.thumbnail((600, 600))
im.save('thumbnail.gif')
im2 = Image.open('thumbnail.gif')
print(im2.size) # (600, 300)
Image 객체의 thumbnail((width, height))
메서드는 특정 크기(가로 세로 비율은 유지)의 썸네일 이미지 객체를 리턴한다.
save 메서드를 호출하면 600 x 300 크기의 썸네일 이미지가 새로 저장된다.
⚠️ 600 x 600이 아니다.
resize()는 정확히 (600, 600) 사이즈가 변경되는 반면 thumbnail()은 가로 세로 비가 유지되는 한에서 사이즈가 변경된다.
따라서 1200x599 이미지를 thumbnail((600, 600))
하면 600x300 으로 resize 하는 것과 동일하다.
from PIL import Image
im = Image.open('original.png')
print(im.size) # (1200, 599)
im2 = im.crop((0, 300, 600, 600))
im2.save('cropimage.gif')
print(im2.size) # (600, 300)
crop() 메서드로 이미지의 일부를 잘라낸다.
파라미터는 왼쪽 윗 모서리를 (0,0)로 기준을 잡았을 때의
(left_start, top_start, left_start+width, top_start+height) 좌표 정보를 튜플로 전달한다.
튜플: (가로 시작점, 세로 시작점, 가로 범위, 세로 범위)
crop((0, 300, 600, 600))
로 가로 시작점은 0, 세로 시작점은 300, 가로 길이는 600, 세로 길이는 300 인 cropimage.gif
이미지가 저장된다.
from PIL import Image
im = Image.open('original.png')
# 90도 회전
im2 = im.rotate(90)
im2.save('rotated.gif')
from PIL import Image, ImageFilter
im = Image.open('original.png')
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.gif')
이미지 객체의 filter(필터종류)
메서드를 호출한다.
Pillow는 이미지를 필터링하기 위한 기본적인 필터들을 제공한다. 필터종류는 ImageFilter 모듈을 import 해서 사용할 수 있다.