작성자 주: Nano Banana 2 API가 왜 JPEG 대신 PNG 형식으로 이미지를 출력하는지, 그리고 AI Studio에서 4K 이미지 용량이 30MB에서 8MB로 급격히 줄어든 기술적 이유를 상세히 분석합니다. Vertex AI와 AI Studio 간의 형식 제어 차이점도 함께 다룹니다.
많은 개발자가 Nano Banana 2 API로 이미지를 생성할 때 이런 의문을 갖곤 합니다. API가 반환하는 데이터는 base64인데, 저장하면 PNG일까요, JPEG일까요? 더 이해하기 어려운 점은 동일한 4K 해상도임에도 AI Studio에서 생성된 이미지 용량이 기존 30MB 이상에서 8MB 정도로 크게 줄었다는 것입니다. 이번 글에서는 API의底层(기저) 메커니즘을 바탕으로 형식 제어와 용량 변화의 진실을 파헤쳐 보겠습니다.
핵심 가치: 이 글을 읽고 나면 Nano Banana 2 API에서 PNG 형식으로 이미지를 출력하는 올바른 방법과 4K 이미지 용량이 줄어든 근본적인 이유를 완벽히 이해하게 될 것입니다.

Nano Banana 2 API 이미지 출력 형식 핵심 요점
먼저 중요한 사실 하나를 짚고 넘어갈게요. Nano Banana 2 API가 반환하는 이미지 데이터는 base64로 인코딩되어 있지만, base64는 전송 인코딩 방식일 뿐이며 실제 이미지 형식을 결정하는 것은 내부의 바이트 데이터입니다.
| 요점 | 설명 | 영향 |
|---|---|---|
| 기본 반환 형식 | base64 인코딩, image/png로 선언되나 실제 바이트는 JPEG일 수 있음 |
그대로 저장 시 형식 오류 발생 가능 |
| AI Studio 형식 제어 | outputMimeType 매개변수 미지원 |
클라이언트 측 변환 필수 |
| Vertex AI 형식 제어 | imageOutputOptions로 PNG/JPEG 지정 가능 |
서버 측 제어 가능 |
| 4K 용량 변화 | ~30MB에서 ~8MB로 감소 | 서버 측 연산 조정으로 인한 결과 |
| 알려진 버그 | API는 PNG 반환이라 하지만 실제로는 JPEG 바이트일 수 있음 | 매직 바이트(magic bytes) 확인 필요 |
Nano Banana 2 API 이미지 출력의底层(기저) 메커니즘
Nano Banana 2(모델 ID: gemini-3.1-flash-image-preview)의 이미지 출력은 inlineData 객체를 통해 반환되며 구조는 다음과 같습니다.
{
"candidates": [{
"content": {
"parts": [{
"inlineData": {
"mime_type": "image/png",
"data": "<BASE64_IMAGE_DATA>"
}
}]
}
}]
}
여기에는 구글 공식 확인된 버그(GitHub Issue #1824)가 하나 있습니다. 응답의 mime_type 필드는 image/png로 선언되어 있지만, 실제로 디코딩된 바이트 데이터는 JPEG 형식일 수 있습니다. 즉, API가 반환하는 MIME 타입을 무조건 신뢰해서는 안 되며, 파일 헤더의 매직 바이트를 통해 실제 형식을 판단해야 합니다.
판단 방법은 간단합니다. JPEG 파일 헤더는 \xff\xd8이고, PNG 파일 헤더는 \x89PNG\r\n\x1a\n입니다.

Nano Banana 2 API에서 PNG 형식으로 출력하는 3가지 방법
이번 글의 핵심은 여러분이 원하는 결과물을 확실하게 PNG 형식으로 얻는 방법입니다.
방법 1: 클라이언트 측 Python 변환 (AI Studio 추천)
AI Studio의 Gemini API는 서버 측에서 형식을 직접 제어하는 기능을 지원하지 않기 때문에, 클라이언트 측에서 변환하는 것이 가장 확실합니다.
import base64
from PIL import Image
from io import BytesIO
# Nano Banana 2를 호출하여 이미지 생성
from google import genai
from google.genai import types
client = genai.Client(api_key="YOUR_API_KEY")
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=["햇살 아래 낮잠 자는 주황색 고양이"],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"],
image_config=types.ImageConfig(
image_size="4K",
aspect_ratio="1:1"
),
)
)
# PNG 형식으로 저장 (API가 실제로 어떤 형식을 반환하든 상관없음)
for part in response.parts:
if image := part.as_image():
image.save("output.png", format="PNG") # 강제로 PNG 무손실 저장
핵심은 image.save("output.png", format="PNG")에서 format="PNG"를 명시적으로 지정하는 것입니다. format 매개변수를 생략하면 Pillow가 파일 확장자를 보고 형식을 추론하는데, 대부분 문제없지만 명시적으로 선언하는 것이 훨씬 안전합니다.
수동으로 형식을 감지하고 변환하는 전체 코드 보기
import base64
from PIL import Image
from io import BytesIO
def detect_and_save(base64_data: str, output_path: str, target_format: str = "PNG"):
"""
base64 이미지의 실제 형식을 감지하고 변환하여 저장
Args:
base64_data: base64로 인코딩된 이미지 데이터
output_path: 출력 파일 경로
target_format: 대상 형식 (PNG/JPEG/WEBP)
"""
image_bytes = base64.b64decode(base64_data)
# 매직 바이트(magic bytes)를 통해 실제 형식 감지
if image_bytes[:2] == b'\xff\xd8':
actual_format = "JPEG"
elif image_bytes[:8] == b'\x89PNG\r\n\x1a\n':
actual_format = "PNG"
elif image_bytes[:4] == b'RIFF':
actual_format = "WEBP"
else:
actual_format = "알 수 없음"
print(f"API 반환 실제 형식: {actual_format}")
print(f"원본 데이터 크기: {len(image_bytes) / 1024 / 1024:.2f} MB")
# Pillow로 열어서 대상 형식으로 변환
img = Image.open(BytesIO(image_bytes))
print(f"이미지 크기: {img.size[0]}x{img.size[1]}")
if target_format == "PNG":
img.save(output_path, format="PNG", optimize=True)
elif target_format == "JPEG":
img.save(output_path, format="JPEG", quality=95)
elif target_format == "WEBP":
img.save(output_path, format="WEBP", quality=90)
import os
saved_size = os.path.getsize(output_path) / 1024 / 1024
print(f"저장 후 파일 크기: {saved_size:.2f} MB ({target_format})")
방법 2: Vertex AI 서버 측 형식 제어
Vertex AI를 통해 Nano Banana 2를 호출한다면, 요청 시 직접 출력 형식을 지정할 수 있습니다. 서버 측에서 형식을 제어할 수 있는 유일한 방법입니다.
import os
from google import genai
from google.genai import types
from google.genai.types import HttpOptions
os.environ["GOOGLE_CLOUD_PROJECT"] = "your-project-id"
os.environ["GOOGLE_CLOUD_LOCATION"] = "global"
os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "True"
client = genai.Client(http_options=HttpOptions(api_version="v1"))
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=["햇살 아래 낮잠 자는 주황색 고양이"],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"],
image_config=types.ImageConfig(
image_size="4K",
aspect_ratio="1:1",
output_mime_type="image/png", # PNG 출력 지정
# compression_quality=75, # JPEG만 유효, 0-100
),
)
)
방법 3: APIYI API 중계 서비스 활용
APIYI API 중계 서비스를 통해 호출하면 플랫폼에서 자동으로 형식 호환성 문제를 처리해 줍니다.
import openai
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://vip.apiyi.com/v1"
)
response = client.chat.completions.create(
model="gemini-3.1-flash-image-preview",
messages=[
{"role": "user", "content": "햇살 아래 낮잠 자는 주황색 고양이"}
]
)
🎯 형식 선택 제안: 무손실 품질이 필요하면 PNG, 작은 용량이 필요하면 JPEG(quality=95는 거의 무손실에 가까움)를 선택하세요.
APIYI apiyi.com 플랫폼을 통해 테스트하는 것을 추천합니다. 플랫폼에서 형식 호환성을 통합 관리하므로 수동으로 base64 디코딩이나 형식 감지를 할 필요가 없습니다.
Nano Banana 2 API 형식 제어 능력 비교
많은 개발자가 혼동하는 부분인데, AI Studio와 Vertex AI는 형식 제어 능력에서 큰 차이가 있습니다.
Nano Banana 2 API 형식 매개변수 지원 비교
| 매개변수 | AI Studio (Gemini API) | Vertex AI | Imagen API |
|---|---|---|---|
| outputMimeType | 지원 안 함 | 지원 (image/png, image/jpeg) | 지원 |
| compressionQuality | 지원 안 함 | 지원 (0-100, JPEG만) | 지원 |
| imageSize | 지원 (512/1K/2K/4K) | 지원 | 지원 |
| aspectRatio | 지원 | 지원 | 지원 |
즉, AI Studio로 Nano Banana 2를 호출하면 서버 측에서 PNG인지 JPEG인지 제어할 수 없습니다. API가 어떤 형식을 반환할지는 Google 서버의 기본 동작에 따라 결정되는데, 현재 이 기본 동작에 버그가 있습니다(PNG라고 하지만 실제로는 JPEG일 수 있음).
Nano Banana 2 API 형식별 용량 비교
동일한 4K(4096×4096) AI 생성 이미지라도 형식에 따라 용량 차이가 큽니다.
| 형식 | 압축 방식 | 일반적인 4K 용량 | 투명도 지원 | 품질 손실 |
|---|---|---|---|---|
| PNG | 무손실 압축 | 15-30 MB | 지원 | 없음 |
| JPEG quality=95 | 손실 압축 | 3-8 MB | 미지원 | 극미세 |
| JPEG quality=75 | 손실 압축 | 1-3 MB | 미지원 | 약간 있음 |
| WebP quality=90 | 손실 압축 | 2-5 MB | 지원 | 극미세 |
PNG는 무손실 형식이라 파일 용량이 이미지의 복잡도(엔트로피)를 그대로 반영합니다. 이미지 디테일이 풍부하고 질감이 복잡할수록 PNG 파일은 커집니다. 이는 4K 이미지 용량 변화를 이해하는 핵심 기초입니다.
팁: 투명 채널이 필요 없는 환경이라면 JPEG quality=95는 시각적으로 PNG와 거의 구분할 수 없으면서 용량은 PNG의 1/4~1/3 수준입니다. APIYI apiyi.com을 통해 실제 환경에서 두 형식의 차이를 빠르게 비교해 보세요.

