이메일에 사진을 첨부하려는데 "첨부 용량 초과"가 뜨거나, 게시판에 올리려다 "한 장당 5MB까지"에 막히는 일이 자주 있습니다. 요즘 스마트폰 사진은 한 장이 5MB를 가볍게 넘기 때문입니다.
사진을 다시 찍을 수는 없으니 이미 있는 파일의 용량만 줄여야 합니다. 용량을 줄이는 지렛대는 크게 둘입니다. 하나는 해상도 축소(가로세로 픽셀 수를 줄이기), 다른 하나는 저장 품질 낮추기(JPEG 압축률 조정)입니다. 이 둘이 각각 얼마나 효과가 있는지 사진 한 장으로 직접 재 보았습니다.
측정에 쓴 사진과 환경
휴대폰 사진과 비슷하게, 가로 4000 세로 3000 픽셀(약 1,200만 화소)에 색이 부드럽게 변하는 그라데이션과 잡티(노이즈)를 섞은 테스트 이미지를 만들었습니다. 노이즈를 넣은 이유는 단색 이미지로 재면 압축이 비현실적으로 잘돼 실제 사진과 동떨어진 수치가 나오기 때문입니다.
측정 환경은 윈도우 11, 파이썬 3.14.3, 이미지 처리 라이브러리 Pillow 12.2.0입니다. 원본은 품질 95로 저장한 JPEG이며 약 7.9MB(8,104.6KB)였습니다.
방법 1, 품질만 낮추기 (해상도는 그대로)
JPEG에는 품질(quality) 값이 있습니다. 100에 가까울수록 원본에 충실하고 용량이 크며, 낮출수록 자잘한 디테일을 버려 용량이 줄어듭니다. 해상도는 4000x3000 그대로 두고 품질만 95에서 80, 60으로 낮춰 재 봤습니다.
| 저장 방식 (해상도 유지) | 용량 | 원본 대비 |
|---|---|---|
| 품질 95 (원본) | 약 8,104.6 KB | 100% |
| 품질 80 | 약 3,546.0 KB | 43.8% (약 56% 감소) |
| 품질 60 | 약 2,001.4 KB | 24.7% (약 75% 감소) |
품질을 95에서 80으로만 낮춰도 용량이 절반 가까이 줄었습니다. 품질 80 구간은 화면으로 볼 때 차이를 느끼기 어려운 경우가 많아 가장 흔히 권하는 지점입니다.
방법 2, 해상도 줄이기 (품질은 그대로)
해상도는 사진을 이루는 점의 개수입니다. 가로 4000픽셀을 1600픽셀로 줄이면 가로세로가 같은 비율로 작아져 점의 개수 자체가 크게 줄어듭니다. 품질은 95로 유지한 채 가로폭만 1600으로 축소해 봤습니다.
| 저장 방식 (품질 95 유지) | 용량 | 원본 대비 |
|---|---|---|
| 4000x3000 (원본) | 약 8,104.6 KB | 100% |
| 1600x1200으로 축소 | 약 746.7 KB | 9.2% (약 91% 감소) |
가로폭을 5분의 2로 줄였을 뿐인데 용량은 10분의 1 아래로 떨어졌습니다. 해상도를 줄이면 가로세로가 함께 작아지므로 용량은 길이가 아니라 면적에 가깝게 줄어듭니다. 화면이나 메신저로 볼 사진이라면 1600픽셀 안팎으로도 충분히 선명합니다.
두 방법을 함께 쓰면
두 지렛대는 곱해집니다. 가로폭을 1600으로 줄이고 품질도 80으로 낮춰 저장하니 약 258.9KB, 원본의 3.2%(약 97% 감소)까지 떨어졌습니다. 7.9MB짜리가 0.25MB가 되니 어지간한 첨부 제한은 가볍게 통과합니다.
다만 한 가지 주의가 있습니다. JPEG 품질을 너무 낮추면(대략 50 아래) 색 경계와 글자 주변에 모자이크 같은 얼룩과 번짐이 눈에 띕니다. 그리고 한 번 줄여 덮어쓰면 버린 화질은 되돌릴 수 없습니다. 늘린다고 원본 선명도가 돌아오지 않습니다.
그래서 원본은 따로 보관하고, 줄인 사진은 새 이름으로 저장하는 습관이 안전합니다.
직접 확인하고 싶다면
아래 파이썬 코드는 테스트 이미지를 만들어 품질과 해상도를 각각 바꿔 저장하고 용량을 출력합니다. Pillow 설치(pip install pillow)만 하면 누구나 같은 절차를 돌려 볼 수 있습니다.
import os, random
from PIL import Image
random.seed(42)
W, H = 4000, 3000
# 그라데이션 + 노이즈로 사진 비슷한 이미지 생성
buf = bytearray(W * H * 3)
i = 0
for y in range(H):
gy = int(y / H * 200)
for x in range(W):
gx = int(x / W * 200)
buf[i] = (gx + 30 + random.randint(-25, 25)) & 0xFF
buf[i+1] = (gy + 60 + random.randint(-25, 25)) & 0xFF
buf[i+2] = ((gx + gy)//2 + 40 + random.randint(-25, 25)) & 0xFF
i += 3
img = Image.frombytes("RGB", (W, H), bytes(buf))
def kb(name):
return os.path.getsize(name) / 1024
img.save("orig_q95.jpg", "JPEG", quality=95) # 원본
img.save("q80.jpg", "JPEG", quality=80) # 품질만 80
img.save("q60.jpg", "JPEG", quality=60) # 품질만 60
small = img.resize((1600, 1200), Image.LANCZOS) # 해상도 축소
small.save("resize_q95.jpg", "JPEG", quality=95) # 해상도만
small.save("both.jpg", "JPEG", quality=80) # 둘 다
for n in ["orig_q95", "q80", "q60", "resize_q95", "both"]:
print(f"{n:12s} {kb(n + '.jpg'):8.1f} KB")
seed를 42로 고정했으니 같은 환경이라면 거의 같은 수치가 나옵니다. 여기 적힌 절감폭은 합성 이미지 기준이며, 실제 사진은 색과 디테일이 많을수록 덜 줄고 단순할수록 더 줄어 수치가 달라집니다. 다만 "해상도를 줄이면 면적만큼 크게 줄고, 품질을 낮추면 화질을 내주고 줄어든다"는 방향은 사진 종류와 무관하게 같습니다.
자주 묻는 질문
Q. 둘 중 무엇을 먼저 손대야 하나요?
보낼 사진이 화면용이라면 해상도부터 줄이는 편이 효율이 좋습니다. 면적에 비례해 크게 줄면서 화질 손상은 적기 때문입니다. 그래도 모자라면 품질을 추가로 낮춥니다.
Q. PNG도 같은 방법이 통하나요?
해상도 축소는 PNG에도 그대로 통합니다. 다만 PNG에는 JPEG 같은 품질 값이 없어, 사진이라면 JPEG로 다시 저장하는 편이 용량 면에서 유리합니다.
Q. 인쇄할 사진도 줄여도 되나요?
인쇄는 화면보다 훨씬 많은 점을 요구합니다. A4 인쇄까지 생각한다면 해상도를 과하게 줄이지 말고 원본을 보관해 두는 편이 안전합니다.
작게 시작해 보겠습니다. 첨부 용량에 또 막혔다면, 사진을 새 이름으로 복사한 뒤 가로폭을 1600픽셀 안팎으로 줄여 저장해 보세요. 원본은 그대로 남고, 보내는 파일만 가벼워집니다.








'파일 형식 백과사전' 카테고리의 다른 글
| PNG를 JPG로 바꾸면 용량이 얼마나 줄까, 두 종류 이미지로 직접 재 봤습니다 (0) | 2026.07.10 |
|---|---|
| Parquet 파일 받았는데 더블클릭해도 안 열립니다, 파이썬과 비전공자용 방법까지 (0) | 2026.07.09 |
| 확장자가 .jsonl인데 JSON이 깨진 게 아닙니다, JSON Lines(NDJSON) 정체와 일반 JSON과의 차이 (0) | 2026.07.07 |
| 받은 JSON을 엑셀로 봐야 할 때, XLSX로 변환하는 가장 깔끔한 방법 (0) | 2026.07.06 |
| JSON "Expecting property name", "Expecting ',' delimiter" 오류, 증상별로 원인 찾고 고치기 (0) | 2026.07.05 |