AI 이미지 생성 API 활용 — DALL-E 3, Stable Diffusion, fal.ai

AI 이미지 생성, API로 직접 다루기

텍스트를 입력하면 이미지가 생성되는 시대입니다. 디자이너가 아니더라도 개발자가 API 한 줄로 고품질 이미지를 만들 수 있습니다. 이 글에서는 대표적인 AI 이미지 생성 API 세 가지를 비교하고, Python 코드로 직접 호출하는 방법을 다룹니다.

주요 API 비교

각 서비스마다 강점이 다릅니다. 용도에 따라 선택하면 됩니다.

항목DALL-E 3 (OpenAI)Stable Diffusion (Stability AI)fal.ai
강점프롬프트 이해력 최상, 텍스트 렌더링오픈소스 기반, 커스터마이징 자유빠른 속도, 다양한 모델 허브
가격1024x1024 기준 $0.04/장크레딧 기반모델별 과금
해상도1024x1024, 1792x1024512~2048 자유 설정모델별 상이
API 형태REST (OpenAI SDK)REST / gRPCREST (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/devfal-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에 콘텐츠 필터가 내장되어 있습니다. 부적절한 요청은 자동 거부됩니다. 서비스 앱에 통합할 때는 사용자 입력에 대한 사전 필터링도 추가하는 것이 좋습니다.

이 글이 도움이 되었나요?