AI 이미지 생성, API로 직접 다루기
텍스트를 입력하면 이미지가 생성되는 시대입니다. 디자이너가 아니더라도 개발자가 API 한 줄로 고품질 이미지를 만들 수 있습니다. 이 글에서는 대표적인 AI 이미지 생성 API 세 가지를 비교하고, Python 코드로 직접 호출하는 방법을 다룹니다.
주요 API 비교
각 서비스마다 강점이 다릅니다. 용도에 따라 선택하면 됩니다.
| 항목 | DALL-E 3 (OpenAI) | Stable Diffusion (Stability AI) | fal.ai |
|---|---|---|---|
| 강점 | 프롬프트 이해력 최상, 텍스트 렌더링 | 오픈소스 기반, 커스터마이징 자유 | 빠른 속도, 다양한 모델 허브 |
| 가격 | 1024x1024 기준 $0.04/장 | 크레딧 기반 | 모델별 과금 |
| 해상도 | 1024x1024, 1792x1024 | 512~2048 자유 설정 | 모델별 상이 |
| API 형태 | REST (OpenAI SDK) | REST / gRPC | REST (Python SDK) |
| 이미지 편집 | 인페인팅 지원 | img2img, 인페인팅, ControlNet | 모델에 따라 지원 |
| 적합한 용도 | 빠른 프로토타입, 콘텐츠 생성 | 세밀한 스타일 제어, 대량 생성 | 최신 모델 빠른 테스트 |
DALL-E 3 — OpenAI API
OpenAI의 이미지 생성 모델로, 프롬프트 해석 능력이 뛰어납니다. ChatGPT에서 사용하는 것과 동일한 모델을 API로 호출할 수 있습니다.
# DALL-E 3 이미지 생성
from openai import OpenAI
client = OpenAI() # OPENAI_API_KEY 환경변수 필요
response = client.images.generate(
model="dall-e-3",
prompt="한국 전통 한옥 마을의 봄 풍경, 벚꽃이 만개한 수채화 스타일",
size="1024x1024", # 1024x1024 | 1792x1024 | 1024x1792
quality="standard", # standard | hd
n=1, # DALL-E 3은 1장만 지원
)
# 생성된 이미지 URL
image_url = response.data[0].url
print(f"이미지 URL: {image_url}")
# 수정된 프롬프트 확인 (DALL-E 3은 프롬프트를 자동 보강함)
revised_prompt = response.data[0].revised_prompt
print(f"보강된 프롬프트: {revised_prompt}")
DALL-E 3의 특징은 입력 프롬프트를 내부적으로 보강(revised prompt)한다는 점입니다. 단순한 프롬프트를 넣어도 상세한 묘사로 변환되어 고품질 결과를 얻을 수 있습니다.
생성된 이미지 저장
URL로 받은 이미지를 로컬 파일로 저장하는 패턴입니다.
# 이미지 다운로드 및 저장
import httpx
from pathlib import Path
def save_generated_image(image_url: str, filename: str = "output.png") -> Path:
"""생성된 이미지를 로컬에 저장"""
response = httpx.get(image_url)
response.raise_for_status()
output_path = Path(filename)
output_path.write_bytes(response.content)
print(f"저장 완료: {output_path} ({len(response.content) / 1024:.1f} KB)")
return output_path
# 사용
save_generated_image(image_url, "hanok_spring.png")
# 저장 완료: hanok_spring.png (482.3 KB)
Stable Diffusion — Stability AI API
오픈소스 기반의 이미지 생성 모델입니다. 커스터마이징이 자유롭고, 네거티브 프롬프트(negative prompt)로 원하지 않는 요소를 제거할 수 있습니다.
# Stable Diffusion 3.5 이미지 생성 (Stability AI API)
import httpx
import base64
from pathlib import Path
API_KEY = "sk-..." # STABILITY_API_KEY 환경변수 권장
API_URL = "https://api.stability.ai/v2beta/stable-image/generate/sd3"
def generate_with_sd(prompt: str, negative_prompt: str = "", seed: int = 0) -> bytes:
"""Stable Diffusion 3.5로 이미지 생성"""
response = httpx.post(
API_URL,
headers={
"Authorization": f"Bearer {API_KEY}",
"Accept": "application/json",
},
files={"none": ""}, # multipart 형식 필수
data={
"prompt": prompt,
"negative_prompt": negative_prompt,
"output_format": "png",
"seed": seed, # 동일 seed = 동일 결과 (재현성)
"aspect_ratio": "1:1",
},
timeout=60,
)
response.raise_for_status()
# base64 디코딩
result = response.json()
return base64.b64decode(result["image"])
# 사용 예시
image_bytes = generate_with_sd(
prompt="cyberpunk city at night, neon lights, rain, photorealistic",
negative_prompt="blurry, low quality, text, watermark", # 제외할 요소
seed=42,
)
Path("cyberpunk_city.png").write_bytes(image_bytes)
print(f"생성 완료: {len(image_bytes) / 1024:.1f} KB")
# 생성 완료: 612.7 KB
네거티브 프롬프트는 Stable Diffusion의 핵심 기능입니다. blurry, low quality, watermark 같은 키워드를 넣으면 해당 특성이 억제됩니다.
fal.ai — 최신 모델 허브
fal.ai는 다양한 오픈소스 이미지 생성 모델을 하나의 API로 제공하는 플랫폼입니다. FLUX, Stable Diffusion 등 최신 모델을 빠르게 테스트할 수 있습니다.
# fal.ai를 통한 FLUX 모델 이미지 생성
import fal_client
# FAL_KEY 환경변수 설정 필요
result = fal_client.subscribe(
"fal-ai/flux/dev", # FLUX.1-dev 모델
arguments={
"prompt": "미니멀한 일본식 정원, 이끼 낀 돌, 안개, 영화적 조명",
"image_size": "landscape_16_9", # 다양한 비율 지원
"num_images": 1,
"enable_safety_checker": True, # 안전 필터
},
)
# 결과 확인
for image in result["images"]:
print(f"URL: {image['url']}")
print(f"크기: {image['width']}x{image['height']}")
# URL: https://fal.media/files/...
# 크기: 1344x768
fal.ai의 장점은 모델 교체가 간단하다는 것입니다. fal-ai/flux/dev를 fal-ai/flux/schnell로 바꾸면 더 빠른(하지만 품질이 약간 낮은) 모델로 전환됩니다.
실전 활용: 배치 이미지 생성
여러 프롬프트로 이미지를 한꺼번에 생성하는 패턴입니다. 블로그 썸네일, 상품 이미지 등 대량 생성 시 유용합니다.
# 비동기 배치 이미지 생성 (OpenAI 예시)
import asyncio
from openai import AsyncOpenAI
client = AsyncOpenAI()
async def generate_image(prompt: str, index: int) -> dict:
"""단일 이미지 비동기 생성"""
response = await client.images.generate(
model="dall-e-3",
prompt=prompt,
size="1024x1024",
quality="standard",
)
return {
"index": index,
"prompt": prompt,
"url": response.data[0].url,
}
async def batch_generate(prompts: list[str]) -> list[dict]:
"""여러 프롬프트를 동시에 처리"""
tasks = [generate_image(p, i) for i, p in enumerate(prompts)]
results = await asyncio.gather(*tasks, return_exceptions=True)
# 성공/실패 분리
success = [r for r in results if isinstance(r, dict)]
failed = [r for r in results if isinstance(r, Exception)]
print(f"성공: {len(success)}건, 실패: {len(failed)}건")
return success
# 사용
prompts = [
"미니멀 테크 블로그 썸네일, 파란색 그라데이션, 추상적",
"Python 프로그래밍 개념도, 플랫 디자인, 밝은 톤",
"AI 뉴럴 네트워크 시각화, 어두운 배경, 네온 노드",
]
results = asyncio.run(batch_generate(prompts))
for r in results:
print(f"[{r['index']}] {r['url'][:60]}...")
# 성공: 3건, 실패: 0건
# [0] https://oaidalleapiprod...
# [1] https://oaidalleapiprod...
# [2] https://oaidalleapiprod...
선택 가이드
| 상황 | 추천 API |
|---|---|
| 빠른 프로토타입, 단발성 이미지 | DALL-E 3 |
| 스타일 세밀 제어, 대량 생성 | Stable Diffusion API |
| 최신 오픈소스 모델 테스트 | fal.ai |
| 이미지 편집 (인페인팅) | DALL-E 3 또는 Stable Diffusion |
| 비용 최소화 | Stable Diffusion (셀프 호스팅) 또는 fal.ai |
주의사항과 팁
비용 관리: DALL-E 3은 장당 $0.04~0.08로, 대량 생성 시 비용이 빠르게 증가합니다. 테스트 단계에서는 quality: "standard"를 사용하고, 최종 결과물에만 "hd"를 적용하세요.
프롬프트 작성 팁: 구체적일수록 좋습니다. “고양이 그림” 대신 “창가에 앉은 회색 고양이, 오후 햇살, 수채화 스타일, 따뜻한 톤”처럼 장면, 스타일, 분위기를 명시하세요.
저작권: API로 생성한 이미지의 저작권 정책은 서비스마다 다릅니다. 상업적 사용 전 각 서비스의 이용약관을 반드시 확인하세요. OpenAI는 생성 이미지의 상업 사용을 허용하지만, 일부 모델은 비상업 라이선스일 수 있습니다.
안전 필터: 대부분의 API에 콘텐츠 필터가 내장되어 있습니다. 부적절한 요청은 자동 거부됩니다. 서비스 앱에 통합할 때는 사용자 입력에 대한 사전 필터링도 추가하는 것이 좋습니다.