Nano Banana 2 API 4K 이미지 용량 감소의 진실
많은 사용자분들이 궁금해하시는 점이죠. 왜 똑같은 4K 해상도인데, AI Studio에서 생성한 Nano Banana 2 이미지가 기존 30MB 이상에서 8MB 정도로 확 줄어들었을까요?
Nano Banana 2 API 이미지 용량 변화는 포맷 문제가 아닙니다
우선 흔한 오해부터 바로잡을게요. PNG가 JPEG로 바뀌어서 용량이 줄어든 게 아닙니다. 매직 바이트(magic bytes)를 확인해보면 반환된 데이터 포맷은 그대로라는 걸 알 수 있어요.
진짜 이유는 구글이 서버 측에서 모델의 계산 파라미터를 조정하여 이미지의 정보 복잡도(엔트로피)를 낮췄기 때문입니다. 구체적으로는 다음 세 가지 메커니즘이 작용하고 있어요.
원인 1: 추론 단계(Inference Steps) 감소 (주요 원인)
확산 모델(Diffusion Model)은 이미지를 생성할 때 여러 번의 노이즈 제거 반복 과정을 거칩니다. 이 노이즈 제거 단계 수가 이미지의 디테일 수준을 결정하죠.
- 이전: 50~100회의 노이즈 제거 반복을 사용하여 텍스처가 풍부하고 디테일이 정교한 이미지를 생성했습니다.
- 현재: 20~40회로 줄어들어 전체적인 이미지는 선명하지만, 국소적인 디테일과 텍스처 복잡도가 낮아졌습니다.
노이즈 제거 단계 감소 → 텍스처 디테일 감소 → 정보 엔트로피 감소 → PNG 무손실 압축 후 용량 감소로 이어지는 것입니다.
단순히 "화질이 나빠졌다"고 말하기는 어렵습니다. 육안으로 보면 전체적인 구도나 색감은 큰 차이가 없지만, 픽셀 단위로 확대해보면 미세한 텍스처나 색상 그라데이션이 이전보다 덜 섬세하다는 걸 알 수 있어요.
원인 2: 서버 측 사전 처리 최적화
구글은 이미지 생성 후 PNG로 인코딩하기 전에 약간의 노이즈 제거 및 색상 단순화 처리를 추가했을 가능성이 큽니다.
- 미세한 노이즈 억제로 고주파 디테일 감소
- 색상 그라데이션 단계 축소로 색상 전환의 정밀도 하락
- 이러한 처리는 PNG 압축 효율을 높여줍니다(유사한 픽셀이 많아져 압축률이 높아짐).
원인 3: 부동 소수점 정밀도 조정
모델 추론 과정이 FP32(32비트 부동 소수점)에서 FP16(16비트 부동 소수점)으로 전환되었을 수 있습니다.
- FP16은 FP32의 절반 수준의 계산 정밀도를 가지며, GPU 사용량도 대폭 줄어듭니다.
- 정밀도가 낮아지면 색상 그라데이션이 이전만큼 부드럽지 않게 되며, 결과적으로 PNG 용량 감소로 나타납니다.
Nano Banana 2 API 이미지 용량 변화 타임라인
| 시간 | 이벤트 | 영향 |
|---|---|---|
| 2025년 11월 | Nano Banana Pro 출시, 풀 연산 | 4K PNG 약 25-35 MB |
| 2025년 12월 | 무료 쿼터 3장/일 → 2장/일로 축소 | 자원 제한 시작 |
| 2026년 1월 | 사용자 화질 저하 피드백 | 디테일 감소, 해상도 유지 |
| 2026년 2월 | Nano Banana 2 출시 | 4K PNG 약 6-10 MB |
| 2026년 중반(예상) | 구글 TPU v7 생산량 달성 | 전체 연산 복구 가능성 |
핵심 결론: 이는 구글이 TPU 생산량이 부족한 상황에서 사용자 수와 서비스 품질 사이의 균형을 맞추기 위해 내린 결정입니다. 해상도(픽셀 수)는 그대로지만, 정보 밀도(각 픽셀이 담고 있는 고유 정보량)가 낮아진 것이죠. 사용자가 API 파라미터로 이전의 30MB급 품질을 되돌릴 수는 없습니다.
🎯 대응 제안: 이미지 디테일 품질이 매우 중요하다면 다음 방법을 시도해보세요. 1) Vertex AI의
compressionQuality=100파라미터 사용, 2) 프롬프트에 디테일과 텍스처 요구사항 강조, 3) 2K로 생성한 뒤 초해상도 모델을 사용하여 4K로 업스케일링.
APIYI(apiyi.com)를 통해 다양한 파라미터 조합의 효과를 테스트하여 최적의 품질-용량 균형점을 찾아보세요.
자주 묻는 질문(FAQ)
Q1: base64 데이터를 .png 파일로 저장하면 무조건 PNG 포맷인가요?
꼭 그렇지는 않습니다. 파일 확장자가 실제 포맷을 결정하지는 않거든요. 먼저 base64.b64decode()로 디코딩한 뒤, Pillow의 Image.open()으로 열고 img.save("output.png", format="PNG")를 통해 명시적으로 PNG로 저장해야 합니다. 만약 디코딩된 바이트를 그대로 .png 파일에 쓰면 실제 포맷은 API가 반환한 원본 바이트에 따라 달라집니다. 현재 API에서 PNG라고 주장하지만 실제로는 JPEG를 반환하는 버그가 알려져 있으니 주의하세요.
Q2: 왜 AI Studio는 outputMimeType을 지원하지 않는데 Vertex AI는 지원하나요?
AI Studio(Gemini API)는 개발자의 빠른 프로토타입 검증을 위한 도구라 기능이 간소화되어 있습니다. 반면 Vertex AI는 기업용 프로덕션 환경을 지향하므로 더 완전한 파라미터 제어를 제공하죠. 구글 JS SDK 타입 정의에도 outputMimeType은 "Gemini API에서 지원하지 않음"으로 명시되어 있습니다. 서버 측 포맷 제어가 필요하다면 Vertex AI로 전환하거나 APIYI(apiyi.com)의 통합 인터페이스를 사용하세요.
Q3: 4K 이미지 용량이 줄어들었는데, 여전히 4K 해상도를 사용할 가치가 있을까요?
용도에 따라 다릅니다. 현재 4K 출력은 용량이 줄었어도 해상도는 여전히 4096×4096 픽셀이므로 인쇄물이나 대형 디스플레이 전시용으로는 여전히 가치가 있습니다. 만약 소셜 미디어나 웹 전시용이라면 2K(2048px)가 가성비 면에서 더 나을 수 있습니다. 용량도 작고 API 비용도 저렴하니까요($0.101/장 vs $0.151/장).
Q4: 이전의 30MB 고품질 출력을 복구할 방법이 있나요?
현재로서는 없습니다. 용량 감소는 구글 서버 측의 계산 파라미터 조정에 의한 것이라 사용자가 API 파라미터로 제어할 수 없습니다. 2026년 중반 구글 TPU v7 생산량이 정상화되면 전체 연산이 복구될 가능성이 있습니다. 현재의 우회 방법은 더 상세한 프롬프트로 텍스처 디테일을 유도하거나, 2K 이미지 생성 후 초해상도 모델(Real-ESRGAN 등)을 사용하여 4K로 확대하는 것입니다.
요약
Nano Banana 2 API 이미지 출력 형식 제어의 핵심 포인트는 다음과 같습니다:
- AI Studio는 서버 측 형식 제어를 지원하지 않음: 클라이언트에서 base64를 디코딩한 후 Pillow를 사용하여 명시적으로 PNG로 저장해야 합니다. 이때 매직 바이트(magic bytes)를 확인하여 실제 형식을 검증하는 것이 좋습니다.
- Vertex AI는
outputMimeType을 지원함: 요청 시image/png또는image/jpeg를 직접 지정할 수 있으며, JPEG 압축 품질 설정도 가능합니다. - 4K 용량 감소는 연산 조정의 결과: 30MB에서 8MB로 줄어든 것은 형식 변화가 아니라, Google 측에서 추론 단계와 부동 소수점 정밀도를 낮춰 정보 엔트로피를 줄였기 때문입니다. 사용자가 파라미터로 이를 복구할 수는 없습니다.
이러한 기본 메커니즘을 이해하면 실제 요구 사항에 가장 적합한 형식 저장 전략을 선택할 수 있습니다.
APIYI(apiyi.com)를 통해 다양한 형식과 파라미터의 효과를 빠르게 검증해 보세요. 플랫폼에서 제공하는 무료 크레딧과 통합 인터페이스를 활용하면 Nano Banana 2를 더욱 간편하게 호출할 수 있습니다.
📚 참고 자료
-
Gemini 이미지 생성 개발 문서: ImageConfig 파라미터 설명을 포함한 공식 API 참조
- 링크:
ai.google.dev/gemini-api/docs/image-generation - 설명: AI Studio 방식 호출 시의 파라미터 및 제한 사항 확인
- 링크:
-
Vertex AI ImageOutputOptions 참조: Vertex AI의 형식 제어 파라미터 전체 문서
- 링크:
docs.cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/Shared.Types/ImageOutputOptions - 설명: mimeType 및 compressionQuality에 대한 상세 설명 포함
- 링크:
-
GitHub Issue #1824 – MIME 타입 불일치: PNG라고 명시했으나 실제로는 JPEG로 반환되는 버그 리포트
- 링크:
github.com/googleapis/python-genai/issues/1824 - 설명: 알려진 문제의 기술적 세부 사항 및 임시 해결 방안 확인
- 링크:
-
APIYI 문서 센터: 통합 인터페이스를 통한 Nano Banana 2 형식 제어 가이드
- 링크:
docs.apiyi.com - 설명: 형식 처리 과정을 간소화해야 하는 개발자에게 적합
- 링크:
작성자: APIYI 기술팀
기술 교류: 댓글로 자유롭게 의견을 나누어 주세요. 더 많은 자료는 APIYI 문서 센터(docs.apiyi.com)에서 확인하실 수 있습니다.
