본문 바로가기

파일 형식 백과사전

파일 이름 뒤 .jpg를 .png로 바꾸면 진짜 변환될까, 흔한 오해와 실제

이미지가 PNG여야 한다고 해서, 파일 이름 끝의 .jpg를 지우고 .png로 바꿔 본 적 있으신가요. 겉보기엔 아이콘도 바뀌고 그럴듯해 보입니다.

그런데 어떤 사이트에 올리면 "형식이 맞지 않는다"며 거부당하기도 합니다. 이름만 바꾼 파일이 정말 PNG가 된 건지, 파일 속을 직접 열어 확인해 봤습니다.

 

확장자만 바꾼 파일과 진짜 변환한 파일의 실측 비교. 원본 JPG 573KB(매직바이트 FF D8 FF E0), 확장자만 png로 바꾼 파일도 573KB에 매직바이트 FF D8 FF E0로 여전히 JPEG, 진짜 PNG 변환은 3966KB에 매직바이트 89 50 4E 47

파일의 진짜 정체는 이름이 아니라 속에 있습니다

모든 파일은 맨 앞에 자기가 무슨 형식인지 알려주는 표시를 담고 있습니다. 이걸 매직 바이트라고 부르는데, 쉽게 말하면 파일 첫머리에 찍힌 형식 도장입니다.

JPG 사진을 만들고, 파일 속 첫 네 바이트를 그대로 읽어 봤습니다. 측정 환경은 윈도우 11, 파이썬 3.12.10, Pillow 12.3.0입니다.

파일 파일 앞부분(매직 바이트) 용량 실제 형식
원본 photo.jpg FF D8 FF E0 573.4 KB JPEG
확장자만 .png로 바꾼 파일 FF D8 FF E0 573.4 KB JPEG
진짜 PNG로 변환한 파일 89 50 4E 47 3,966.2 KB PNG

이름만 .png로 바꾼 파일은 앞부분도, 용량도 원본 JPG와 글자 하나 다르지 않았습니다. 파일을 연 프로그램도 이 파일을 여전히 JPEG로 인식했습니다.

확장자는 파일에 붙인 이름표일 뿐이라, 이름을 바꿔도 속 내용은 그대로입니다.

 


그런데 왜 어떤 곳은 받아 주고 어떤 곳은 거부할까

관대한 프로그램은 이름표를 무시하고 속 내용을 보고 알아서 엽니다. 그래서 확장자만 바꾼 파일도 그냥 열립니다.

반면 형식을 엄격하게 확인하는 업로드 사이트나 프로그램은 파일 속 매직 바이트를 검사합니다. 이름은 PNG인데 속은 JPEG라 앞뒤가 안 맞으니 거부하는 것입니다. 이름만 바꾼 파일이 어디선 되고 어디선 안 되는 이유가 여기 있습니다.

 

진짜로 변환하면 무엇이 달라지나

같은 사진을 실제 변환 도구로 PNG로 바꾸자, 앞부분이 89 50 4E 47로 바뀌었습니다. 이게 PNG의 형식 도장입니다. 속 내용 자체가 PNG 방식으로 다시 쓰인 것입니다.

흥미로운 점은 용량입니다. 573KB였던 사진이 PNG로 바꾸자 약 3,966KB로 일곱 배 가까이 커졌습니다. PNG는 화질 손실 없이 저장하는 방식이라, 색이 복잡한 사진에서는 오히려 용량이 크게 늘어납니다.

사진은 JPG가, 로고나 투명 배경 그림은 PNG가 어울립니다. 무작정 PNG로 바꾸면 용량만 커질 수 있습니다.

 

그래서 제대로 바꾸려면

확장자를 손대는 대신 변환 기능을 쓰면 됩니다. 방법은 어렵지 않습니다.

윈도우라면 기본 그림판에서 파일을 연 뒤 "다른 이름으로 저장"에서 PNG나 JPG를 고르면 실제로 변환됩니다. 맥은 미리보기의 "내보내기"를 쓰면 됩니다. 온라인 변환 사이트도 있지만, 사진이 서버로 올라가니 민감한 이미지라면 기기 안에서 처리하는 편이 안전합니다.

오늘의 한 가지: 확장자 이름을 바꾸는 것은 변환이 아닙니다. "다른 형식으로 저장"을 눌러야 진짜 변환입니다.

 

직접 확인하고 싶다면

아래 코드는 파일 앞 네 바이트를 읽어 실제 형식을 확인합니다. 이름과 상관없이 속 내용을 보는 것입니다.

with open("photo_renamed.png", "rb") as f:
    head = f.read(4)
print(" ".join(f"{b:02X}" for b in head))
# FF D8 FF E0 로 나오면 이름은 png라도 속은 JPEG

 

자주 묻는 질문

Q. 확장자를 바꿨더니 파일이 안 열려요.
이름표와 속이 안 맞아 프로그램이 혼란스러워 하는 경우입니다. 원래 확장자로 되돌리면 대부분 다시 열립니다.

 

Q. 그럼 확장자는 아무 의미가 없나요?
운영체제가 어떤 프로그램으로 열지 정하는 데 씁니다. 그래서 편의상 중요하지만, 파일의 진짜 형식을 바꾸지는 못합니다.

 

Q. 파일 형식을 모를 때 확인할 방법이 있나요?
파일 앞부분(매직 바이트)을 보면 됩니다. 위 코드처럼 첫 몇 바이트를 읽으면 이름과 무관하게 실제 형식을 알 수 있습니다.

 

확장자만 바꾸는 것은 상자에 붙은 라벨만 바꾸는 것과 같습니다. 안에 든 물건은 그대로입니다. 형식을 진짜로 바꾸려면 변환 기능으로 내용을 다시 써 줘야 합니다.

 

이 글의 매직 바이트와 용량은 윈도우 11, 파이썬 3.12.10, Pillow 12.3.0 환경에서 파일을 직접 만들어 읽고 측정한 값입니다.

 

 

 

JSON "Expecting property name", "Expecting ',' delimiter" 오류, 증상별로 원인 찾고 고치기

JSON 파일을 읽히려는데 빨간 글씨로 이런 메시지가 뜬 적이 있을 것입니다.Expecting property name enclosed in double quotes: line 1 column 2 (char 1)Expecting ',' delimiter: line 1 column 15 (char 14)Illegal trailing comma before e

richyeon.com

 

 

 

같은 데이터를 CSV와 Parquet로 저장하면 용량과 읽기 속도가 얼마나 차이 날까

데이터 분석을 하다 보면 "그냥 CSV로 저장하면 되지, 왜 굳이 Parquet를 쓰지?"라는 의문이 들 때가 있습니다. 둘 다 표 형태 데이터를 담는 파일인데, 한쪽은 메모장으로도 열리고 한쪽은 그렇지도

richyeon.com