나노바나나 소개
Nano Banana 의 정체는 사실 Gemini Flash 2.5 Image 모델 이라는 공식 오피셜이 있었죠 !!
API Key 발급은 여기서 진행하시면 됩니다 : https://aistudio.google.com/apikey
Google의 최신 모델, Gemini 2.5 Flash Image를 파이썬(Python)으로 활용하여 텍스트 프롬프트만으로 이미지를 생성하는 방법을 알아보겠습니다.
Nano Banana API 직접 써보기: 텍스트로 이미지 생성하기
본격적으로 코드를 작성하기 전에, 필요한 준비물이 있습니다
1. 라이브러리 설치
가장 먼저 구글의 생성형 AI 모델을 파이썬에서 쉽게 사용할 수 있도록 도와주는 라이브러리를 설치해야 합니다. 터미널을 열고 아래 명령어를 입력해주세요.
pip install google-genai
2. API 키 준비
Google AI Studio에 방문하여 API 키를 발급받아야 합니다. 발급받은 키는 외부에 노출되지 않도록 안전하게 보관하고, 코드에서는 환경 변수로 불러와 사용하는 것이 가장 좋습니다.
3. 전체 코드 살펴보기
이제 본격적으로 코드를 살펴보겠습니다. 아래 코드는 텍스트 프롬프트를 입력받아 Gemini 2.5 Flash Image 모델을 통해 이미지를 생성하고, 그 결과물을 파일로 저장하는 전체 과정입니다.
# 필요한 라이브러리들을 가져옵니다.
import base64
import mimetypes
import os
from google import genai
from google.genai import types
# 생성된 이미지 데이터를 파일로 저장하는 함수입니다.
def save_binary_file(file_name, data):
"""Saves binary data to a file."""
with open(file_name, "wb") as f:
f.write(data)
print(f"이미지 파일 저장 완료: {file_name}")
def generate():
"""텍스트 프롬프트를 통해 이미지를 생성하는 메인 함수입니다."""
# 환경 변수에서 API 키를 가져와 클라이언트를 설정합니다.
client = genai.Client(
api_key=os.environ.get("GEMINI_API_KEY"),
)
# 사용할 모델을 지정합니다. 이미지 생성을 위해 preview 버전을 사용합니다.
model = "gemini-2.5-flash-image-preview"
# 모델에게 전달할 콘텐츠 (프롬프트)를 구성합니다.
contents = [
types.Content(
role="user",
parts=[
types.Part.from_text(text="""A photorealistic image of a banana-shaped spaceship flying over a futuristic city"""),
],
),
]
# 모델의 응답 형식을 지정합니다. 이미지와 텍스트 모두 받을 수 있도록 설정합니다.
generate_content_config = types.GenerateContentConfig(
response_modalities=[
"IMAGE",
"TEXT",
],
)
file_index = 0
# 스트리밍 방식으로 모델의 응답을 받습니다.
# 대용량 이미지도 끊김 없이 받을 수 있는 장점이 있습니다.
for chunk in client.models.generate_content_stream(
model=model,
contents=contents,
config=generate_content_config,
):
# 응답 청크에 내용이 없으면 건너뜁니다.
if (
chunk.candidates is None
or chunk.candidates[0].content is None
or chunk.candidates[0].content.parts is None
):
continue
# 청크에 이미지 데이터가 포함되어 있는지 확인합니다.
if chunk.candidates[0].content.parts[0].inline_data and chunk.candidates[0].content.parts[0].inline_data.data:
# 저장할 파일 이름을 정합니다.
file_name = f"generated_image_{file_index}"
file_index += 1
# 이미지 데이터와 MIME 타입을 추출합니다.
inline_data = chunk.candidates[0].content.parts[0].inline_data
data_buffer = inline_data.data
# MIME 타입을 기반으로 파일 확장자를 추측합니다. (예: 'image/png' -> '.png')
file_extension = mimetypes.guess_extension(inline_data.mime_type)
# 이미지 데이터를 파일로 저장합니다.
save_binary_file(f"{file_name}{file_extension}", data_buffer)
else:
# 이미지 데이터가 아닌 텍스트 응답이 오면 출력합니다.
print(chunk.text)
# 이 스크립트가 직접 실행될 때 generate 함수를 호출합니다.
if __name__ == "__main__":
generate()
코드 상세 설명
save_binary_file
함수: 모델이 생성한 이미지 데이터(binary data)를 실제 파일(.png, .jpg 등)로 저장해주는 역할을 합니다.generate
함수:genai.Client()
: 준비한 API 키를 사용하여 Google AI 서비스에 연결합니다.model = "gemini-2.5-flash-image-preview"
: 여러 Gemini 모델 중, 이미지 생성 기능이 포함된gemini-2.5-flash-image-preview
모델을 사용하겠다고 명시합니다.contents
: 이 부분이 바로 AI에게 전달하는 프롬프트입니다.text
부분에 원하는 이미지에 대한 설명을 자유롭게 작성하면 됩니다. 예제에서는 “미래적인 도시 위를 나는 바나나 모양의 우주선 실사 이미지”를 요청했습니다.generate_content_config
: 모델로부터 어떤 종류의 응답을 받을지 설정합니다. 우리는 이미지(IMAGE
)와 텍스트(TEXT
)를 모두 기대하고 있습니다.client.models.generate_content_stream()
: 모델에게 이미지 생성을 요청하고, 응답을 스트리밍 방식으로 받아옵니다. 큰 이미지도 한 번에 받는 것이 아니라 조각(chunk)으로 나누어 받기 때문에 안정적입니다.for chunk in ...
: 반복문을 통해 모델이 보내주는 데이터 조각들을 하나씩 처리합니다.if chunk.candidates[0].content.parts[0].inline_data
: 받아온 조각이 이미지 데이터인지 확인합니다.mimetypes.guess_extension()
: 데이터의 종류(MIME type)를 보고.png
나.jpeg
같은 적절한 파일 확장자를 찾아줍니다.else: print(chunk.text)
: 만약 이미지가 아니라 텍스트 정보가 오면 화면에 출력합니다.
실행 결과는?
이제 코드를 실행하면, 여러분이 프롬프트로 요청한 이미지가 generated_image_0.png
와 같은 이름으로 저장되는 것을 확인할 수 있습니다. “바나나 모양 우주선”이라는 요청에도 AI가 레전드로… 결과물을 만들어냅니다. (갓 나노 바나나..)
저는 이렇게 나왔습니다 !
오늘 만들어 본 간단한 이미지 생성 전쟁의 시작이 아닐까요? 그록도 무료로 모델 공개하던데… 나노 바나나도 API에 그치지 않고, 모델 오픈 소스로 공개해주면 좋겠다 ㅎㅎ..