Base64를 JPG로 변환하는 방법
- 입력란에 문자열을 붙여넣으세요.
/9j/로 시작하는 순수 Base64와data:image/jpeg;base64,URI 전체 모두 되며, 이를 포함한<img>태그나 CSS 규칙도 됩니다. - 상태 표시줄에 올바른 Base64와 감지된 형식 JPEG가 표시되고, 미리보기에 사진과 픽셀 크기, 파일 크기가 나옵니다.
- 파일 이름을 정하고 파일 다운로드를 누르세요.
큰 사진도 괜찮습니다. 수 MB짜리 Base64 문자열도 붙여넣거나 .txt 파일로 열 수 있으며, 4 MB가 넘으면 텍스트 상자에 표시하지 않고 디코딩합니다.
돌려받는 것
디코딩은 인코딩된 바이트를 정확히 그대로 돌려줍니다. 화질은 바뀌지 않고 다시 압축하는 것도 없습니다. 원본 파일에 들어 있던 모든 것이 함께 돌아온다는 뜻이기도 합니다.
- EXIF 메타데이터: 카메라 모델, 촬영 시각, 방향, 위치 기능이 켜져 있었다면 GPS 좌표까지 들어 있습니다. 다른 사람에게서 받은 Base64라면 사진이 보낸 사람의 의도보다 많은 것을 알려 줄 수 있습니다. 다른 곳에 넘길 생각이라면 먼저 메타데이터를 제거하세요. 예를 들어 JPG를 Base64로에서 메타데이터(EXIF) 제거를 쓰면 됩니다.
- 포함된 썸네일과 색상 프로필.
- 이미지 끝 뒤의 추가 데이터. 일부 Android 휴대폰의 모션 포토는 JPEG 뒤에 짧은 동영상을 덧붙이므로, 그런 “사진"은 예상보다 몇 배 클 수 있습니다.
미리보기 아래의 SHA-256으로 저장한 파일이 전달받은 해시와 일치하는지 증명할 수 있습니다.
진짜 JPEG와 JPEG라고 주장할 뿐인 것 구별하기
디코더는 레이블을 무시하고 바이트를 따릅니다. PNG 데이터가 든 data:image/jpeg URI나 WebP가 든 photo_jpg라는 API 필드는 그대로 보고됩니다. “JPEG이(가) 아니라 WebP(으)로 보입니다.“라는 안내와 함께 .webp(으)로 다운로드 버튼이 나옵니다.
이미지 CDN은 브라우저의 Accept 헤더를 보고 출력 형식을 고르므로, photo.jpg로 가져와 브라우저에서 Base64로 인코딩한 이미지가 WebP나 AVIF일 수 있습니다. 브라우저에서 “이미지 복사"로 가져온 이미지는 페이지에 JPEG가 표시되었더라도 대개 PNG로 클립보드에 들어가므로, 클립보드에서 인코딩하면 PNG Base64가 나옵니다.
꼭 JPEG가 필요하다면 이름을 바꿔서는 소용이 없습니다. 파일을 실제 형식으로 저장한 다음 이미지를 Base64로에서 변환 형식을 JPEG로 정해 변환하고, 그 결과를 여기서 디코딩하세요.
잘린 JPEG 찾아내기
JPEG 파일은 마커 FF D9로 끝납니다. 파일 길이를 3으로 나눈 나머지에 따라 Base64 끝부분은 세 가지 중 하나가 됩니다.
| 파일 길이 mod 3 | 마지막 바이트 | Base64 끝부분 |
|---|---|---|
| 2 | FF D9 | /9k= |
| 1 | .. FF D9 | /2Q== |
| 0 | .. FF D9 | /Z, 보통 //Z |
잘린 JPEG도 디코딩은 됩니다. 브라우저가 받은 부분만 그리므로 사진 아래쪽이 회색이거나 사라지고, 프로그레시브 JPEG라면 흐릿하게 보입니다. 흔한 원인은 너무 짧은 데이터베이스 열, 줄 길이를 제한하는 로거, 긴 텍스트를 나누는 메신저 앱입니다. 원본에서 값을 다시 복사하세요.
Python으로 같은 검사를 하면 다음과 같습니다.
import base64
def check_jpeg(b64: str) -> str:
data = base64.b64decode(b64.split(",", 1)[-1])
if not data.startswith(b"\xff\xd8\xff"):
return "not a JPEG"
end = data.rfind(b"\xff\xd9")
if end < 0:
return "truncated: no end-of-image marker"
extra = len(data) - end - 2
return f"complete, {extra} bytes after the end marker" if extra else "complete"
빠른 검사용으로만 쓰세요. 카메라 JPEG에는 자체 FF D9를 가진 EXIF 썸네일이 들어 있으므로, 심하게 잘린 사진도 통과할 수 있습니다. 파일 디코딩은 Python에서 Base64에 더 자세히 있습니다.
자주 생기는 문제
- “길이가 잘못되었습니다” 오류. 대개 복사하다가 줄 바꿈 위치에서 글자 하나가 빠지거나 더해진 것입니다. 값 전체를 다시 복사하세요.
- 잘못된 문자
\. 슬래시가 이스케이프된 JSON(\/9j\/4AAQ...)에서 가져온 문자열입니다. Base64 복구에 넣거나 먼저 JSON 이스케이프를 푸세요. - 사진이 너무 큽니다. Base64는 이미지의 실제 크기를 가립니다. 4 MB 문자열은 3 MB 사진입니다. 크기 행에 디코딩된 크기가, 미리보기 위에 픽셀 크기가 표시됩니다.
자주 묻는 질문
디코딩한 파일은 .jpg와 .jpeg 중 무엇이어야 하나요?
어느 쪽이든 됩니다. 두 확장자는 같은 형식을 뜻하며 모든 프로그램이 둘 다 받습니다. 도구는 .jpg를 쓰며, 긴 형태를 요구하는 시스템이라면 확장자에 jpeg를 입력하세요.
JPEG Base64 문자열이 완전한지 어떻게 확인하나요?
완전한 JPEG는 바이트 FF D9로 끝나므로 Base64는 보통 /9k=, /2Q==, /Z로 끝납니다. 끝이 다른 문자열이나 아래쪽이 사라진 이미지는 모두 잘렸다는 신호입니다.
디코딩한 사진의 EXIF 데이터를 볼 수 있나요?
도구가 EXIF 필드를 나열하지는 않지만, hex 덤프 표시를 열면 Exif 블록과 텍스트 열의 카메라 제조사 이름이 보이는 경우가 많습니다. 전체 목록은 파일을 다운로드해 EXIF 뷰어에서 여세요.
디코딩한 사진이 일부 앱에서 회전되어 보이는 이유는 무엇인가요?
휴대폰은 픽셀을 옆으로 누운 상태로 저장하고 회전 정보를 EXIF 태그에 기록하는 경우가 많습니다. 브라우저는 이를 적용하므로 미리보기는 정상으로 보이지만, 태그를 무시하는 소프트웨어는 원래 방향 그대로 보여 줍니다. 어느 경우든 바이트는 바뀌지 않습니다.