극초보 바이브코딩 #5 · 파이썬 Pillow

사진 용량 한꺼번에 줄이기

"파일 크기가 너무 큽니다." 사진 한 장이면 그림판으로 줄이면 되지만, 50장이면 이야기가 달라요. 바로 줄이고 싶다면 아래 도구를, 파이썬으로 내 도구를 만들고 싶다면 실습으로 내려가세요.

바로 줄이기

사진은 이 브라우저 안에서만 줄여요. 서버로 올리지 않아요. 세로로 찍은 사진도 바로 세워서 저장하고, 원본보다 작은 사진은 억지로 키우지 않아요. 아이폰 .heic 사진은 브라우저가 못 여는 경우가 많아요(사파리 제외).

0준비: 폴더 두 개와 설치 한 줄

사진줄이기 폴더 안에 원본 photos 폴더, resize.py, 결과 small 폴더가 있는 구조
  1. 바탕화면에 사진줄이기 폴더, 그 안에 photos 폴더를 만들어요.
  2. 줄일 사진을 photos에 복사해 넣어요. 옮기지 말고 복사! 원본은 원래 자리에 남겨 두는 게 안전장치예요.
  3. 사진줄이기 폴더의 주소창에 cmd → 엔터로 검은 창을 열고 설치해요.
pip install pillow

pip install PIL은 안 돼요("No matching distribution found for PIL"). 설치할 때 이름은 pillow, 코드에서 부를 때 이름은 PIL이에요. 옛날 라이브러리(PIL)를 이어받은 게 Pillow라서 그래요. 파이썬 설치는 #4의 0단계를 보세요.

1AI에게 세 줄로 요청하기

파이썬 Pillow로 폴더 안의 사진들을 한꺼번에 줄이는 코드를 짜줘.
photos 폴더 안의 jpg와 png를 긴 쪽 1280픽셀로 줄여줘.
결과는 small 폴더를 새로 만들어서 거기에 저장해줘.

일부러 짧게 뒀어요. 이 세 줄만으로도 사진은 줄어들지만, 몇 가지가 빠져 있어서 결과가 아쉬울 거예요. 뭐가 아쉬운지 직접 돌려 보고 미션에서 하나씩 채워요.

2연습장에서 바로 실행하기

받은 코드를 붙여넣고 ▶ 파이썬 실행. 연습장의 photos 폴더에는 예제 사진 3장(큰 가로 사진, 세로로 찍은 폰 사진, 작은 사진)이 들어 있어요. 내 사진으로 해 보고 싶다면 내 사진 넣기를 누르세요. 결과는 small/ 폴더 그림으로 아래에 나타나요.

내 컴퓨터에서 실행하려면
  1. 메모장에 코드를 붙여넣고 사진줄이기 폴더에 저장해요(photos 안이 아니에요). 파일 형식 모든 파일, 이름 resize.py, 인코딩 UTF-8.
  2. 검은 창에 python resize.py → small 폴더가 생기면 성공. 탐색기에서 보기 → 자세히로 바꾸면 KB가 보여요.

3미션: 눕는 사진부터 잡기

  1. 기본: small 폴더에 줄어든 사진

    사진이 긴 쪽 1280px 이하로 줄어서 small에 저장돼야 해요.

  2. 뭘 했는지 보여주기

    한 장마다 한 줄씩, 마지막에 합계. 예시 한 줄: "사진을 한 장 처리할 때마다 "파일이름 2540KB -> 173KB"처럼 한 줄씩 보여주고, 맨 마지막에 "5장 완료 12.4MB -> 0.85MB"처럼 합계도 보여줘."

  3. 세로 사진이 눕는 문제 ⭐

    폰 사진에는 "90도 돌려서 보여 주세요"라는 회전 메모가 따로 들어 있어요. 줄이다가 그 메모가 떨어지면 누운 채로 보여요. 이걸 AI에게 설명해서 고쳐 보세요. 예제 사진 중 IMG_0002_세로.jpg로 검사해요.

  4. 내 마음대로 조절되게

    긴 쪽 크기와 화질 숫자를 파일 맨 윗줄에서 바꿀 수 있게. 블로그용 1280, 메일용 800처럼요.

  5. 아이폰 사진(.heic)도 되게

    Pillow는 기본으로 .heic를 못 열어요. 힌트: 추가로 설치할 게 있는지 AI에게 물어보세요. 연습장에서는 그 부품을 설치할 수 없어서 코드에 들어갔는지만 보고, 실제 확인은 내 컴퓨터에서 해요.

  6. 자유

    파일 이름 뒤에 _small 붙이기, 이미 줄인 사진 건너뛰기, 폴더 안의 폴더까지 훑기, 투명한 PNG도 에러 없이…

