story-cover について
story-coverは、Web小説向けの表紙を生成するスキルです。タイトル、作者名、ジャンルからプロンプトを作り、GPT-Image-2で文字入り表紙を生成します。参考画像の利用や、プラットフォーム指定サイズへの書き出しにも対応します。
主な機能
- 01タイトルと作者名入り表紙の生成
- 02ジャンルに応じたビジュアルプロンプト作成
- 03参考画像を使った画像生成
- 04プラットフォーム寸法へのトリミングと拡大縮小
- 05表紙の文字と構図の確認
活用シーン
- 01Web小説の表紙案作成
- 02参考画像をもとにした表紙制作
- 03プラットフォーム指定サイズでの画像書き出し
- 04タイトルと作者名の表示確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ qin1473692580-ux/ oh-story-claudecode --skill story-coverインストール後、Claude Code で/story-coverを入力して読み込まれたか確認します。
同梱ファイルreferences/cover-styles.md
詳細
story-cover:小説の表紙生成
あなたは小説の表紙デザイナーです。書名とジャンルに基づいて GPT-Image-2 を呼び出し、書名と作者名を含む完全な表紙を一度に生成します。
基本原則:表紙は読者の第一印象です。一目でジャンルと雰囲気が伝わるようにします。
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
GPT_IMAGE_API_KEY | ✅ | — | OpenAI または互換プロキシの API Key |
GPT_IMAGE_BASE_URL | https://api.openai.com/v1 | 互換プロキシを使う場合は変更します | |
GPT_IMAGE_MODEL | gpt-image-2 | 新しいモデルをテストするときのみ上書きします | |
GPT_IMAGE_SIZE | 1024x1536 | 目標アスペクト比の指定(番茄 3:4→768x1024、デフォルト 2:3→1024x1536)。公式の gpt-image-2 は 16 の倍数であれば任意のサイズ(アスペクト比≤3:1)を受け付けますが、多くの中継プロキシは size を無視し、プリセットに従って約 2:3 で返します(実測済み)——プラットフォームのサイズはこの変数ではなく、「プラットフォームのアップロードサイズに書き出す」ステップで担保します | |
UPLOAD_SIZE | — | プラットフォームで指定されたアップロードピクセルサイズ(番茄 600x800)。設定すると、「プラットフォームのアップロードサイズに書き出す」ステップで中央トリミング+拡大縮小を行い、アップロード版を作成します(変形せず、生成画像のサイズにも依存しません) | |
BOOK_DIR | ✅ | — | 出力ディレクトリ。./covers/<書名> を推奨します |
REF_IMAGE | — | 参考画像のローカルパスまたは URL。設定すると images/edits による画像から画像への生成を行います |
生成手順
Step 1:情報を収集する
必須:書名、作者名(ペンネーム)、対象プラットフォーム、出力ディレクトリ BOOK_DIR(./covers/<書名> を推奨。呼び出し前に export)
任意:参考画像 REF_IMAGE(ローカルパスまたは URL。設定すると画像から画像への生成に切り替わります)、スタイルの好み、サイズ
書名とペンネームは表紙に必須の情報です:どちらかが欠けている場合は、現在のプラットフォームの対話機能を使って、必ず先にユーザーに確認してください(Claude では
AskUserQuestionを使用できます。TRAE Code ではメインの会話で直接質問し、回答を待ちます)。捏造したり、空欄にしたりしてはいけません。
対象プラットフォームに合わせて表紙サイズを決める:番茄のアップロードサイズ 600×800 は 3:4(2:3 ではありません)です。画像のアスペクト比が異なると、プラットフォームで再トリミングされ、書名やペンネームが切れてしまいます。
| プラットフォーム | アップロードサイズ | アスペクト比 | 生成時の GPT_IMAGE_SIZE(できるだけ合わせる) |
|---|---|---|---|
| 番茄小説 | 600×800 | 3:4 | 768x1024 |
| その他のプラットフォーム(デフォルトは縦向き) | プラットフォームの仕様に従う | 2:3 | 1024x1536 |
目標のアスペクト比を export GPT_IMAGE_SIZE で指定します(公式モデルは指定どおりに生成しますが、多くのプロキシは無視して約 2:3 で返します)。プラットフォームに固定のアップロードピクセルサイズがある場合は、さらに export UPLOAD_SIZE を設定します(番茄 600x800)。**最終的なプラットフォームのサイズは、「プラットフォームのアップロードサイズに書き出す」ステップで中央トリミング+拡大縮小を行って担保するため、プロキシが size を認識するかどうかには依存しません。**プラットフォームとジャンル別のスタイルについては、references/cover-styles.md を参照してください。
Step 2:ジャンルを判定する
書名(必要に応じてあらすじも)のキーワードを確認し、references/cover-styles.md の「ジャンル推定ルール」表に照らしてジャンルを選びます。
- 1 つのジャンルに該当 → そのまま採用します
- 複数のジャンルに該当 → 優先順位に従って 1 つ選びます:仙侠 > 西洋ファンタジー > 古代恋愛 > 現代恋愛 > 都市 > ミステリー > SF > 歴史 > 怪異 > ライトノベル
- どれにも該当しない → デフォルトの
都市を使用します
Step 3:プロンプトを作成する
プロンプト = 文字レイヤー + スタイルレイヤー + 画面レイヤー。すべて英語で記述します。
文字レイヤー:書名+作者名のフォントデザイン
プロンプトに中国語の書名と作者名を直接含めます。GPT-Image-2 はそのまま描画できます。フォントのスタイルを重点的に指定してください:
Title text '书名' at top center in [书名字体风格].
Author name '作者名' at bottom center in [作者名字体风格].
書名のフォントスタイル
| ジャンル | 説明キーワード |
|---|---|
| 玄幻/仙侠 | bold golden brush calligraphy with metallic glow and sharp strokes |
| 都市 | modern bold sans-serif with metallic silver finish |
| 古代恋愛/宮廷闘争 | elegant golden traditional Kai script with ornate decoration |
| 現代恋愛/甘い恋愛 | soft rounded handwritten style in white with pink glow |
| ミステリー/推理 | distorted bold cracked letters in blood red |
| SF/終末もの | neon glowing futuristic font in electric blue |
| 西洋ファンタジー | metallic embossed fantasy lettering with glow effect |
| 歴史/軍事 | heavy stone-carved seal script in deep red |
| 怪異/ホラー | eerie dripping handwritten font in sickly green |
| ライトノベル | colorful cartoon outlined bubbly font |
作者名のフォントスタイル(重要:作者名は丁寧にデザインし、単なる「小さな文字」にしてはいけません)
作者名は小さくても、表紙のプロフェッショナルな印象を左右する重要な要素です。作者名が書名のスタイルと調和しつつ、主役を奪わないよう、フォント+色+装飾要素を必ず指定します。
| ジャンル | 作者名のスタイルを指定するプロンプト |
|---|---|
| 玄幻/仙侠 | small refined white serif text with faint golden glow, flanked by delicate cloud-scroll ornaments on both sides, resting on a thin horizontal gold line |
| 都市 | small clean white modern text with subtle drop shadow, positioned above a thin silver horizontal divider line |
| 古代恋愛/宮廷闘争 | small elegant dark red traditional text inside a thin golden rectangular border frame with corner decorations |
| 現代恋愛/甘い恋愛 | small soft pink-white handwritten text with a tiny heart motif on the left side, light sparkle effect |
| ミステリー/推理 | small pale grey text with slight blur effect, almost hidden in the shadows, a thin cracked line underneath |
| SF/終末もの | small crisp white monospace text with subtle cyan scanline overlay, flanked by small geometric brackets |
| 西洋ファンタジー | small bronze medieval script text with aged parchment texture, enclosed in a small decorative shield or banner shape |
| 歴史/軍事 | small dignified white Song typeface text above a double horizontal line in dark red |
| 怪異/ホラー | small faded grey-green text slightly tilted, with a thin dripping ink line above |
| ライトノベル | small playful rounded white text with pastel color outline, tiny star decorations on both sides |
作者名の共通ルール:
- サイズ:
small(書名の焦点を奪うほど大きくせず、読み取れないほど小さくもしません) - 位置:
at bottom center。画面の下端から適度な間隔を空けます - 装飾要素を必ず入れます:線/枠/小さなアイコン/光の効果のうち、少なくとも 1 つ
- 背景とコントラストをつけつつ、目に痛くない色にします
风格层:平台风格
平台风格的描述关键词统一来自 references/cover-styles.md 的「平台风格」节,按目标平台直接取对应关键词串使用,不在本文件维护副本以免与参考文件漂移。
画面层:题材 + 构图
从 references/cover-styles.md 读取题材对应的风格标签、色彩、人物、背景描述。
构图变体(首次输出 2-3 个方案):
| 方案 | 构图 | 适合题材 |
|---|---|---|
| A | 人物特写 + 场景 | 全题材通用 |
| B | 全身像 + 动态姿势 | 玄幻、都市、西幻 |
| C | 纯场景/氛围图 | 悬疑、科幻、历史 |
完整提示词模板
Chinese web novel cover design, [平台风格].
Title text '{书名}' at top center in [书名字体风格].
Author name '{作者名}' at bottom center in [作者名字体风格 — 从上表选择].
[题材风格标签]. [人物描述]. [背景描述].
[色彩指令]. [光效指令].
Professional book cover, high detail digital painting, portrait [平台比例:番茄=3:4,默认=2:3] ratio, keep title and author name inside the central safe area away from edges (inner ~85%), no watermark
提示词技巧(实测验证)
- 人物描述越具体越好:服饰、姿态、发型、表情、道具每个维度都指定
- 背景分层:前景(人物)→ 中景(场景)→ 远景(氛围)
- 光效是指定光源方向 + 颜色(如
dramatic golden light from above) - 用
digital painting style而非photo,避免真人照片感
Step 4:调用 API 并保存
gpt-image-2 始终返回 base64,请求体不要带 response_format(旧 DALL-E 参数,gpt-image 系列不支持)。$PROMPT 为「构建提示词」步骤拼出的完整提示词。
两种调用方式二选一:未设置 REF_IMAGE → 走「文生图」;设置了 → 走「图生图」。
文生图(默认)
set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"
mkdir -p "$BOOK_DIR/封面"
# 自增版本号,避免覆盖之前生成的封面
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
trap 'rm -f "$RESP"' EXIT
# 用 jq 拼 JSON 体,避免 PROMPT 里的引号/换行/中文把 shell 字符串撑破
BODY=$(jq -n \
--arg m "$MODEL" \
--arg p "$PROMPT" \
--arg s "$SIZE" \
'{model:$m, prompt:$p, size:$s}')
curl -fsS --max-time 180 --retry 2 --retry-delay 5 \
"$BASE_URL/images/generations" \
-H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
-H "Content-Type: application/json" \
-d "$BODY" > "$RESP"
# API 出错时早退,避免把 error JSON 当成 base64 写成损坏 PNG
if jq -e '.error' "$RESP" >/dev/null 2>&1; then
echo "API error:" >&2
jq '.error' "$RESP" >&2
exit 1
fi
# `// empty` 让缺失字段输出空串而非 "null",配合下面的 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }
# 落地提示词副本,方便迭代时基于上一次微调
printf '%s\n' "$PROMPT" > "${OUT%.png}.prompt.txt"
file "$OUT"
ls -lt "$BOOK_DIR/封面/"
图生图(提供参考图时)
/v1/images/edits 走 multipart/form-data,不能 用 Content-Type: application/json。文本字段用 --form-string(避免 @ 被误判为文件引用),图片字段用 -F image=@path。
set -euo pipefail
: "${GPT_IMAGE_API_KEY:?请设置 export GPT_IMAGE_API_KEY=你的key}"
: "${PROMPT:?请先 export PROMPT=构建提示词步骤拼好的完整提示词}"
BASE_URL="${GPT_IMAGE_BASE_URL:-https://api.openai.com/v1}"
MODEL="${GPT_IMAGE_MODEL:-gpt-image-2}"
SIZE="${GPT_IMAGE_SIZE:-1024x1536}"
BOOK_DIR="${BOOK_DIR:?请先 export BOOK_DIR=./covers/<书名>}"
REF_IMAGE="${REF_IMAGE:?请先 export REF_IMAGE=本地路径或 URL}"
mkdir -p "$BOOK_DIR/封面"
# 自增版本号
i=1
while [ -f "$BOOK_DIR/封面/封面_v${i}.png" ]; do i=$((i+1)); done
OUT="$BOOK_DIR/封面/封面_v${i}.png"
RESP=$(mktemp)
REF_TMP=""
trap '[ -n "$REF_TMP" ] && rm -f "$REF_TMP"; rm -f "$RESP"' EXIT
# URL 先下载到临时文件,本地路径直接用。用裸 mktemp 以保证 macOS/Linux 行为一致。
case "$REF_IMAGE" in
http://*|https://*)
REF_TMP=$(mktemp)
curl -fsSL --max-time 60 -o "$REF_TMP" "$REF_IMAGE"
REF_LOCAL="$REF_TMP"
;;
*)
[ -f "$REF_IMAGE" ] || { echo "参考图不存在: $REF_IMAGE" >&2; exit 1; }
REF_LOCAL="$REF_IMAGE"
;;
esac
curl -fsS --max-time 240 --retry 2 --retry-delay 5 \
"$BASE_URL/images/edits" \
-H "Authorization: Bearer $GPT_IMAGE_API_KEY" \
--form-string "model=$MODEL" \
--form-string "size=$SIZE" \
--form-string "prompt=$PROMPT" \
-F "image=@$REF_LOCAL" > "$RESP"
if jq -e '.error' "$RESP" >/dev/null 2>&1; then
echo "API error:" >&2
jq '.error' "$RESP" >&2
exit 1
fi
# `// empty` 让缺失字段输出空串而非 "null",配合 -s 检查避免写出 3 字节假 PNG
jq -er '.data[0].b64_json // empty' "$RESP" | base64 --decode > "$OUT"
[ -s "$OUT" ] || { echo "empty or malformed output: $OUT" >&2; head -c 300 "$RESP" >&2; exit 1; }
printf '%s\n' "$PROMPT" > "${OUT%.png}.prompt.txt"
printf '%s\n' "$REF_IMAGE" > "${OUT%.png}.ref.txt"
file "$OUT"
ls -lt "$BOOK_DIR/封面/"
Step 5:导出平台上传尺寸(平台有固定像素时)
设了 UPLOAD_SIZE(番茄 600×800)就把原图居中裁剪+缩放成上传尺寸——不论出图是 2:3 还是 3:4 都裁成平台精确像素,不变形,避免平台再裁切掉书名/笔名。原图保留、另存 _上传 版:
SRC="${OUT:-$(ls -t "${BOOK_DIR:-.}"/封面/封面_v*.png 2>/dev/null | grep -v _上传 | head -1)}" # 复用「调用 API 并保存」步骤的 $OUT;新 shell 里从 BOOK_DIR 找最新原图
TARGET="${UPLOAD_SIZE:-}" # 番茄=600x800;未设则跳过
if [ -n "$TARGET" ] && [ -f "$SRC" ]; then
UP="${SRC%.png}_上传.png"; W="${TARGET%x*}"; H="${TARGET#*x}"
if command -v magick >/dev/null 2>&1; then M=magick
elif command -v convert >/dev/null 2>&1; then M=convert; else M=""; fi
if [ -n "$M" ]; then
"$M" "$SRC" -resize "${W}x${H}^" -gravity center -extent "${W}x${H}" "$UP" # 缩放填满后居中裁
elif command -v sips >/dev/null 2>&1; then
cp "$SRC" "$UP"
sw=$(sips -g pixelWidth "$UP" | awk '/pixelWidth/{print $NF}')
sh=$(sips -g pixelHeight "$UP" | awk '/pixelHeight/{print $NF}')
if [ $((sw*H)) -ge $((sh*W)) ]; then sips --resampleHeight "$H" "$UP" >/dev/null
else sips --resampleWidth "$W" "$UP" >/dev/null; fi
sips -c "$H" "$W" "$UP" >/dev/null # sips -c 是 高 宽,居中裁
else
echo "无 magick/convert/sips,跳过;手动把 $SRC 居中裁剪+缩放到 $TARGET 再上传" >&2
fi
[ -f "$UP" ] && file "$UP"
fi
书名/笔名已在提示词里留中心安全区,居中裁剪不会切到。
Step 6:质量检查 + 迭代
| 检查项 | 标准 |
|---|---|
| 文字渲染 | 书名清晰可辨,字体风格匹配题材 |
| 题材匹配 | 视觉风格与书名题材一致 |
| 构图合理 | 主体突出,文字不遮挡核心画面 |
| 平台适配 | 符合目标平台的封面风格调性 |
| 平台尺寸 | 比例与平台一致;缩放到上传尺寸后书名、笔名完整可见、未被裁切 |
不满意时调整方向:更换构图、调整色调、换字体风格、换平台风格。
参考资料
| 文件 | 何时加载 |
|---|---|
| references/cover-styles.md | 题材→视觉风格映射、平台风格详情、提示词模板 |
语言
- 跟随用户的语言回复,用户用什么语言就用什么语言回复
- 中文回复遵循《中文文案排版指北》