TRENDSHIFT MONTHLY #20 딥다이브 · 2026-06-04 분석

Image Extender 딥다이브
— 브라우저 한 장에서 돌아가는 AI 아웃페인팅 + 2D 게임 아트 스튜디오

사진을 어느 방향으로든 AI로 자연스럽게 늘리고(아웃페인팅), 같은 엔진으로 패럴랙스 배경·오토타일·스프라이트·소품까지 찍어내는 작은 오픈소스 웹앱. 무거운 이미지 라이브러리 없이 순수 브라우저 Canvas로 포아송 블렌딩까지 직접 구현한 게 핵심. boona13/image-extender · Next.js 14 + TypeScript · ⭐700+ · MIT
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항 / 설치
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

Image Extender가 정확히 무엇을 하는 물건인가

Image Extender(이미지 익스텐더)는 가지고 있는 이미지를 상·하·좌·우 어느 방향으로든 AI로 늘려 그리는 오픈소스 웹앱입니다. 1024×1024 정사각형 인물 사진을 16:9 와이드 시네마틱 장면으로 "더 많이" 그려 넣는 식이죠. 이렇게 이미지 바깥을 채워 그리는 작업을 아웃페인팅(outpainting)이라고 부릅니다.

그런데 단순 아웃페인팅 도구가 아닙니다. 같은 이미지 생성 엔진을 재활용해 2D 게임 아트 제작 스튜디오로 확장돼 있습니다. 하나의 앱 안에 다섯 개의 작업실이 들어 있습니다 — ① Extender(아웃페인팅), ② Parallax Studio(다층 스크롤 배경), ③ Tile Studio(13장짜리 오토타일 세트), ④ Sprite Studio(캐릭터 애니메이션 시트), ⑤ Props Studio(투명 장식 스프라이트).

이미지 생성은 구글의 Gemini 이미지 모델(별명 Nano Banana)을 OpenRouter라는 통합 API를 통해 호출합니다. 핵심은 — 모든 후처리(이음매 블렌딩, 색 보정, 투명 처리)가 서버가 아니라 사용자 브라우저의 HTML Canvas에서 일어나고, API 키도 브라우저에만 저장된다는 점입니다.

한 컷 비유

"사진을 늘려 붙이되, 이어 붙인 자국을 수학으로 지워주는 똑똑한 포토샵 캔버스 확장"

포토샵에서 캔버스를 넓히고 빈 공간을 그려 채우면, 원본과 새로 그린 부분 사이에 색이 살짝 튀는 이음매가 남기 마련입니다. "하늘이 갑자기 더 파래진" 느낌이죠.

Image Extender는 AI가 채운 부분을 포아송 블렌딩(Poisson blending)이라는 영상처리 기법으로 원본에 녹여, 경계를 수학적으로 보이지 않게 만듭니다. "AI가 그렸다"가 아니라 "원래 그런 사진이었다"처럼 보이게 하는 게 이 프로젝트의 정체성입니다.

2왜 주목받는가

트렌딩 이유와 비슷한 도구 대비 차별점

AI 아웃페인팅 자체는 새롭지 않습니다. Photoshop의 Generative Expand, DALL·E, 각종 SD 웹UI가 다 합니다. 그런데 거의 모두가 공통으로 안고 있는 문제가 이음매(seam)입니다. AI가 채운 픽셀과 원본 픽셀 사이에서 미묘하게 밝기·색이 어긋나, 자세히 보면 "여기부터 AI가 그렸다"가 티 납니다. Image Extender는 바로 이 지점을 정면으로 공략해 입소문을 탔습니다.

핵심 용어
seam (이음매)
원본 이미지와 AI가 새로 생성한 영역이 만나는 경계선. 색·밝기·질감이 살짝 어긋나면 합성 티가 난다. 아웃페인팅 품질을 좌우하는 가장 큰 변수다.
흔한 방식의 한계
"AI가 채운 걸 그냥 이어 붙인다"

많은 도구가 생성 영역을 원본 옆에 단순히 붙이고, 잘해야 경계에 살짝 페더(feather, 가장자리 흐리기)만 줍니다. 그러면 ① 경계의 색 점프, ② 여러 번 늘릴수록 누적되는 색 드리프트("패널 줄무늬"), ③ 타일·스프라이트에서 프레임마다 캐릭터가 달라지는 문제가 그대로 남습니다.

