다국어 텍스트 프리렌더링 스킬
AI 이미지 모델은 한글·한자·일본어 등 비라틴 문자를 직접 그리면 글자가 깨지거나 오타가 생깁니다.
이 스킬은 웹앱과 완전히 동일한 파이프라인을 제공합니다:
- 1. detect — 프롬프트에 비라틴 문자가 있는지 감지
- analyze — Gemini LLM으로 프롬프트에서 텍스트와 스타일 추출
- render — Canvas로 정확한 폰트를 사용해 텍스트를 PNG 프리렌더링
- generate — 프리렌더링 PNG를 Gemini 이미지 생성에 인풋으로 넣어 최종 이미지 생성
최초 설정 (한 번만)
CODEBLOCK0
- -
canvas + @google/generative-ai npm 패키지 설치 - Noto Sans 폰트 파일을
{baseDir}/fonts/에 준비
환경 변수
| 변수 | 필수 | 설명 |
|---|
| INLINECODE3 | ⭐ 필수 | Gemini Flash(분석) + Gemini Image(생성) 모두에 사용 |
| INLINECODE4 |
선택 | 이미지 생성 모델 (기본: gemini-3-pro-image-preview) |
사용 흐름 (Step-by-Step)
한 번에 실행: pipeline
전체 파이프라인을 한 명령어로 실행합니다:
CODEBLOCK1
결과:
CODEBLOCK2
단계별 실행
Step 1: 비라틴 문자 감지 (detect)
CODEBLOCK3
- -
needsRendering: false → 프리렌더링 없이 일반 이미지 생성 진행 - INLINECODE8 → Step 2로 진행
Step 2: Gemini LLM 프롬프트 분석 (analyze)
CODEBLOCK4
Gemini Flash가 프롬프트를 분석하여:
- - 이미지에 들어갈 텍스트 추출 (따옴표, 레이블, 맥락 기반)
- 디자인 맥락에 맞는 스타일 결정 (폰트, 크기, 색상)
- 각 텍스트의 역할(headline/subheadline/body/caption) 지정
- 각 텍스트의 스크립트·언어 자동 감지
GEMINIAPIKEY가 없으면 규칙 기반 fallback이 동작합니다.
Step 3: Canvas 프리렌더링 (render)
analyze 결과를 그대로 render에 전달합니다:
CODEBLOCK5
또는 JSON 파일로:
CODEBLOCK6
Step 4: Gemini 이미지 생성 (generate)
프리렌더링된 텍스트 PNG를 Gemini에 인풋 이미지로 넣어서 최종 이미지를 생성합니다.
CODEBLOCK7
이 명령어는 내부적으로:
- 1. 프리렌더링 PNG를 첫 번째 참조 이미지로 Gemini에 전달
- INLINECODE12 로 프롬프트를 구성 (텍스트 목록 + 스타일 + "텍스트를 다시 그리지 말고 그대로 사용하라" 지침)
- Gemini가 텍스트를 자연스럽게 통합한 최종 이미지를 생성
추가 참조 이미지가 있으면 --ref로 전달:
node {baseDir}/render.mjs generate \
--prompt "포스터 만들어줘" \
--rendered /tmp/rendered-text.png \
--ref /tmp/user-reference.jpg \
--output /tmp/final-image.png
지원 폰트
| 언어 | sans-serif | serif | display | handwriting |
|---|
| 한국어 | Noto Sans KR | Noto Serif KR | Black Han Sans | Nanum Pen Script |
| 일본어 |
Noto Sans JP | Noto Serif JP | Noto Sans JP | Noto Sans JP |
| 중국어 | Noto Sans SC | Noto Serif SC | Noto Sans SC | Noto Sans SC |
| 태국어 | Noto Sans Thai | — | — | — |
| 영어 | Inter | Georgia | Impact | Comic Sans MS |
텍스트 역할별 크기
| role | 용도 | 크기 비율 |
|---|
| headline | 메인 제목 | 1.0x |
| subheadline |
부제목 | 0.7x |
| body | 본문 | 0.5x |
| caption | 캡션/설명 | 0.4x |
폰트 크기 매핑
| fontSize | 픽셀 |
|---|
| small | 24px |
| medium |
36px |
| large | 48px |
| xlarge | 72px |
트리거 키워드
이 스킬은 사용자 프롬프트에 다음 키워드가 포함되어 있을 때 자동 활성화됩니다:
INLINECODE14 , 글자, 문구, 로고, 워터마크, 브랜드, 글씨, 제목, 헤드라인,
text, logo, title, headline,
또는 프롬프트에 한글/한자/일본어/태국어/아랍어 등 비라틴 문자가 포함된 경우.
규칙 (Do)
- - 비라틴 문자가 감지되면 반드시 전체 파이프라인 (detect→analyze→render→generate)을 실행한다
- INLINECODE27 로 LLM이 텍스트와 스타일을 추출하도록 한다
- INLINECODE28 로 Canvas 프리렌더링 PNG를 생성한다
- INLINECODE29 로 프리렌더링 PNG를 Gemini에 인풋으로 넣어 최종 이미지를 생성한다
금지사항 (Don't)
- - AI 모델에게 비라틴 문자를 직접 그리라고 요청하지 않는다
- 프리렌더링 없이 한글/한자/일본어 텍스트를 이미지 프롬프트에 포함하지 않는다
- INLINECODE30 단계를 건너뛰고 바로
generate하지 않는다 - INLINECODE32 결과에서 텍스트를 임의로 수정하지 않는다
多语言文本预渲染技能
AI图像模型在直接绘制韩文、汉字、日文等非拉丁文字时,会出现文字破损或错别字的问题。
本技能提供与Web应用完全相同的处理流程:
- 1. detect(检测) — 检测提示词中是否包含非拉丁文字
- analyze(分析) — 通过Gemini LLM从提示词中提取文本和样式
- render(渲染) — 使用Canvas和精确字体将文本预渲染为PNG图片
- generate(生成) — 将预渲染的PNG作为输入提供给Gemini图像生成,生成最终图像
初始设置(仅需一次)
bash
cd {baseDir} && node setup.mjs
- - 安装 canvas + @google/generative-ai npm包
- 将Noto Sans字体文件准备到 {baseDir}/fonts/ 目录
环境变量
| 变量 | 必填 | 说明 |
|---|
| GEMINIAPIKEY | ⭐ 必填 | 用于Gemini Flash(分析)和Gemini Image(生成) |
| GEMINIIMAGEMODEL |
可选 | 图像生成模型(默认:gemini-3-pro-image-preview) |
使用流程(分步说明)
一键执行:pipeline
通过一条命令执行整个流程:
bash
node {baseDir}/render.mjs pipeline 帮我制作一个名为욎홎 뙤앾뼡的地区节日海报 \
--output /tmp/final-image.png --no-base64
结果:
json
{
detect: { needsRendering: true, primaryScript: hangul, ... },
analyze: { texts: [...], style: {...}, reasoning: ... },
render: { success: true, outputPath: /tmp/text-render-xxx.png, ... },
generate: { success: true, outputPath: /tmp/final-image.png, ... }
}
分步执行
步骤1:检测非拉丁文字(detect)
bash
node {baseDir}/render.mjs detect 用户完整提示词
- - needsRendering: false → 无需预渲染,直接进行普通图像生成
- needsRendering: true → 进入步骤2
步骤2:Gemini LLM提示词分析(analyze)
bash
node {baseDir}/render.mjs analyze 帮我制作一个名为욎홎 뙤앾뼡的地区节日海报
Gemini Flash分析提示词后:
- - 提取需要放入图像的文本(基于引号、标签、上下文)
- 根据设计上下文确定合适的样式(字体、大小、颜色)
- 指定每个文本的角色(标题/副标题/正文/说明文字)
- 自动检测每个文本的文字系统·语言
如果没有GEMINIAPIKEY,将使用基于规则的备用方案。
步骤3:Canvas预渲染(render)
将analyze结果直接传递给render:
bash
node {baseDir}/render.mjs render \
--json {texts:[...],style:{...}} \
--output /tmp/rendered-text.png
或使用JSON文件:
bash
node {baseDir}/render.mjs render --input /tmp/analysis.json --output /tmp/rendered-text.png
步骤4:Gemini图像生成(generate)
将预渲染的文本PNG作为输入图像提供给Gemini,生成最终图像。
bash
node {baseDir}/render.mjs generate \
--prompt 帮我制作一个名为욎홎 뙤앾뼡的地区节日海报 \
--rendered /tmp/rendered-text.png \
--analysis {texts:[...],style:{...}} \
--output /tmp/final-image.png \
--no-base64
此命令内部执行:
- 1. 将预渲染的PNG作为第一张参考图像传递给Gemini
- 通过buildTextRenderFinalPrompt构建提示词(文本列表 + 样式 + 不要重新绘制文本,直接使用原样指令)
- Gemini生成将文本自然整合的最终图像
如有额外参考图像,可通过--ref传递:
bash
node {baseDir}/render.mjs generate \
--prompt 帮我制作海报 \
--rendered /tmp/rendered-text.png \
--ref /tmp/user-reference.jpg \
--output /tmp/final-image.png
支持的字体
| 语言 | 无衬线体 | 衬线体 | 展示体 | 手写体 |
|---|
| 韩语 | Noto Sans KR | Noto Serif KR | Black Han Sans | Nanum Pen Script |
| 日语 |
Noto Sans JP | Noto Serif JP | Noto Sans JP | Noto Sans JP |
| 中文 | Noto Sans SC | Noto Serif SC | Noto Sans SC | Noto Sans SC |
| 泰语 | Noto Sans Thai | — | — | — |
| 英语 | Inter | Georgia | Impact | Comic Sans MS |
文本角色对应的字号
| 角色 | 用途 | 大小比例 |
|---|
| headline | 主标题 | 1.0x |
| subheadline |
副标题 | 0.7x |
| body | 正文 | 0.5x |
| caption | 说明文字 | 0.4x |
字体大小映射
| fontSize | 像素值 |
|---|
| small | 24px |
| medium |
36px |
| large | 48px |
| xlarge | 72px |
触发关键词
当用户提示词包含以下关键词时,本技能将自动激活:
文本、文字、字样、标志、水印、品牌、字体、标题、头条、
text、logo、title、headline、
或提示词中包含韩文/汉字/日文/泰文/阿拉伯文等非拉丁文字时。
规则(应做事项)
- - 检测到非拉丁文字时,必须执行完整流程(detect→analyze→render→generate)
- 通过analyze让LLM提取文本和样式
- 通过render生成Canvas预渲染PNG
- 通过generate将预渲染PNG作为输入提供给Gemini,生成最终图像
禁止事项(不应做事项)
- - 不要要求AI模型直接绘制非拉丁文字
- 不要未经预渲染就将韩文/汉字/日文文本包含在图像提示词中
- 不要跳过render步骤直接进行generate
- 不要随意修改analyze结果中的文本