JPG를 Base64로 변환하는 방법
.jpg나.jpeg파일을 놓거나, 파일 선택 창에서 고르거나, 복사한 이미지를 Ctrl+V로 붙여넣으세요.- 카메라나 휴대폰에서 바로 가져온 사진이라면 최대 너비(예: 1200)를 설정하고 품질을 조정하세요. 기본값은 85%입니다.
- 사진을 공유하거나 게시할 예정이라면 메타데이터(EXIF) 제거를 선택하세요.
- 출력 형식을 고르세요. 기본값은 Data URI이고, 대부분의 API는 일반 Base64를 원합니다. 그런 다음 출력 복사를 누르세요.
미리보기에는 픽셀 크기와, 다시 인코딩한 뒤의 새 파일 크기가 표시되므로 몇 가지 설정을 시도하며 숫자가 줄어드는 것을 볼 수 있습니다.
JPG의 Base64 안에 든 것
모든 JPEG 파일은 SOI 마커 FF D8 FF로 시작하므로 Base64로는 모두 /9j/로 시작합니다. 그다음 문자는 어떤 헤더가 오는지 알려 줍니다.
| 파일 시작 부분 | Base64 시작 부분 | 흔한 출처 |
|---|---|---|
FF D8 FF E0 + JFIF | /9j/4AAQSkZJRg | 이미지 편집기, 웹용 내보내기, 대부분의 변환기 |
FF D8 FF E1 + Exif | /9j/4 다음에 달라지는 문자 | 카메라와 휴대폰 (EXIF 블록이 먼저) |
FF D8 FF DB | /9j/2w | 메타데이터를 지운 파일이나 최소 구성 인코더 |
카메라 JPEG에는 기기 모델, 촬영 시각, 방향, 그리고 위치 기능이 켜져 있었다면 GPS 좌표가 담긴 EXIF 블록이 들어 있습니다. Base64는 이 중 어느 것도 숨기지 않습니다. 누구든 Base64를 JPG로로 문자열을 디코딩하면 메타데이터가 그대로 든 원본 파일을 얻습니다.
인코딩 전에 사진 줄이기
요즘 휴대폰 사진은 몇 메가바이트입니다. Base64로 바꾸면 3분의 1이 더 늘어나서, JSON 요청, CSS 파일, HTML 이메일에는 너무 크고 그 밖의 곳에서도 느립니다.
두 가지 설정이 대부분의 일을 합니다.
- 최대 너비는 최대 너비를 픽셀 단위로 정합니다. 너비를 절반으로 줄이면 픽셀 수는 4분의 1이 됩니다.
- 품질은 JPEG 압축을 조절합니다. 사진을 다시 인코딩할 때, 즉 최대 너비, 변환 형식, 메타데이터(EXIF) 제거 중 하나가 설정되어 있을 때 적용됩니다. 75%에서 85% 사이는 사진에서 차이를 알아보기 어렵지만, 95–100%보다 파일이 훨씬 작아집니다.
JPEG를 다시 인코딩하면 디코딩 후 다시 압축하므로 항상 디테일이 조금씩 사라집니다. 원본에서 한 번만 하고, 결과를 변환기에 다시 넣지 마세요.
JPEG에는 투명도가 없습니다. 배경이 투명한 PNG나 WebP를 JPEG로 바꾸면 투명한 부분이 흰색이 됩니다. 알파 채널이 필요하면 PNG나 WebP를 유지하세요.
JPG Base64가 쓰이는 곳
- JSON API를 통한 사진 업로드. 이미지를 설명하거나 분석하는 AI 비전 모델도 여기에 포함됩니다. 많은 서비스가 큰 이미지를 자기 쪽에서 줄이므로, 더 작은 JPEG를 보내면 눈에 띄는 손실 없이 요청이 빨라집니다.
- HTML의 인라인 썸네일과 자리 표시자. 예를 들어 전체 이미지를 불러오는 동안 보여 주는 20픽셀 너비의 흐린 미리보기.
- 단일 파일 문서. 예를 들어 사진 몇 장이 포함된 HTML 리포트.
웹사이트의 큰 사진은 여전히 일반 이미지 파일이 낫습니다. 캐시와 지연 로딩이 가능하고 srcset으로 여러 크기를 제공할 수 있기 때문입니다.
Python으로 크기 조절과 인코딩
Pillow는 몇 줄로 사진의 크기를 조절하고 다시 인코딩하며, Base64는 표준 라이브러리가 처리합니다. Pillow는 명시적으로 넘기지 않으면 EXIF를 새 파일에 복사하지 않으므로, 이 코드는 메타데이터도 지웁니다.
import base64, io
from PIL import Image
with Image.open("photo.jpg") as im:
im.thumbnail((1024, 1024))
buf = io.BytesIO()
im.save(buf, "JPEG", quality=80)
b64 = base64.b64encode(buf.getvalue()).decode("ascii")
파일 읽기와 스트리밍은 Python의 Base64에서 더 다룹니다.
자주 생기는 문제
- 사진이 회전된 채로 보입니다. 많은 휴대폰은 픽셀을 센서 방향 그대로 저장하고 회전 정보를 EXIF 태그에 넣습니다. 현재 브라우저는 이 태그를 적용하며, 도구가 사진을 다시 그릴 때도 보이는 방향을 유지합니다. EXIF를 무시하는 소프트웨어는 원래 방향으로 보여 줄 수 있습니다.
- Base64가 예상보다 깁니다. 미터에서 입력 크기를 확인하세요. 메신저에서 받은 “작은” 사진도 너비가 3000픽셀일 수 있습니다.
- API가 이미지를 거부합니다.
data:image/jpeg;base64,접두사를 원하는지 Base64만 원하는지 확인하고, 형식은image/jpg가 아니라image/jpeg로 보내세요.
자주 묻는 질문
data URI에는 image/jpg와 image/jpeg 중 무엇을 쓰나요?
image/jpeg입니다. image/jpg는 등록된 형식이 아닙니다. 브라우저는 이미지 바이트를 직접 살펴보기 때문에 그래도 그림을 표시하지만, 미디어 형식을 검증하는 API는 거부할 수 있습니다.
Base64로 바꾼 JPG에 GPS 위치가 아직 들어 있나요?
원본에 있었다면 네. Base64는 EXIF를 포함해 모든 바이트를 복사합니다. 지우려면 메타데이터(EXIF) 제거를 선택하세요. 인코딩 전에 메타데이터 없이 사진을 다시 그립니다.
JPG의 Base64가 /9j/로 시작하는 이유는 무엇인가요?
모든 JPEG는 바이트 FF D8 FF로 시작하고, 이 3바이트가 정확히 /9j/로 인코딩됩니다. 다르게 시작하는 문자열은 파일 이름이 무엇이든 JPEG가 아닙니다.
사진의 Base64를 더 짧게 만들려면 어떻게 하나요?
인코딩하기 전에 픽셀 수와 품질을 줄이세요. 표시 크기에 맞는 최대 너비와 75–85% 정도의 품질이면, Base64 자체에 무엇을 하든 그보다 훨씬 많이 휴대폰 사진이 줄어듭니다.