Image Extender의 차별점
수학적 블렌딩 + 색 사전보정 + 최선안 3개 중 선택

① 생성 영역을 포아송 블렌딩으로 원본에 녹여 경계를 지우고, ② 블렌딩 전에 색 드리프트를 미리 보정하며, ③ 같은 확장을 온도를 달리해 3번 시도하고 이음매 품질로 정렬해 가장 깔끔한 후보를 고르게 합니다(best-of-3). 게임 아트 모드에서는 마젠타 크로마키·결정론적 후처리·"아트 디렉터" 2단계 파이프라인으로 일관성까지 잡습니다.

비슷한 도구와 비교

비교 항목Image Extender일반 아웃페인팅 도구
이음매 처리포아송 블렌딩(경계 소멸)페더링 정도
색 드리프트사전보정 + 하모나이즈방치되기 쉬움
후보 선택best-of-3 + 이음매 점수 정렬1장 또는 수동
실행 위치브라우저 Canvas(클라이언트)서버/클라우드 GPU
API 키BYOK · 브라우저에만 저장서비스가 보관
범위아웃페인팅 + 게임 아트 5종아웃페인팅 위주
비유로 정리

대부분 도구가 "퍼즐 조각을 옆에 끼워 넣고 테두리를 살짝 문지른다"면, Image Extender는 "두 조각의 경계를 아예 녹여 한 장의 종이로 다시 굳힌다"에 가깝습니다. 차이를 만드는 건 화려한 AI가 아니라 경계를 다루는 고전 영상처리 수학입니다.

3기술 스택 전체 지도

프레임워크 / 이미지 처리 / AI 연결 / 번들링 — 4개 축

의외로 의존성이 매우 가볍습니다. package.json의 런타임 의존성은 단 4개(next·react·react-dom·jszip)뿐입니다. OpenCV도, sharp도, 어떤 이미지 라이브러리도 없습니다 — 무거운 영상처리를 전부 브라우저 Canvas로 손수 구현했다는 뜻입니다. 이게 이 레포의 가장 큰 학습 포인트입니다.

① 프론트엔드 프레임워크

기술 / 버전역할
Next.js 14App Router 기반. 화면(페이지)과 API 라우트를 한 프로젝트에 담는 풀스택 프레임워크
React 18UI 컴포넌트와 상태 관리. 5개 스튜디오 화면이 모두 React 컴포넌트
TypeScript 5타입 안전성. 이미지 좌표·매니페스트 같은 데이터 구조를 타입으로 고정
Tailwind CSS 3다크 "스튜디오" 테마 UI 스타일링

② 이미지 처리 (핵심 — 외부 라이브러리 0개)

구성역할
HTML Canvas모든 픽셀 조작의 무대. getImageData/putImageData로 픽셀 배열을 직접 다룬다
imageProcessor.ts캔버스 확장, 포아송 블렌딩, 크로마키, 타일러빌리티, 이음매 점수, 스프라이트 정렬/스케일
poseRig.ts / rigCore.ts스프라이트용 "포즈 가이드"(ControlNet 스타일 마네킹)를 코드로 그려 AI에 참조로 투입
rigs/ (5종)이족·사족·뱀/물고기·새·블롭 등 몸 구조별 포즈 리그

③ AI 모델 연결