안 될 때 확인할 것

증상원인과 해결
No matching distribution found for PILpip install pillow가 맞아요
module 'PIL.Image' has no attribute 'ANTIALIAS'AI가 옛날 코드를 줬어요(Pillow 10부터 없어진 이름). "Pillow 최신 버전에서 되게 고쳐줘". 아주 흔해요
cannot write mode RGBA as JPEG투명 배경 PNG를 JPG로 저장하려 했어요. "투명한 PNG도 에러 없이 처리되게 해줘"
FileNotFoundError, small 폴더가 비어 있음검은 창이 다른 폴더에 있거나, photos 이름 오타, 사진이 .heic
세로 사진이 누워서 나옴회전 메모(EXIF)가 떨어져 나갔어요. 미션 3
작은 사진이 억지로 커져서 뿌옇다"원본보다 작을 때는 그대로 두라"고 요청

실험: 가로세로를 3분의 1로 줄였는데 왜 용량은 15분의 1일까?

첫째, 화소 수는 넓이예요. 4032×3024는 1,219만 화소, 1280×960은 123만 화소예요. 긴 쪽은 3분의 1이지만 알갱이 수는 10분의 1이에요. 둘째, JPEG은 비슷한 부분을 뭉뚱그려 저장해요. 하늘처럼 비슷한 넓은 면은 "여기부터 여기까지 대충 이 색"으로 적으니까 화소가 준 것보다 더 줄어요. 이걸 손실 압축이라고 하고, 버린 정보는 돌아오지 않아요.

4032×3024는 1219만 화소, 1280×960은 123만 화소로 10분의 1. 긴 쪽 1920·1280·1024·800px일 때 파일 크기 353·174·115·71KB

같은 사진을 화질 85로 20번 다시 저장하면? 위 도구에서 사진을 고른 뒤 눌러 보세요. 사진이 없으면 예제 그림으로 해요.

비교는 첫 번째 저장본과 20번째 저장본의 픽셀 차이(0~255)예요. 브라우저의 JPEG 저장 방식으로 잰 값이라 파이썬 Pillow와는 숫자가 조금 달라요.

그래서 원본을 덮어쓰면 안 돼요. 평균으로는 거의 티가 안 나도, 어떤 픽셀은 크게 틀어져요. 블로그 본문은 긴 쪽 1280px이면 대부분 충분하고, 메일 첨부는 800px, 인화나 보관이 목적이면 아예 줄이지 마세요.

블로그에서 자세히 보기: 극초보 바이브코딩 #5 원문

이전 실습: #4 와이파이 QR코드 · 전체 실습 목록

자주 묻는 질문

화질은 몇으로 하면 되나요?

블로그와 메일이라면 85 정도가 눈으로 구분이 잘 안 되면서 용량이 많이 줄어요. 1280px 기준으로 95는 85보다 두 배 가까이 크고, 75는 조금 더 작아요.

사진이 서버로 올라가나요?

아니요. 바로 줄이기와 연습장 모두 이 브라우저 안에서만 처리해요. 페이지를 닫으면 사라져요.

세로 사진이 왜 눕나요?

폰은 사진을 가로로 저장하고 "돌려서 보여 줘"라는 회전 메모(EXIF)를 붙여요. 줄이는 과정에서 이 메모가 빠지면 누운 원래 모습대로 보여요. 저장 전에 메모대로 실제로 돌려 주면 해결돼요.