본문 바로가기
Python

Pillow(PIL Fork) 이미지 처리 라이브러리 사용법

by ERLite 2026. 5. 11.

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 처리 시 메모리 관리 필수 → 프레임 추출 후 즉시 저장 권장
  • 기하학적 변환은 좌표계 이해 필요 → 잘못된 매개변수 입력 시 이미지 왜곡 발생
  • 채널 연산은 동일 크기·모드의 이미지에만 적용 가능