구성역할
OpenRouter여러 AI 모델을 하나의 API로 묶어주는 중개 서비스. 키 하나로 Gemini·GPT 등 호출
Gemini 이미지 모델Nano Banana 계열(3 Flash/Pro Image, 2.5 Flash) — 실제 그림을 그리는 모델
GPT-5.4 Image 2openai/gpt-5.4-image-2 — 고화질·처리 느림(약 4분/콜)·maxAttempts:1. Settings에서 전환 가능
gemini-2.0-flash추론·비전 QA용. 장면 브리프 작성, 소품 "아트 디렉터", 타일 검수에 사용
Next.js API Routesapp/api/*가 OpenRouter로 요청을 대신 보내는 프록시. 키를 로그·저장하지 않음

④ 번들링 / 내보내기

기술역할
JSZip브라우저에서 결과물(PNG 여러 장 + JSON 매니페스트)을 ZIP으로 묶어 다운로드
JSON 매니페스트패럴랙스 깊이 순서·스크롤 속도, 스프라이트 FPS·프레임 좌표 등을 기록해 게임엔진이 바로 읽게 함
localStorageOpenRouter API 키를 브라우저에만 저장(BYOK). 서버 디스크에 절대 쓰지 않음

4아키텍처 심화 분석

전체 그림 → 대표 흐름 한 줄기 추적 → 핵심 설계 패턴 5가지

구조도 A — 앱 전체 그림

먼저 숲을 봅니다. 브라우저(클라이언트)가 거의 모든 일을 하고, 서버(API 라우트)는 OpenRouter로 요청을 대신 보내는 얇은 프록시일 뿐입니다.

[브라우저 = React UI + Canvas 처리] [Next.js 서버] [외부] ┌───────────────────────────────────┐ ┌──────────────────┐ ┌────────────┐ │ page.tsx (앱 셸: 상태·생성 파이프) │ │ app/api/extend │ │ │ │ ├ Extender / Parallax / Tile │ HTTP │ app/api/generate │ → │ OpenRouter │ │ ├ Sprite / Props 스튜디오 │ ─────▶ │ app/api/*-brief │ → │ (Gemini / │ │ │ │ ◀───── │ app/api/*-review │ │ GPT 이미지)│ │ └ utils/imageProcessor.ts │ 이미지 └────────┬─────────┘ └────────────┘ │ (Canvas: 블렌딩·크로마키·정렬) │ │ 키는 헤더로 전달, 저장 안 함 └───────────────────────────────────┘ ▼ ▲ OpenRouter 키는 localStorage (서버는 그대로 중계만) └─ BYOK: 키가 브라우저 밖으로 안 나감

핵심은 "AI는 그림만 그리고, 품질은 클라이언트가 만든다"입니다. 이음매 제거·색 보정·투명 처리 같은 "잘 보이게 하는" 작업이 전부 브라우저 Canvas에서 일어나므로, 서버 비용이 거의 없고 사용자 키도 안전합니다.

구조도 B — 아웃페인팅 파이프라인(대표 흐름 한 줄기)

가장 대표적인 동작 하나 — "사진을 오른쪽으로 늘린다" — 를 입력부터 출력까지 따라가 보겠습니다. 이 한 줄기만 이해하면 나머지 스튜디오도 같은 뼈대의 변주입니다.

① 원본 ② 빈 영역만큼 캔버스 확장 (선택한 방향으로 회색 여백) ┌─────────┐ ┌─────────┬───────┐ │ 사진 │ → │ 사진 │ 빈칸 │ └─────────┘ └─────────┴───────┘ │ ▼ ③ Gemini가 빈칸을 outpaint (api/extend → OpenRouter) ┌─────────┬───────┐ │ 사진 │ AI그림 │ ← 경계에서 색이 살짝 튐 └─────────┴───────┘ │ ▼ ④ 이음매 색 드리프트 사전보정 (AI 출력을 원본 색쪽으로 당김) ▼ ⑤ 포아송 블렌딩 (mask를 8px 키워 Gauss-Seidel 반복) ▼ ⑥ 이음매 잔차(residual) 측정 → ③~⑤를 온도 바꿔 ×3 ▼ ⑦ 잔차 작은 순으로 정렬해 후보 3개 제시 → 사용자가 선택

가로 확장은 온도를 다르게 준 3번의 시도를 병렬로 돌리고, 각 결과의 이음매 잔차를 재서 "가장 깔끔한 블렌딩" 순으로 보여줍니다. 사용자는 로 후보를 넘기며 마음에 드는 그림을 고를 수 있습니다. 세로 확장은 결정론적인 청크 방식이라 보통 1번이면 충분합니다.

이 레포의 "정상" 관례
마젠타(#FF00FF)는 "투명으로 바꿀 색"이라는 약속
게임 아트 모드(패럴랙스·타일·스프라이트·소품)에서 AI에게 "배경을 형광 마젠타로 칠하라"고 시킨 뒤, 클라이언트가 그 마젠타를 알파(투명)로 바꿉니다(크로마키). AI 모델은 진짜 투명을 잘 못 그리기 때문에, "튀는 단색 = 나중에 지울 색"이라는 우회로를 쓰는 겁니다. 이 프로젝트 코드 곳곳에서 마젠타가 보이면 "여기는 투명 레이어구나"로 읽으면 됩니다.

핵심 설계 패턴 5가지

패턴 1 · GRADIENT-DOMAIN BLENDING

경계가 아니라 "기울기"를 맞춘다 — 포아송 블렌딩

두 이미지를 합칠 때 픽셀 값을 직접 섞지 않고, 픽셀 간 변화량(gradient, 기울기)을 원본에서 가져와 경계의 색만 새 영역에 맞춰 풉니다(Pérez 외 2003, "Poisson Image Editing"). 그래서 "무엇이 그려졌나"는 AI 그림을 따르되 "색·밝기 흐름"은 원본과 이어져, 경계가 사라집니다. 라이브러리 없이 imageProcessor.ts에서 Gauss-Seidel 반복(기본 250회)으로 직접 풉니다.

패턴 2 · BEST-OF-N + 자동 채점

여러 번 시도하고, 기계가 점수를 매겨 정렬

같은 확장을 온도(temperature)를 달리해 여러 번 생성하고, 각 결과의 이음매 잔차(seam residual)를 코드로 측정해 좋은 순으로 정렬합니다. AI 생성은 본질적으로 도박이라, "한 방"이 아니라 "여러 후보 + 객관적 채점 + 선택"으로 품질을 끌어올립니다. 사람은 최종 취향만 고르면 됩니다.

패턴 3 · 크로마키 우회

AI에게 마젠타를 칠하게 하고 → 투명으로 치환

투명 PNG를 직접 생성하지 못하는 모델의 한계를, "형광 마젠타로 배경을 칠하라 → 클라이언트가 마젠타를 알파로 변환"하는 방식으로 우회합니다. 패럴랙스의 Far/Mid/Near 레이어, 소품, 스프라이트가 모두 이 방식으로 깨끗한 투명 합성을 얻습니다. 모델의 약점을 후처리로 메우는 전형적인 엔지니어링입니다.

패턴 4 · 아트 디렉터 → 화가 (2-call)

"무엇을 그릴지"와 "그리기"를 분리한다

소품 스튜디오는 ① 추론 모델이 아트 디렉터가 되어 "다음에 어떤 새 소품을 만들지" 결정하고, ② 이미지 모델이 그걸 그립니다. 타일 스튜디오는 반대로 그린 뒤 비전 모델이 검수해 고칠 점을 돌려보내 다시 칠합니다(keep-best로 항상 개선만). 발상과 렌더링을 나누면 "같은 등불·항아리만 반복되는" 단조로움을 깰 수 있습니다.

패턴 5 · 결정론적 후처리 vs 비전 비평

측정 가능한 결함은 코드로, 취향은 모델로

스프라이트는 "한 칸에 캐릭터가 둘 그려짐(twin)", "프레임마다 크기가 들쭉날쭉", "발 높이가 안 맞음" 같은 측정 가능한 결함을 픽셀 분석·스케일 정규화·베이스라인 정렬로 잡습니다(QA 모델 대기 없이 빠름). 반면 타일의 "팔레트가 어울리나" 같은 주관적 판단은 비전 비평 모델에 맡깁니다. 객관/주관을 분리한 설계입니다.

5디렉토리 구조 해부

주요 폴더·파일의 역할

Next.js App Router 구조라 app/ 하나에 화면·API·로직이 모여 있습니다. 역할별로 api(서버 프록시) / components(화면) / lib(상수·도메인 데이터) / utils(픽셀 알고리즘)로 깔끔히 나뉩니다.

image-extender/ ├── app/ │ ├── api/ ← 서버: OpenRouter로 보내는 프록시들 │ │ ├── extend/route.ts ← 아웃페인팅 엔드포인트 │ │ ├── generate/route.ts ← 텍스트→이미지 + 타일/스프라이트 시트 프롬프트 │ │ ├── scene-brief/route.ts ← 프로젝트 공통 "장면 브리프" 추출 │ │ ├── prop-brief/route.ts ← 소품 "아트 디렉터"(다음 배치 기획) │ │ ├── tile-review/route.ts ← 타일 QA "아트 디렉터"(비전 비평) │ │ └── sprite-review/route.ts← 스프라이트 QA(비전 비평) │ ├── components/ ← 작업실별 UI │ │ ├── TopBar / CommandBar / Workspace / VariantSelector / Modals │ │ ├── ParallaxStudio.tsx │ │ ├── TileStudio.tsx (+ PlatformPreview 합성기) │ │ ├── SpriteStudio.tsx │ │ └── PropStudio.tsx │ ├── lib/ ← 도메인 로직 · 상수 │ │ ├── app.ts / models.ts / artStyles.ts │ │ ├── parallax.ts / tileset.ts / sprite.ts / props.ts │ │ └── bodyPlans.ts ← 스프라이트 몸 구조 레지스트리 │ ├── utils/ │ │ ├── imageProcessor.ts ← Canvas: 청크·포아송 블렌딩·크로마키· │ │ │ 타일러빌리티·이음매 점수·정렬/스케일 │ │ ├── poseRig.ts ← 몸 구조 리그로 분기 + 피사체 측정 │ │ ├── rigCore.ts ← 공용 리그 프리미티브(캡슐/점/투영) │ │ └── rigs/ ← 몸 구조별 포즈 리그(biped/quadruped/ │ │ serpent/flyer/blob) │ ├── globals.css ← 다크 "스튜디오" 디자인 시스템 │ ├── layout.tsx · page.tsx ← 루트 레이아웃 / 앱 셸(상태·파이프·QA 루프) └── package.json (의존성 단 4개) · tailwind/postcss 설정
위치한 줄 역할
app/api/*유일한 "서버 코드". 키를 헤더로 받아 OpenRouter에 중계만 한다
app/utils/imageProcessor.ts이 레포의 심장. 모든 픽셀 수학(블렌딩·크로마키·정렬)이 여기 있다
app/utils/rigs/스프라이트 애니메이션을 위한 "마네킹"을 코드로 그리는 곳
app/lib/*.ts모델 목록·아트 스타일·각 스튜디오의 상수와 프롬프트 규칙
app/page.tsx5개 스튜디오의 상태와 생성 파이프라인·QA 루프를 묶는 앱 셸
눈여겨볼 점
로직(utils)과 데이터(lib)의 분리
"어떻게 처리하나"(픽셀 알고리즘)는 utils에, "무엇을 처리하나"(모델·스타일·몸 구조 같은 상수/설정)는 lib에 모았습니다. 새 아트 스타일이나 새 모델을 추가할 때 알고리즘을 건드릴 필요가 없도록 한, 좋은 분리 예시입니다.

6학습 포인트 (기술별)

이 레포에서 무엇을, 어떻게 배울 수 있는가

① 그래디언트-도메인 이미지 편집 (가장 값진 보너스)

"포아송 블렌딩"이라는 고전 영상처리 기법을 라이브러리 없이 brute-force로 구현한 실제 코드를 볼 수 있습니다. 이미지를 픽셀 값이 아니라 "기울기(변화량)"의 세계에서 다루면 무엇이 가능해지는지, Gauss-Seidel 반복이 어떻게 경계 색을 풀어내는지를 코드로 익힐 수 있습니다.

실습 아이디어

GROW_PX(마스크 확장 폭, 기본 8)와 iterations(반복 횟수, 기본 250)를 바꿔가며 이음매가 어떻게 달라지는지 눈으로 비교해 보세요. 값을 너무 낮추면 경계가 보이고, 너무 높이면 느려집니다 — "품질 vs 속도" 트레이드오프를 직접 만질 수 있습니다.

② HTML Canvas 픽셀 조작 마스터

getImageData/putImageData로 픽셀 배열을 직접 다루는 모든 패턴이 한 파일(imageProcessor.ts)에 모여 있습니다. 크로마키(특정 색 → 투명), 청크 단위 처리, 타일러빌리티(반복 이음매 치유), 이음매 잔차 측정 같은 실전 캔버스 기법을 한 번에 배울 수 있습니다.

실습 아이디어

마젠타 크로마키 함수를 찾아, 키 색을 초록(#00FF00)으로 바꿔 "그린 스크린" 버전을 만들어 보세요. 색 허용 오차(tolerance)를 조절하면서 가장자리가 어떻게 깨지거나 깔끔해지는지 관찰합니다.

③ AI 이미지 API를 안전하게 붙이는 법 (BYOK + 프록시)

클라이언트가 가진 키를 서버가 받아 저장·로그 없이 중계만 하는 프록시 패턴(app/api/extend/route.ts)은 모든 "내 키로 AI 부르는 앱"의 기본기입니다. CORS·키 노출·요금 폭탄을 어떻게 다루는지 실제 코드로 확인할 수 있습니다.

④ "한 방 생성"을 넘어서는 AI 파이프라인 설계

best-of-N + 자동 채점, 2-call(아트 디렉터→화가), 결정론적 후처리 vs 비전 비평 — 모두 "AI 출력은 불확실하다"는 전제 위에서 품질을 끌어올리는 설계입니다. 단순히 모델을 부르는 것과 "신뢰할 수 있는 결과를 뽑는 시스템"을 만드는 것의 차이를 배웁니다.

왜 중요한가

실무에서 AI를 제품에 넣을 때 가장 어려운 건 모델 호출이 아니라 "들쭉날쭉한 출력을 어떻게 일정 품질로 만드나"입니다. 이 레포는 그 답(여러 후보·자동 채점·검수 루프·결정론적 보정)을 작은 코드로 압축해 보여줍니다.

⑤ ControlNet 발상의 "코드로 그린 포즈 가이드"

스프라이트가 프레임마다 흐트러지지 않도록, 몸 구조별 마네킹(포즈 리그)을 SVG/Canvas로 직접 그려 AI에 구조 참조로 넣습니다(rigs/). 무거운 ControlNet 모델 없이도 "구조 가이드 → 일관된 생성"의 핵심 아이디어를 얻을 수 있습니다.

7시스템 요구사항 / 설치

무엇이 필요하고 어떻게 돌리는가
항목요구사항
런타임Node.js (Next.js 14 권장 18+) · npm
AI 키OpenRouter API 키(BYOK). 첫 실행 시 브라우저가 한 번 묻고 localStorage 저장
비용확장 1회당 약 $0.03(Nano Banana 2 Flash Image 기준)
브라우저Canvas를 쓰는 최신 브라우저면 충분 — GPU 서버 불필요
라이선스MIT (상업적 사용·수정 자유)

설치 & 실행

# 1) 클론 후 의존성 설치
git clone https://github.com/boona13/image-extender.git
cd image-extender
npm install

# 2) 개발 서버 실행 → http://localhost:3000
npm run dev   # 첫 로드 시 OpenRouter 키 입력(브라우저에만 저장)

(선택) 서버 측 키 폴백

# 브라우저에 키를 넣기 싫거나 데모를 호스팅할 때만
cp .env.example .env.local
# .env.local 에 OPENROUTER_API_KEY=... 추가
# → 클라이언트 키가 없는 요청에 한해 서버가 이 키를 사용
안심 포인트
위 명령은 복사해 그대로 붙여넣으면 됩니다

특별한 빌드 도구나 GPU 설정이 없습니다. npm installnpm run dev 두 줄이면 로컬에서 돌아갑니다. 무거운 모델 다운로드도 없습니다 — 그림은 전부 OpenRouter 너머의 클라우드 모델이 그리고, 내 컴퓨터는 후처리만 합니다.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 손으로 만지는 게 가장 빠르다
난이도 ★☆☆ · 입문

1. 사진 한 장을 와이드로 늘려보기

아무 정사각형 사진이나 올려 좌·우로 확장하고, best-of-3 후보 3개를 로 넘겨 비교해 보세요. 어떤 후보의 이음매가 가장 안 보이는지, AI 채움 내용이 어떻게 달라지는지 눈으로 익히는 게 첫걸음입니다.

난이도 ★☆☆ · 입문

2. 설정값 만지며 품질·속도 체감

app/lib/app.tsEXTENSION_PERCENT(한 번에 늘리는 비율, 기본 38), app/lib/models.tsmaxAttempts(후보 수)를 바꿔보세요. 값에 따라 결과 품질과 생성 시간이 어떻게 변하는지 기록하면 "튜닝"의 감이 잡힙니다.

난이도 ★★☆ · 중급

3. 포아송 블렌딩 코드 읽고 주석 달기

imageProcessor.ts의 블렌딩 함수를 찾아, ① 마스크를 키우는 부분, ② Gauss-Seidel 반복 루프, ③ 이음매 잔차 측정 부분에 한국어 주석을 직접 달아보세요. "기울기를 푼다"가 코드로 어떻게 표현되는지 이해하는 게 목표입니다.

난이도 ★★☆ · 중급

4. 나만의 아트 스타일 추가

app/lib/artStyles.ts에 새 스타일(예: "수묵화", "8비트 도트")을 한 항목 추가하고 Extender에서 적용해 보세요. 프롬프트 한 줄이 결과를 어떻게 바꾸는지, 프롬프트 엔지니어링을 작은 단위로 실험할 수 있습니다.

난이도 ★★★ · 고급

5. "미니 아웃페인터"를 처음부터 만들기

이 레포를 참고서로 삼아, 캔버스 확장 → 모델 호출 → 단순 페더 합성까지만 하는 최소 아웃페인터를 새 프로젝트로 만들어 보세요. 그다음 페더를 포아송 블렌딩으로 교체하며 before/after를 비교하면, 이 레포의 핵심 가치를 몸으로 이해하게 됩니다.

9관련 기술 심화 학습 로드맵

4주 코스 — Canvas 기초부터 AI 파이프라인까지
주차주제학습 내용 / 실습
1주차Canvas 픽셀 조작getImageData/putImageData 기초 → 그레이스케일·반전·크로마키를 직접 구현. imageProcessor.ts와 비교
2주차그래디언트-도메인 합성Pérez 2003 "Poisson Image Editing" 개념 → Gauss-Seidel로 작은 영역 블렌딩 직접 풀어보기
3주차AI 이미지 API 연동OpenRouter로 텍스트→이미지 호출, Next.js API Route 프록시 + BYOK 패턴 구현
4주차신뢰성 있는 AI 파이프라인best-of-N + 자동 채점, 2-call(기획→생성), 검수 루프 설계 → 미니 아웃페인터에 적용
학습 순서 팁

AI 모델 호출부터 보지 말고 Canvas 픽셀 조작 → 블렌딩 수학 → 그다음 AI 연동 순서를 권합니다. 이 레포의 진짜 가치는 "AI를 부르는 법"이 아니라 "AI 결과를 사람 눈에 완성도 있게 만드는 후처리"에 있기 때문입니다.

10핵심 키워드 사전

이 레포에 등장하는 주요 용어 정리
용어
outpainting (아웃페인팅)
기존 이미지의 바깥 영역을 AI로 그려 채워 캔버스를 확장하는 것. 안쪽을 고치는 inpainting과 반대 방향.
용어
Poisson image editing (포아송 이미지 편집)
픽셀 값이 아니라 픽셀 간 기울기(gradient)를 보존하며 합성해 경계를 보이지 않게 하는 고전 기법(Pérez 외, SIGGRAPH 2003).
용어
gradient domain (그래디언트 도메인)
이미지를 "밝기 값" 대신 "이웃 픽셀과의 변화량"으로 보는 관점. 여기서 경계 조건만 맞추면 색이 자연스럽게 이어진다.
용어
Gauss-Seidel iteration
큰 연립방정식을 반복적으로 근사해 푸는 수치해법. 포아송 블렌딩의 경계값 문제를 라이브러리 없이 푸는 데 사용(기본 250회).
용어
seam residual (이음매 잔차)
블렌딩 후 경계에서 남은 색·밝기 어긋남의 양. 작을수록 깔끔하다. best-of-N 후보를 정렬하는 점수로 쓰인다.
용어
chroma key (크로마키)
특정 색(여기선 마젠타 #FF00FF)을 투명으로 치환하는 기법. 방송의 "그린 스크린"과 같은 원리. 투명 레이어를 얻는 우회로.
용어
BYOK (Bring Your Own Key)
서비스가 키를 보관하지 않고 사용자가 자기 API 키를 직접 넣어 쓰는 방식. 여기선 키가 브라우저 localStorage에만 저장된다.
용어
OpenRouter
여러 AI 모델(Gemini·GPT 등)을 하나의 통일된 API로 호출하게 해주는 중개 서비스. 모델 교체가 쉬워진다.
용어
Nano Banana
구글 Gemini 이미지 생성 모델 계열의 별명(3 Pro/Flash Image, 2.5 Flash Image). 이 앱이 실제 그림을 그릴 때 쓴다.
용어
autotile (오토타일)
몸통·가장자리·바깥/안쪽 모서리 13장으로 이뤄진 2D 플랫포머용 타일 세트. 지형을 자동으로 자연스럽게 이어 붙인다.
용어
parallax (패럴랙스)
하늘·원경·중경·근경을 서로 다른 속도로 스크롤해 깊이감을 주는 2D 배경 기법.
용어
pose rig / ControlNet 발상
생성물의 구조(자세·뼈대)를 미리 그린 가이드로 고정하는 것. 이 앱은 마네킹을 코드로 그려 스프라이트 일관성을 잡는다.

11참고 링크

더 깊이 파고들 곳