Pillow(PIL Fork)는 파이썬에서 이미지 처리와 편집을 쉽게 할 수 있도록 도와주는 라이브러리입니다. 가장 중요한 클래스는 Image이며, 이미지 열기·저장·변환·필터링·그리기 등 다양한 기능을 제공합니다.
📌 설치 방법
- pip 설치
-
bash
pip install Pillow
🖼️ 기본 사용법
이미지 열기
python
from PIL import Image
im = Image.open("example.jpg")
print(im.format, im.size, im.mode) # JPEG (1920, 1080) RGB
- format: 파일 형식(JPEG, PNG 등)
- size: (가로, 세로) 픽셀 크기
- mode: 색상 모드 (RGB, L, CMYK 등)
이미지 표시
python
im.show()
- 디버깅이나 테스트 시 유용하지만, 내부적으로 임시 파일을 저장 후 실행하므로 효율적이지는 않음.
이미지 저장
python
im.save("output.png")
- 확장자에 따라 자동으로 포맷 결정
- 명시적으로 지정 가능:
-
python
im.save("output.jpeg", "JPEG")
🔧 주요 기능
- 크기 변경
-
python
im_resized = im.resize((800, 600)) - 썸네일 생성
-
python
im.thumbnail((128, 128)) - 이미지 변환
-
python
im_gray = im.convert("L") # 흑백 변환 - 필터 적용
-
python
from PIL import ImageFilter im_blur = im.filter(ImageFilter.BLUR) - 텍스트 추가
-
python
from PIL import ImageDraw, ImageFont draw = ImageDraw.Draw(im) font = ImageFont.load_default() draw.text((10, 10), "Hello Pillow!", font=font, fill="red")
📊 기능 요약
기능메서드/모듈설명
| 이미지 열기 | Image.open() | 파일에서 이미지 불러오기 |
| 이미지 저장 | Image.save() | 다양한 포맷으로 저장 |
| 크기 변경 | resize() | 지정 크기로 변경 |
| 썸네일 | thumbnail() | 비율 유지하며 축소 |
| 색상 변환 | convert() | RGB ↔ L(흑백) 등 |
| 필터 | ImageFilter | Blur, Sharpen 등 효과 |
| 텍스트 추가 | ImageDraw | 이미지 위에 글자 쓰기 |
🚨 주의사항
- 대용량 이미지 처리 시 메모리 사용량이 많을 수 있음 → 필요 시 thumbnail() 사용 권장
- show()는 운영체제별로 동작 차이가 있음 → 디버깅용으로만 사용
🖼️ Pillow 고급 기능 예제
Pillow의 고급 기능은 단순한 이미지 열기·저장뿐 아니라 합성, 채널 연산, 색상 관리, 애니메이션 프레임 추출, 기하학적 변환 등 강력한 이미지 처리 작업을 지원합니다. 이를 활용하면 포토샵 수준의 자동화된 이미지 편집을 파이썬 코드로 구현할 수 있습니다.
🖼️ 주요 고급 기능 예제
이미지 합성
python
from PIL import Image, ImageChops
im1 = Image.open("image1.png")
im2 = Image.open("image2.png")
# 두 이미지를 더하기
result = ImageChops.add(im1, im2, scale=2.0, offset=0)
result.show()
- ImageChops 모듈은 덧셈, 뺄셈, 차이, 곱셈 등 채널 연산을 지원합니다.
이미지 향상
python
from PIL import Image, ImageEnhance
im = Image.open("example.jpg")
enhancer = ImageEnhance.Contrast(im)
im_contrast = enhancer.enhance(2.0) # 대비 2배 증가
im_contrast.show()
- ImageEnhance 모듈로 밝기, 색상, 대비, 선명도를 조절할 수 있습니다.
기하학적 변환
python
from PIL import Image
im = Image.open("example.jpg")
# Perspective 변환
im_transformed = im.transform((300, 300), Image.PERSPECTIVE,
data=[1, 0.2, 0, 0.2, 1, 0, 0, 0])
im_transformed.show()
- Image.transform()은 Affine, Perspective, Quad 변환을 지원합니다.
애니메이션 프레임 추출
python
from PIL import Image, ImageSequence
im = Image.open("animation.gif")
for i, frame in enumerate(ImageSequence.Iterator(im)):
frame.save(f"frame_{i}.png")
- GIF 같은 애니메이션 파일에서 프레임별 추출 가능.
색상 조작
python
from PIL import Image, ImageOps
im = Image.open("example.jpg")
im_invert = ImageOps.invert(im) # 색상 반전
im_equalize = ImageOps.equalize(im) # 히스토그램 평활화
- ImageOps 모듈은 반전, 흑백 변환, 히스토그램 평활화, 색상화 등을 제공합니다.
📊 기능 요약
모듈주요 기능
| ImageChops | 채널 연산(덧셈, 뺄셈, 차이 등) |
| ImageEnhance | 밝기·대비·색상·선명도 조절 |
| ImageTransform | Affine, Perspective, Quad 변환 |
| ImageSequence | GIF 등 애니메이션 프레임 추출 |
| ImageOps | 반전, 평활화, 색상화, 크롭 등 |
🚨 활용 시 주의사항
- 대용량 GIF 처리 시 메모리 사용량이 급격히 증가할 수 있음 → 프레임 추출 시 저장을 병행 권장
- 기하학적 변환은 좌표계 이해가 필요 → 잘못된 매개변수 입력 시 이미지 왜곡 발생
- 채널 연산은 동일 크기·모드의 이미지에만 적용 가능
🎞️ 애니메이션 처리
Pillow는 GIF 같은 애니메이션 파일을 프레임 단위로 다룰 수 있습니다. 이를 활용하면 프레임 추출, 편집 후 재조합, 새로운 GIF 생성이 가능합니다.
python
from PIL import Image, ImageSequence
# GIF 열기
im = Image.open("animation.gif")
# 프레임 추출 및 저장
frames = []
for frame in ImageSequence.Iterator(im):
frames.append(frame.copy())
# 첫 번째 프레임에 텍스트 추가 후 다시 GIF로 저장
from PIL import ImageDraw
draw = ImageDraw.Draw(frames[0])
draw.text((10, 10), "Edited!", fill="red")
frames[0].save("edited.gif", save_all=True, append_images=frames[1:])
- ImageSequence.Iterator → GIF의 모든 프레임을 순회
- save_all=True → 여러 프레임을 포함한 GIF 저장
🔄 기하학적 변환
이미지를 단순히 회전·크기 변경하는 것을 넘어, Affine 변환, Perspective 변환 같은 고급 기법을 지원합니다.
python
from PIL import Image
im = Image.open("example.jpg")
# Affine 변환 (기본적인 선형 변환)
matrix = (1, 0.5, 0, 0.5, 1, 0) # 변환 행렬
im_affine = im.transform((400, 400), Image.AFFINE, matrix)
im_affine.show()
# Perspective 변환 (원근 효과)
data = [1, 0.3, 0, 0.3, 1, 0, 0.001, 0.001]
im_perspective = im.transform((400, 400), Image.PERSPECTIVE, data)
im_perspective.show()
- Affine 변환: 회전, 이동, 확대/축소, 기울이기 가능
- Perspective 변환: 원근법 효과 적용
📊 활용 요약
기능예제 메서드설명
| 애니메이션 처리 | ImageSequence.Iterator, save_all=True | GIF 프레임 추출·편집·재조합 |
| Affine 변환 | Image.transform(..., Image.AFFINE, matrix) | 회전·이동·기울이기 |
| Perspective 변환 | Image.transform(..., Image.PERSPECTIVE, data) | 원근법 효과 적용 |
🖼️ Pillow 고급 기능 정리
이미지 합성
- 모듈: ImageChops
- 기능: 덧셈, 뺄셈, 차이, 곱셈 등 채널 연산
- 활용: 두 이미지를 합성하거나 차이 강조
이미지 향상
- 모듈: ImageEnhance
- 기능: 밝기, 대비, 색상, 선명도 조절
- 활용: 사진 보정 및 필터 효과
기하학적 변환
- 메서드: Image.transform()
- 기능: Affine, Perspective, Quad 변환
- 활용: 회전, 기울이기, 원근법 효과
애니메이션 처리
- 모듈: ImageSequence
- 기능: GIF 프레임 추출·편집·재조합
- 활용: GIF 수정, 새로운 애니메이션 생성
색상 조작
- 모듈: ImageOps
- 기능: 색상 반전, 흑백 변환, 히스토그램 평활화, 색상화
- 활용: 예술적 효과, 이미지 분석
📊 전체 요약 표
모듈/기능주요 메서드설명
| ImageChops | add, subtract, difference | 이미지 합성 및 채널 연산 |
| ImageEnhance | enhance() | 밝기·대비·색상·선명도 조절 |
| Image.transform | AFFINE, PERSPECTIVE, QUAD | 기하학적 변환 |
| ImageSequence | Iterator, save_all=True | GIF 프레임 추출·재조합 |
| ImageOps | invert, equalize, grayscale | 색상 반전·평활화·흑백 변환 |
🚨 활용 팁
- 대용량 GIF 처리 시 메모리 관리 필수 → 프레임 추출 후 즉시 저장 권장
- 기하학적 변환은 좌표계 이해 필요 → 잘못된 매개변수 입력 시 이미지 왜곡 발생
- 채널 연산은 동일 크기·모드의 이미지에만 적용 가능
'Python' 카테고리의 다른 글
| Uvicorn ASGI(Asynchronous Server Gateway Interface) 서버 사용방법 (0) | 2026.05.13 |
|---|---|
| Python에서 GUI제작용 tkinter 라이브러리 사용예제 나열 (0) | 2026.05.11 |
| Python으로 유튜브 및 다양한 사이트의 영상·오디오를 다운로드하고 변환 (3) | 2026.05.08 |
| Python을 실행파일로 만드는 방법 (0) | 2026.05.08 |
| (Python)10강: 예외 처리 (Exception Handling) (0) | 2026.05.07 |