이미지 크기 일일이 조정 끝! 파이썬으로 사진 자동 리사이즈하기
이미지 크기 일일이 조정 끝! 파이썬으로 사진 자동 리사이즈하기 (완성 코드 공개)
"쇼핑몰에 올릴 상품 사진 100장을 전부 800×800으로 맞춰야 한다", "블로그에 올릴 사진이 너무 커서 업로드가 안 된다", "SNS 프로필 사진 규격에 맞게 여러 장을 잘라야 한다"…
포토샵이나 그림판으로 이미지를 한 장씩 열어 크기를 조정하고 저장하는 작업은 수십 장만 되어도 손이 아프고 시간이 많이 걸립니다. 파이썬을 한 번만 세팅해두면 폴더 안의 모든 이미지를 원하는 크기로 한꺼번에 리사이즈하고, 원본 비율을 유지하면서 크기를 조정하거나, 일정 크기로 잘라내는 작업을 자동으로 처리할 수 있습니다.
1단계: 준비물 설치
파이썬이 설치되어 있어야 합니다. 없다면 python.org에서 최신 버전을 받아 설치하세요. 설치 시 반드시 "Add Python to PATH"에 체크해야 합니다.
이미지 처리에 필요한 라이브러리를 설치합니다. 터미널(윈도우: CMD 또는 파워셸)을 열고 아래 명령어를 실행하세요:
pip install pillow
pillow는 파이썬에서 가장 많이 쓰이는 이미지 처리 라이브러리입니다. 리사이즈, 자르기, 회전, 포맷 변환, 워터마크 삽입까지 모두 처리할 수 있습니다.
💡 이 코드로 할 수 있는 것: 폴더 안의 jpg, png, webp 등 모든 이미지를 지정한 크기로 자동 리사이즈합니다. 원본 비율 유지 리사이즈, 정사각형으로 크롭, 최대 크기 제한, 포맷 일괄 변환까지 지원합니다.
2단계: 완성 코드
아래 코드를 그대로 복사해서 메모장에 붙여넣고, resize_images.py로 저장하세요. 저장 시 파일 형식은 "모든 파일", 인코딩은 UTF-8로 설정합니다.
from PIL import Image
from pathlib import Path
# ① 설정
INPUT_FOLDER = r"C:\Users\내이름\Desktop\원본이미지" # ← 원본 이미지 폴더
OUTPUT_FOLDER = r"C:\Users\내이름\Desktop\리사이즈결과" # ← 저장 폴더 (원본 보존)
TARGET_WIDTH = 800 # ← 목표 가로 크기 (픽셀)
TARGET_HEIGHT = 800 # ← 목표 세로 크기 (픽셀)
KEEP_RATIO = True # ← True: 비율 유지 리사이즈 / False: 지정 크기로 강제 조정
OUTPUT_FORMAT = "" # ← 포맷 변환 (예: "JPEG", "PNG", "WEBP"). 빈칸이면 원본 포맷 유지
QUALITY = 90 # ← 저장 품질 (JPEG 기준 1~95, 높을수록 고화질·대용량)
# ② 지원 확장자
SUPPORTED = {".jpg", ".jpeg", ".png", ".webp", ".bmp", ".gif", ".tiff"}
# ③ 출력 폴더 생성
output = Path(OUTPUT_FOLDER)
output.mkdir(parents=True, exist_ok=True)
# ④ 이미지 처리
input_folder = Path(INPUT_FOLDER)
images = [f for f in input_folder.iterdir()
if f.is_file() and f.suffix.lower() in SUPPORTED]
print(f" 📂 처리할 이미지: {len(images)}개")
success = 0
failed = 0
for img_path in sorted(images):
try:
with Image.open(img_path) as img:
orig_w, orig_h = img.size
# ⑤ 리사이즈 방식 선택
if KEEP_RATIO:
# 비율 유지: 가로·세로 중 큰 쪽 기준으로 축소
img.thumbnail((TARGET_WIDTH, TARGET_HEIGHT), Image.LANCZOS)
else:
# 강제 리사이즈: 비율 무시하고 정확히 지정 크기로
img = img.resize((TARGET_WIDTH, TARGET_HEIGHT), Image.LANCZOS)
new_w, new_h = img.size
# ⑥ 저장 포맷 및 파일명 결정
fmt = OUTPUT_FORMAT.upper() if OUTPUT_FORMAT else img.format or "JPEG"
ext_map = {"JPEG": ".jpg", "PNG": ".png", "WEBP": ".webp"}
new_ext = ext_map.get(fmt, img_path.suffix.lower())
out_path = output / (img_path.stem + new_ext)
# JPEG 저장 시 RGBA → RGB 변환 (투명도 제거)
if fmt == "JPEG" and img.mode in ("RGBA", "P"):
img = img.convert("RGB")
save_kwargs = {"quality": QUALITY} if fmt == "JPEG" else {}
img.save(out_path, format=fmt, **save_kwargs)
print(f" ✔ {img_path.name} {orig_w}×{orig_h} → {new_w}×{new_h}")
success += 1
except Exception as e:
print(f" ✘ {img_path.name} 실패: {e}")
failed += 1
print(f"\n✅ 완료! 성공: {success}개 / 실패: {failed}개 → {OUTPUT_FOLDER}")
3단계: 실행 방법
- 코드 ① 설정의
INPUT_FOLDER에 원본 이미지가 있는 폴더 경로를 입력합니다. OUTPUT_FOLDER에 결과를 저장할 폴더 경로를 입력합니다. 원본 폴더와 다른 경로를 입력해 원본을 보존합니다.TARGET_WIDTH와TARGET_HEIGHT에 원하는 크기를 입력합니다.KEEP_RATIO를True로 설정하면 비율을 유지하며 축소하고,False로 설정하면 정확히 지정한 크기로 강제 변환합니다.- 터미널에서 아래 명령어로 실행합니다:
python resize_images.py
정상 실행 시 터미널에 이렇게 출력됩니다:
📂 처리할 이미지: 5개 ✔ 상품사진_001.jpg 3024×4032 → 600×800 ✔ 상품사진_002.jpg 4032×3024 → 800×600 ✔ 상품사진_003.png 1920×1080 → 800×450 ✔ 상품사진_004.jpg 2448×3264 → 600×800 ✔ 상품사진_005.webp 1080×1080 → 800×800 ✅ 완료! 성공: 5개 / 실패: 0개 → C:\Users\내이름\Desktop\리사이즈결과
원본 파일은 그대로 유지되고, 결과 폴더에 리사이즈된 이미지가 저장됩니다. 각 이미지의 원래 크기와 변환된 크기가 터미널에 출력됩니다.
4단계: 자주 발생하는 오류와 해결법
오류 1: OSError: cannot write mode RGBA as JPEG
투명 배경(RGBA)을 가진 PNG 이미지를 JPEG로 저장하려 할 때 발생합니다. 코드에 이미 RGBA → RGB 변환이 포함되어 있지만, OUTPUT_FORMAT = "JPEG"로 명시적으로 설정했을 때만 동작합니다. 투명 배경이 있는 이미지는 OUTPUT_FORMAT = "PNG"로 설정하거나 빈칸으로 두세요.
오류 2: 리사이즈 후 이미지가 흐릿하게 보임
원본보다 크게 확대할 경우 화질이 저하됩니다. pillow의 Image.LANCZOS는 가장 고품질의 보간법을 사용하지만, 이미지를 원본보다 크게 만드는 것은 화질 손실이 발생합니다. 리사이즈는 원본보다 작게 줄이는 방향으로 사용하는 것을 권장합니다.
오류 3: GIF 파일 처리 후 애니메이션이 사라짐
pillow의 기본 리사이즈는 GIF의 첫 번째 프레임만 처리합니다. 애니메이션 GIF가 필요하다면 SUPPORTED 목록에서 ".gif"를 제거하고 별도로 처리하세요.
응용: 이미지를 정사각형으로 잘라내고 싶다면
쇼핑몰이나 SNS 프로필처럼 정사각형 이미지가 필요할 때는 KEEP_RATIO = False 대신 중앙을 기준으로 정사각형으로 자르는 방법을 사용합니다. 코드 ⑤ 리사이즈 방식 부분을 아래로 교체하세요.
CROP_SIZE = 800 # ← 자를 정사각형 크기 (픽셀) # 짧은 쪽을 기준으로 축소 후 중앙 크롭 ratio = CROP_SIZE / min(orig_w, orig_h) new_w = int(orig_w * ratio) new_h = int(orig_h * ratio) img = img.resize((new_w, new_h), Image.LANCZOS) # 중앙 기준으로 정사각형 크롭 left = (new_w - CROP_SIZE) // 2 top = (new_h - CROP_SIZE) // 2 img = img.crop((left, top, left + CROP_SIZE, top + CROP_SIZE))
💡 이전 게시글과 결합하면: 리사이즈 후 폴더 자동 백업 편으로 결과 이미지를 자동 백업하거나, ZIP 자동 압축 편으로 리사이즈된 이미지 전체를 압축해서 한 번에 전송할 수 있습니다.
핵심 요약
- 준비물: Python + pillow 설치 (pip install pillow)
- 설정: INPUT_FOLDER, OUTPUT_FOLDER, TARGET_WIDTH, TARGET_HEIGHT, KEEP_RATIO만 수정
- 실행: 터미널에서 python resize_images.py 입력
- 결과: 원본 보존, 리사이즈된 이미지 별도 폴더에 저장, 원본·변환 크기 터미널 출력
이 코드를 응용하면 이미지에 날짜·저작권 텍스트 워터마크를 자동 삽입하거나, jpg·png·webp 포맷을 일괄 변환하는 것도 가능합니다.
