mcpField
I
image-generation

image-generation

github.com/arnavpuri创意与媒体17143 次安装5 周前更新
代码仓库

关于 image-generation

image-generation 是一项使用 Google 的 Gemini 3.1 Flash Image Preview 模型生成和编辑图像的技能。它涵盖提示词编写、参考图工作流、多轮优化,以及将素材导出为不同尺寸。

主要功能

  1. 01根据文本提示生成图像
  2. 02使用参考图编辑图像
  3. 03通过多轮对话优化结果
  4. 04批量生成图像素材
  5. 05将主图导出为预设或自定义尺寸
  6. 06检查输出中的文字、布局和瑕疵

适用场景

  1. 01根据文字说明制作图形
  2. 02将产品照片制作成设计图
  3. 03通过对话迭代视觉方案
  4. 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% 不透明度添加微妙的几何三角形。 整体简洁、现代、高端。不要边框,不要剪贴画。

核心原则
  1. 描述场景,而非关键词——“一只运动鞋悬浮在反光表面上方,侧面光线戏剧性十足”胜过“运动鞋、酷、现代”
  2. 具体描述颜色——始终包含设计背景信息中的十六进制颜色代码
  3. 描述空间布局——“标题位于上方三分之一处,产品居中,行动号召位于右下方”
  4. 明确风格——“扁平矢量”“3D 渲染”“水彩”“照片写实”“极简瑞士设计”
  5. 注明排版要求——字体风格、大小关系、颜色、位置
  6. 说明要排除的元素——“不要图库照片水印,不要斜面效果,不要剪贴画”
特定风格的提示词模式
风格提示词补充内容
极简主义“留白充足,单一强调色,简洁的无衬线字体,不添加装饰元素”
大胆/鲜艳“高饱和色彩,大号醒目字体,几何形状,高对比度”
奢华“深色背景,金色或香槟色点缀,衬线字体,微妙纹理,优雅”
活泼“明亮的配色,圆润的形状,手绘质感,随性的手写字体”
企业风格“结构化网格,专业风格,蓝色调,清晰的层级,均衡的构图”
复古“半色调网点,柔和的复古配色,衬线标题,胶片颗粒纹理”
粗野主义“原始质感,黑白高对比,非传统布局,超大字体”

步骤 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:51080x1350信息流展示面积最佳;网格预览会居中裁剪为 3:4
Instagram 信息流(方形)1:11080x1080文字与边缘保持约 100px 的距离
Instagram / TikTok Story、Reels9:161080x1920文字避开顶部约 250px 和底部约 340px 的区域(界面叠层)
X / Twitter 帖子16:91600x900确保文字在小尺寸预览中清晰可读
LinkedIn 帖子1:1 或 4:51200x1200 / 1080x1350链接预览约为 1.91:1(1200x627)——生成 16:9,再使用 --resize
Facebook / Open Graph 链接图片16:9 → 裁剪1200x630生成 16:9,使用 --resize 1200x630
Pinterest Pin2:31000x1500竖版,吸引用户停下滚动
YouTube 缩略图16:91280x720高对比度,在 168x94px 尺寸下也清晰可读;避开右下角(时间戳)
网页横幅(排行榜横幅)8:1728x90文字精简,行动号召醒目
中矩形广告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 → 信息图生成

每项技能都会在此基础生成工作流之上,添加特定领域的提示词模式。

评论

支持 Markdown