关于 image-generation
image-generation 是一项使用 Google 的 Gemini 3.1 Flash Image Preview 模型生成和编辑图像的技能。它涵盖提示词编写、参考图工作流、多轮优化,以及将素材导出为不同尺寸。
主要功能
- 01根据文本提示生成图像
- 02使用参考图编辑图像
- 03通过多轮对话优化结果
- 04批量生成图像素材
- 05将主图导出为预设或自定义尺寸
- 06检查输出中的文字、布局和瑕疵
适用场景
- 01根据文字说明制作图形
- 02将产品照片制作成设计图
- 03通过对话迭代视觉方案
- 04为多种社交媒体或广告规格准备图片
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ arnavpuri/ designskills --skill image-generation安装后在 Claude Code 中输入/image-generation确认已加载。
附带文件scripts/export-sizes.pyscripts/gemini-generate.py
详细介绍
使用 Gemini 3.1 Flash 生成图像
使用 Google 的 Gemini 3.1 Flash Image Preview 模型生成和编辑图像的基础技能。所有图形设计技能都会引用此技能中的生成流程。
前提条件
pip install google-genai Pillow
export GEMINI_API_KEY="your-api-key"
步骤 0:加载品牌背景信息
如果 .agents/design-context.md 存在,请读取其中的十六进制颜色、风格原型和排版描述,并将其加入提示词。如果该文件不存在,则使用 design-context 的默认值,并告知用户输出尚未与品牌风格匹配。如果用户提供了徽标或产品照片,请将其作为 --image 参考图传入,而不是用文字描述——与文字描述相比,模型能更忠实地复现参考图。
步骤 1:选择生成模式
| 模式 | 适用场景 | 输入 |
|---|---|---|
| 文本生成图像 | 从零开始创作——海报、图形、插画 | 仅文本提示词 |
| 图像编辑 | 产品图、样机、风格迁移、添加元素 | 图像 + 文本提示词 |
| 多轮对话 | 迭代优化、探索不同变化 | 聊天会话 |
| 批量生成 | 大批量生成素材(社交媒体套图、广告变体) | 通过 Batch API 传入多个提示词 |
步骤 2:编写提示词
提示词结构
每个提示词都应遵循以下层级:
[FORMAT] + [SUBJECT] + [STYLE] + [COMPOSITION] + [COLOR] + [TYPOGRAPHY] + [MOOD] + [NEGATIVE]
示例——产品社交媒体帖子:
为高端耳机新品发布制作一张方形社交媒体图形。 耳机位于深海军蓝(#0d1b2a)到亮电光蓝(#00b4d8)的对角渐变背景中央。 粗体白色无衬线文字“HEAR EVERYTHING”横跨上方三分之一处。 下方添加小号珊瑚色(#ff6b6b)副标题“Available March 20”。 背景中以 10% 不透明度添加微妙的几何三角形。 整体简洁、现代、高端。不要边框,不要剪贴画。
核心原则
- 描述场景,而非关键词——“一只运动鞋悬浮在反光表面上方,侧面光线戏剧性十足”胜过“运动鞋、酷、现代”
- 具体描述颜色——始终包含设计背景信息中的十六进制颜色代码
- 描述空间布局——“标题位于上方三分之一处,产品居中,行动号召位于右下方”
- 明确风格——“扁平矢量”“3D 渲染”“水彩”“照片写实”“极简瑞士设计”
- 注明排版要求——字体风格、大小关系、颜色、位置
- 说明要排除的元素——“不要图库照片水印,不要斜面效果,不要剪贴画”
特定风格的提示词模式
| 风格 | 提示词补充内容 |
|---|---|
| 极简主义 | “留白充足,单一强调色,简洁的无衬线字体,不添加装饰元素” |
| 大胆/鲜艳 | “高饱和色彩,大号醒目字体,几何形状,高对比度” |
| 奢华 | “深色背景,金色或香槟色点缀,衬线字体,微妙纹理,优雅” |
| 活泼 | “明亮的配色,圆润的形状,手绘质感,随性的手写字体” |
| 企业风格 | “结构化网格,专业风格,蓝色调,清晰的层级,均衡的构图” |
| 复古 | “半色调网点,柔和的复古配色,衬线标题,胶片颗粒纹理” |
| 粗野主义 | “原始质感,黑白高对比,非传统布局,超大字体” |
步骤 3:生成
文本生成图像
from google import genai
from google.genai import types
client = genai.Client()
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents="[your structured prompt]",
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"],
image_config=types.ImageConfig(aspect_ratio="1:1", image_size="2K"),
),
)
# A response can contain text parts and image parts in any order —
# never assume parts[0] is the image.
def save_first_image(response, path):
for part in response.parts or []:
if part.inline_data is not None:
part.as_image().save(path)
return True
print("No image returned:", response.text) # usually a refusal or clarifying question
return False
save_first_image(response, "output.png")
图像编辑(产品图 → 图形)
核心工作流:用户提供产品照片,你围绕照片生成完整图形。
from PIL import Image
product = Image.open("product.png")
response = client.models.generate_content(
model="gemini-3.1-flash-image-preview",
contents=[
product,
"Transform this product photo into a premium social media graphic. "
"Place the product on a gradient background (#1a1a2e to #16213e). "
"Add bold white headline 'JUST DROPPED' above. "
"Add price '$299' in coral (#e94560) below. "
"Modern, clean, high-end feel. Square format."
],
config=types.GenerateContentConfig(
response_modalities=["TEXT", "IMAGE"],
),
)
多轮优化
chat = client.chats.create(
model="gemini-3.1-flash-image-preview",
config=types.GenerateContentConfig(response_modalities=["TEXT", "IMAGE"]),
)
# Generate
r1 = chat.send_message([product_image, "Create a launch graphic for this product..."])
save_first_image(r1, "v1.png")
# Refine colors — change ONE thing per turn and say what to keep
r2 = chat.send_message("Keep the layout and text exactly as is. Make the background warmer, shift to sunset tones")
save_first_image(r2, "v2.png")
# Refine text
r3 = chat.send_message("Keep everything else. Make the headline larger and add a subtle drop shadow")
save_first_image(r3, "v3.png")
命令行工具
此技能的脚本位于 scripts/ 中。下文中的 <image-generation> 指此技能的目录(技能加载时显示的基础目录;克隆此仓库后为 skills/image-generation)。请从用户的项目目录运行这些脚本,以便将输出保存到该目录中。
# Text-to-image
python <image-generation>/scripts/gemini-generate.py --prompt "..." --output graphic.png
# Product image + prompt
python <image-generation>/scripts/gemini-generate.py --image product.png --prompt "..." --output graphic.png
# Multiple reference images (product + logo + style reference), up to 14
python <image-generation>/scripts/gemini-generate.py --image product.png --image logo.png --prompt "..." --output graphic.png
# Aspect ratio and resolution
python <image-generation>/scripts/gemini-generate.py --prompt "..." --aspect-ratio 4:5 --size 2K --output feed.png
# Exact pixel size: generate at the nearest supported ratio, then center-crop + resize
python <image-generation>/scripts/gemini-generate.py --prompt "..." --aspect-ratio 8:1 --resize 728x90 --output leaderboard.png
# Long prompts: keep them in a file
python <image-generation>/scripts/gemini-generate.py --prompt-file prompt.txt --aspect-ratio 16:9 --output hero.png
# Multi-turn (--then is repeatable; outputs default to v1_2.png, v1_3.png ...)
python <image-generation>/scripts/gemini-generate.py --prompt "Create a poster..." --output v1.png \
--then "Change to dark mode" --then "Make the date larger"
当没有返回图像时(遭到拒绝、触发安全拦截,或模型仅以文本作答),脚本会以非零状态码退出并输出模型的文本——请阅读该文本,调整提示词后重试。
从一个主图导出多种尺寸
# Social set, ad set, or named presets; --focus keeps the subject in frame (x,y as 0-1)
python <image-generation>/scripts/export-sizes.py master.png --group social --out exports/
python <image-generation>/scripts/export-sizes.py master.png --presets og,youtube-thumbnail --focus 0.5,0.4 --out exports/
python <image-generation>/scripts/export-sizes.py master.png --size 300x250 --size 728x90 --out ads/
python <image-generation>/scripts/export-sizes.py --list # all presets and groups
当裁剪后保留的主图内容不到一半或必须放大时,它会发出警告——应使用匹配的 --aspect-ratio 单独生成极端比例(8:1、1:4)。查看几张导出图,确认没有裁掉重要内容。
第 4 步:宽高比
支持的比例:1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 1:4, 4:1, 1:8, 8:1。其他比例(例如 300x250、1200x628)必须按最接近的比例生成,再用 --resize 裁剪。
| 使用场景 | 比例 | 最终尺寸 | 备注 |
|---|---|---|---|
| Instagram 信息流(竖版) | 4:5 | 1080x1350 | 信息流展示面积最佳;网格预览会居中裁剪为 3:4 |
| Instagram 信息流(方形) | 1:1 | 1080x1080 | 文字与边缘保持约 100px 的距离 |
| Instagram / TikTok Story、Reels | 9:16 | 1080x1920 | 文字避开顶部约 250px 和底部约 340px 的区域(界面叠层) |
| X / Twitter 帖子 | 16:9 | 1600x900 | 确保文字在小尺寸预览中清晰可读 |
| LinkedIn 帖子 | 1:1 或 4:5 | 1200x1200 / 1080x1350 | 链接预览约为 1.91:1(1200x627)——生成 16:9,再使用 --resize |
| Facebook / Open Graph 链接图片 | 16:9 → 裁剪 | 1200x630 | 生成 16:9,使用 --resize 1200x630 |
| Pinterest Pin | 2:3 | 1000x1500 | 竖版,吸引用户停下滚动 |
| YouTube 缩略图 | 16:9 | 1280x720 | 高对比度,在 168x94px 尺寸下也清晰可读;避开右下角(时间戳) |
| 网页横幅(排行榜横幅) | 8:1 | 728x90 | 文字精简,行动号召醒目 |
| 中矩形广告 | 5:4 → 裁剪 | 300x250 | --resize 300x250 |
| 海报 / 传单 | 2:3 或 3:4 | 印刷尺寸 | 有关出血和 DPI,请参阅 poster-design;印刷使用 4K |
第 5 步:查看输出,然后检查
切勿交付尚未查看过的图片。打开每个生成的文件(例如使用 PNG 的 Read 工具),并以原始尺寸及实际显示尺寸(如缩略图、信息流卡片)检查。
确保文字正确
文字是最常见的问题。为减少错误:
- 在提示词中用双引号括起准确文案:
headline "HEAR EVERYTHING" - 渲染的文字应简短——标题、副标题、行动号召。将长文案(段落、法律声明、会变动的价格)改用 HTML/CSS 叠层,而不是放进图片。
- 拼出不常见的词或品牌名,并注明“拼写必须与所写内容完全一致”。
- 如果返回的单词拼错了,在后续回合中仅引用该词并修正:
Change "EVERYTHNG" to "EVERYTHING". Change nothing else. - 文字修正尝试两次仍失败后,生成不带文字的图片,再通过代码叠层添加文字(参见
graphic-design)。
交付任何生成的图片之前:
- 文字清晰易读且拼写正确(Gemini 可以渲染文字——请核实)
- 颜色符合品牌背景(在提示词中指定十六进制代码)
- 构图具有清晰的视觉层次(一个焦点)
- 文字与背景之间有足够的对比度
- 没有不需要的瑕疵或变形
- 宽高比符合目标平台要求
- 产品图片(如有使用)融合自然,没有变形
- 整体美感符合要求的风格
如果任何一项检查未通过,使用多轮优化修复具体问题——每轮只改一处,并说明哪些内容必须保持不变。告知用户你核实了哪些项目,以及做出了哪些妥协(例如:“由于模型一直拼错文字,因此改为使用叠层添加”)。
还应说明,Gemini 的输出带有不可见的 SynthID 水印,因此可以识别为 AI 生成内容。
参考:模型能力
| 功能 | Gemini 3.1 Flash |
|---|---|
| 最大输入图片数 | 14(10 个对象 + 4 个角色) |
| 输出分辨率 | 512、1K、2K、4K |
| 宽高比 | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 1:4, 4:1, 1:8, 8:1 |
| 文字渲染 | 支持(请在提示词中明确指定) |
| 思考模式 | 默认开启,可改善复杂构图 |
| Batch API | 支持高容量生成 |
| 水印 | 自动应用 SynthID |
与其他技能集成
所有平面设计技能都会引用此技能:
graphic-design→ 主要生成流程social-media-graphic→ 针对平台的生成poster-design→ 海报/传单生成thumbnail-design→ 缩略图生成ad-creative-design→ 广告变体生成product-mockup→ 产品图生成banner-design→ 横幅生成infographic→ 信息图生成
每项技能都会在此基础生成工作流之上,添加特定领域的提示词模式。