스크린샷을 챗GPT에 붙여넣을 때는 아무 문제가 없다가, 막상 API로 같은 이미지를 보내면 오류가 나는 경우가 있습니다. 파일 확장자가 JPG인지 PNG인지 WEBP인지에 따라 이미지 AI가 다르게 반응하는 걸까요? 결론부터 말씀드리면, 모델은 확장자를 보지 않습니다. 하지만 그렇다고 아무 파일이나 다 되는 것도 아닙니다.
목차
결론: 모델에게 확장자는 전달되지도 않습니다
이미지 AI에 그림을 보내는 방식은 파일을 통째로 건네주는 것이 아닙니다. API 요청 본문을 뜯어보면 실제로 들어가는 값은 두 가지뿐입니다.
- media_type(MIME 타입) —
image/png,image/jpeg같은 형식 선언 - 이미지 데이터 — base64로 인코딩된 실제 바이트
여기 파일명이 들어갈 자리는 없습니다. photo.jpg든 photo.png든, 파일명은 요청에 실리지 않고 컴퓨터 안에 남습니다. 모델이 받는 것은 디코딩된 픽셀 값뿐입니다. 그러니 “확장자를 알아서 알아보느냐”는 질문에 대한 정확한 답은, 알아볼 필요조차 없다는 것입니다.
대신 실제 관문 역할을 하는 것은 MIME 타입과 파일의 실제 바이트입니다. 이 둘이 일치해야 하고, 동시에 그 형식이 해당 서비스의 지원 목록에 들어 있어야 합니다.
서비스별로 지원하는 이미지 형식은 다릅니다
JPEG·PNG·WEBP는 세 서비스 모두 공통으로 지원합니다. 갈리는 지점은 GIF와 HEIC입니다. 아이폰 기본 촬영 형식인 HEIC는 제미나이만 받아들이고, 클로드와 챗GPT는 거부합니다.
| 서비스 | 지원 형식(MIME) | 지원하지 않는 대표 형식 | 용량·개수 제한 |
|---|---|---|---|
| Claude (Anthropic) | image/jpeg, image/png, image/gif, image/webp | HEIC, BMP, TIFF, SVG, AVIF | 이미지당 10MB(base64 기준), 최대 8000×8000px |
| ChatGPT (OpenAI) | image/png, image/jpeg, image/webp, 비애니메이션 GIF | HEIC, BMP, TIFF, SVG, AVIF | 요청당 총 512MB, 이미지 최대 1500장 |
| Gemini (Google) | image/png, image/jpeg, image/webp, image/heic, image/heif | BMP, TIFF, SVG, AVIF | 인라인 전송 시 요청 전체 20MB, 이미지 최대 3600장 |
공식 사양은 각 사 개발자 문서에서 확인하실 수 있습니다. Anthropic Vision 문서, OpenAI Images and vision 문서, Gemini 이미지 이해 문서가 정본입니다.
확장자만 바꿔서 저장하면 어떻게 될까요
아이폰에서 받은 HEIC 파일의 이름을 photo.jpg로 고쳐도 파일 내용은 여전히 HEIC입니다. 확장자는 그저 이름표일 뿐, 파일 앞부분에 박힌 형식 표식(매직 넘버)까지 바뀌지는 않기 때문입니다. 이 상태에서 벌어지는 일은 사용 경로에 따라 다릅니다.
챗 화면에 올릴 때
브라우저나 앱이 파일 내용을 읽어 형식을 판별하는 경우가 많아, 이름만 바꾼 파일도 그대로 인식되는 일이 흔합니다. 문제가 생기는 지점은 모델이 아니라 업로드 검사 단계입니다. 서비스가 확장자를 기준으로 허용 목록을 검사하면 파일 선택 창에서부터 걸리고, 반대로 내용을 기준으로 검사하면 이름을 아무리 .jpg로 바꿔도 “지원하지 않는 형식”이라며 튕겨냅니다.
API로 보낼 때
이쪽이 훨씬 엄격합니다. 선언한 media_type과 실제 바이트가 어긋나면 요청 자체가 거부될 수 있습니다. 흔한 실수는 코드에서 확장자를 잘라내 MIME 타입을 만드는 방식입니다.
- HEIC 파일을
.jpg로 이름만 바꿔 놓고image/jpeg로 선언 → 디코딩 실패 - PNG 파일을
image/jpeg로 잘못 선언 → 형식 불일치 오류
안전한 방법은 파일명이 아니라 파일 내용에서 형식을 판별한 뒤 그 값을 MIME 타입으로 넘기는 것입니다. 확장자를 신뢰하지 않는 것이 핵심입니다.
지원 목록에 없는 형식은 변환이 답입니다
BMP, TIFF, SVG, AVIF, PSD, 카메라 RAW 파일은 세 서비스 어디서도 직접 받아주지 않습니다. 특히 헷갈리기 쉬운 두 가지를 짚어보겠습니다.
- SVG는 픽셀이 아니라 도형을 그리는 명령을 적어둔 텍스트 파일입니다. 이미지처럼 보이지만 이미지 입력으로는 처리되지 않습니다. PNG로 렌더링해서 넣거나, 아예 코드 텍스트로 붙여넣어 읽히는 편이 낫습니다.
- AVIF는 웹에서 점점 늘고 있는 최신 형식이지만 아직 지원 목록에 없습니다. 웹페이지에서 저장한 이미지가 이유 없이 거부된다면 확장자를 먼저 확인해 보시기 바랍니다.
해결책은 간단합니다. PNG나 JPEG로 한 번 변환해서 넣으면 됩니다. 다만 사진을 JPEG로 여러 번 반복 저장하면 화질이 계속 깎이므로, 글자가 많은 화면 캡처는 PNG로 두는 편이 안전합니다.
형식보다 결과를 좌우하는 것은 해상도입니다
실무에서 인식률과 비용을 실제로 흔드는 변수는 확장자가 아니라 이미지 크기입니다. 세 서비스 모두 이미지를 잘게 쪼갠 뒤 조각 수만큼 토큰을 계산하기 때문입니다.
| 서비스 | 토큰 계산 방식 | 1000×1000px 이미지 기준 |
|---|---|---|
| Claude | 28×28px 패치 단위로 분할 | 약 1296 토큰 |
| ChatGPT | GPT-5 계열은 32×32px 패치, GPT-4o 계열은 512px 타일 | 모델·detail 설정에 따라 상이 |
| Gemini | 가로세로 384px 이하는 258 토큰, 그보다 크면 768×768 타일마다 258 토큰 | 약 1032 토큰(타일 4개) |
여기서 중요한 사실이 하나 더 있습니다. 토큰은 픽셀 수로 계산되지 파일 용량으로 계산되지 않습니다. 같은 그림을 WEBP로 압축해 용량을 3분의 1로 줄여도, 가로세로 크기가 그대로면 토큰은 한 톨도 줄지 않습니다. 비용을 줄이시려면 압축률이 아니라 해상도를 낮춰야 합니다.
반대 방향의 함정도 있습니다. 각 서비스는 자체 상한을 넘는 이미지를 알아서 축소한 뒤 처리합니다. 클로드의 경우 최신 모델은 긴 변 2576px, 이전 모델은 1568px가 기준선입니다. 4K 스크린샷을 그대로 올리면 축소 과정에서 작은 글씨가 뭉개져 오히려 못 읽는 상황이 생깁니다. 이럴 때는 전체를 통째로 올리기보다 필요한 영역만 잘라서 올리는 편이 훨씬 정확합니다.
놓치기 쉬운 세 가지
애니메이션 GIF는 첫 장면만 봅니다
움직이는 GIF를 올려도 모델은 첫 프레임 한 장만 인식합니다. 움직임 자체를 설명하게 하려면 주요 장면을 여러 장의 정지 이미지로 뽑아서 함께 넣으셔야 합니다.
투명 배경 PNG는 의도대로 안 보일 수 있습니다
알파 채널(투명도)이 있는 PNG는 처리 과정에서 배경이 특정 색으로 합성됩니다. 흰 글씨에 투명 배경인 로고를 올렸다가 “아무것도 안 보인다”는 답을 받는 경우가 여기 해당합니다. 이런 이미지는 배경색을 직접 채워서 올리시는 편이 확실합니다.
이미지에 담긴 촬영 정보는 읽지 않습니다
사진 파일에는 촬영 일시나 위치 같은 메타데이터가 들어 있지만, 모델에게는 전달되지 않습니다. Anthropic은 공식 문서에서 이미지 메타데이터를 파싱하지 않는다고 명시하고 있습니다. “이 사진 언제 찍은 거야?”라는 질문에 돌아온 답이 그럴듯하다면, 그건 파일 정보를 읽은 것이 아니라 사진에 보이는 단서로 추측한 것입니다.
정리하면 이렇습니다
- 모델은 확장자를 받지 않습니다. MIME 타입과 실제 바이트만 봅니다.
- JPEG·PNG·WEBP는 공통 안전지대입니다. HEIC는 제미나이만, GIF는 첫 프레임만 처리됩니다.
- BMP·TIFF·SVG·AVIF·RAW는 PNG나 JPEG로 변환해서 넣으셔야 합니다.
- API에서는 확장자로 MIME 타입을 만들지 말고 파일 내용에서 판별하시기 바랍니다.
- 비용은 용량이 아니라 해상도가 결정합니다. 압축이 아니라 축소가 답입니다.
- 작은 글씨를 읽혀야 한다면 전체 화면 대신 필요한 부분만 잘라 넣으십시오.
결국 “확장자를 알아서 인식하는가”보다 중요한 질문은 “이 형식이 지원 목록에 있는가, 그리고 이 크기가 적절한가”입니다. 이 두 가지만 챙기시면 형식 때문에 막히는 일은 거의 없습니다.