🧪 Skills

goods-images

Use when the user wants to generate product detail images or carousel/main images for e-commerce platforms like Taobao. Triggers on keywords like 商品图, 详情图, 产...

v1.0.1
❤️ 0
⬇️ 88
👁 1
Share

Description


name: goods-images description: "Use when the user wants to generate product detail images or carousel/main images for e-commerce platforms like Taobao. Triggers on keywords like 商品图, 详情图, 产品图, 电商图, 淘宝图, 轮播图, 主图, or when user uploads a product photo and asks for marketing images."

商品详情图 & 轮播图生成 Skill

Overview

根据用户提供的商品图片和描述,生成电商平台(淘宝/天猫/京东)的 商品详情图(9张)和/或 商品轮播图(5张)。

核心原则

  1. 商品图必须保真。 用户提供的商品图片中的图案、文字、Logo、颜色不得有任何改变。详情图和轮播图是在原图基础上做排版设计和文案包装,不是重新生成商品。
  2. 用户零操作。 全部后台自动完成,直接在对话中输出图片结果。不打开可见浏览器窗口,不让用户手动导出。
  3. 环境自适应。 优先使用 run_command + Python PIL 精确渲染中文文字,如果环境不支持则自动降级到 generate_image 方案。

When to Use

  • 用户上传了商品图片,要求生成详情图或轮播图
  • 用户提供了商品文字描述,要求生成电商图片
  • 用户提到"淘宝详情图"、"商品图"、"电商图"、"轮播图"、"主图"等关键词

需要收集的信息

必须 轮播图额外需要 可选
商品图片(至少1张) 品牌 Logo(文字或图片) 规格参数(尺寸/材质等)
商品描述 活动内容(如"1件9折") 品牌故事
核心卖点

输入处理

  • 有图片 → 观察图片中的产品,推断品类、外观、卖点
  • 仅文字 → 从描述中提取信息,用 generate_image 先生成 1 张商品图
  • 信息不足时追问,最多补问 1 轮,其余从图片和描述中推断

⚠️ 用户可能只要轮播图或只要详情图。 如果用户明确说只要其中一种,跳过另一种。不确定时默认两种都生成。

⚠️ 执行清单(必读)

你必须生成 14 张图片,不是 1 张! 按以下步骤逐一执行:

轮播图(5张)

  1. generate_image 生成模特图1(传入用户原图作为 ImagePaths)
  2. generate_image 生成模特图2(传入用户原图作为 ImagePaths)
  3. generate_image 生成模特图3(传入用户原图作为 ImagePaths)
  4. 用 PIL 脚本或 generate_image 在模特图上叠加 Logo + 活动条 + 卖点关键词,生成 carousel_01 ~ carousel_04
  5. 用 PIL 脚本或 generate_image 生成 carousel_05(白底图,仅 Logo)

详情图(9张)

  1. generate_image → 主图封面(传入原图)
  2. generate_image → 卖点1(传入原图)
  3. generate_image → 卖点2(传入原图)
  4. generate_image → 卖点3(传入原图)
  5. generate_image → 细节标注图(传入原图)
  6. generate_image → 穿着/使用场景
  7. generate_image → 产品参数表(传入原图)
  8. generate_image → 尺码/规格表
  9. generate_image → 售后保障

关键规则

  • 每张图都要单独调用一次 generate_image,不要试图一次生成多张
  • 必须传入用户原图作为 ImagePaths,否则 AI 会画出不一样的商品
  • Logo 和活动文字不要写在 generate_image 的 prompt 里(AI 画中文会变形),应该用 PIL 后处理
  • 背景不要纯白,要有场景感

流程

输入 → 商品分析 → 风格判断 → 并行生成(详情图 + 轮播图)→ 直接输出

Part 1: 商品分析

从用户输入提取:

分析项 来源
商品品类 图片观察 + 描述(上衣/裤子/鞋/配饰/3C/家居/食品...)
核心卖点(2-4个) 描述 + 推断
目标人群 描述 + 推断(儿童/成人/男/女)
商品风格 图片观察(潮酷/日系/运动/甜美/简约/商务...)
卖点关键词 从描述中提取 2-3 个核心词(如"加绒"、"保暖")

Part 2: 风格判断

风格 适用品类 配色方案
简约高端 数码3C、高端家居、护肤品、商务服饰 背景 #fafafa, 文字 #1a1a1a, 点缀 #c9a96e
营销促销 食品零食、日用百货、平价商品 背景 #fff, 强调 #e63946, 点缀 #ff6b35
种草生活 时尚服饰、美妆、母婴、童装 背景 #fdf8f3, 文字 #3d3024, 点缀 #c17a50
科技未来 电子产品、智能设备、数码配件 背景 #0a0a0a, 文字 #fff, 点缀 #00d4ff

Part 3: 轮播图生成(5张)

规范

  • 尺寸:800×800 像素(正方形)
  • 5 张:3 张模特/场景图 + 1 张原图场景化 + 1 张商品特写
  • 左上角:品牌 Logo
  • 前 4 张左侧显示卖点关键词(从描述提取,如"加绒"、"保暖"),半透明背景条+白色文字
  • 前 4 张底部:促销活动条
  • 背景不要纯白/纯灰,应配合商品风格

Step A: 生成模特/场景图

generate_image 生成 3 张图,必须传入用户原图作为 ImagePaths

⚠️ 根据商品品类决定构图和主体:

品类 主体 构图 Prompt 关键词
上衣(卫衣/T恤/外套) 模特 半身照(头到臀) upper body shot, waist-up, cropped at hip
裤子/裙子 模特 下半身 lower body focus, hip to feet
全身套装/连衣裙 模特 全身照 full body shot
鞋子 脚部特写 特写 close-up of shoes on feet, ground level angle
帽子/围巾 模特 头肩特写 close-up, head and shoulders
数码3C/家居 产品 场景摆拍 product in lifestyle setting, styled flat lay
食品 产品 美食摄影 food photography, styled plating, appetizing

⚠️ 背景配合商品风格:

风格 背景场景 Prompt 参考
潮酷/街头 涂鸦墙、砖墙、城市夜景 urban concrete wall with graffiti, city night lights bokeh
日系/文艺 庭院、咖啡店、公园 cozy cafe interior, park with warm sunlight
运动活力 操场、户外阳光 playground, outdoor bright sunlight
甜美可爱 花墙、游乐场 pink flower wall, pastel balloons
简约高端 大理石台面、极简空间 marble surface, minimal white interior
科技感 暗色桌面、霓虹灯 dark desk setup, neon accent lighting

Prompt 模板(服饰类)

A [age]-year-old Asian [boy/girl/man/woman] model wearing [商品英文描述],
[姿态描述], [场景背景],
[构图方式] focusing on the [商品],
e-commerce fashion photography,
[lighting], professional catalog style, high resolution

Prompt 模板(非服饰类)

Product photography of [商品英文描述],
[场景/摆放方式], [背景描述],
e-commerce product photography,
soft studio lighting, professional, high resolution, 800x800

3 张分别用不同姿态/角度和背景。

Step B: 叠加 Logo + 活动条 + 卖点关键词

Agent 应按以下优先级自动选择方案:

方案 1(首选):run_command + Python PIL

先测试环境:

python3 -c "from PIL import Image; print('ok')" 2>/dev/null || pip install Pillow -q

如果可用,用以下脚本精确叠加中文 Logo、活动条和卖点关键词:

from PIL import Image, ImageDraw, ImageFont
import os

CANVAS = 800
FONT_PATHS = [
    '/System/Library/Fonts/PingFang.ttc',                        # macOS
    '/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc',    # Linux Noto
    '/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc',    # Linux Noto alt
    '/usr/share/fonts/truetype/droid/DroidSansFallbackFull.ttf',  # Linux Droid
    '/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc',             # Linux 文泉驿
]

def get_font(size, bold=False):
    for fp in FONT_PATHS:
        if os.path.exists(fp):
            try:
                idx = 1 if bold and fp.endswith('.ttc') else 0
                return ImageFont.truetype(fp, size, index=idx)
            except:
                try: return ImageFont.truetype(fp, size, index=0)
                except: continue
    return ImageFont.load_default()

def add_overlay(img_path, output_path, logo_text,
                promos=None, keywords=None,
                tag_text=None, tag_sub='店铺折扣叠加官方立减'):
    """
    promos:   活动列表, e.g. ['1件9折', '3件85折'] — 支持 1-N 条
    keywords: 卖点关键词, e.g. ['加绒', '保暖'] — 左侧竖排显示
    tag_text: 标签文字, e.g. '秋冬上新' — 为 None 时根据当前月份自动判断
    """
    img = Image.open(img_path).convert('RGBA')
    ratio = max(CANVAS / img.width, CANVAS / img.height)
    img = img.resize((int(img.width * ratio), int(img.height * ratio)), Image.LANCZOS)
    left = (img.width - CANVAS) // 2
    img = img.crop((left, 0, left + CANVAS, CANVAS))

    overlay = Image.new('RGBA', (CANVAS, CANVAS), (0, 0, 0, 0))
    draw = ImageDraw.Draw(overlay)

    # ===== Logo(左上角 + 阴影)=====
    lf = get_font(32, bold=True)
    for dx, dy in [(2,2),(1,1)]:
        draw.text((24+dx, 20+dy), logo_text, fill=(0,0,0,80), font=lf)
    draw.text((24, 20), logo_text, fill=(255,255,255,250), font=lf)

    # ===== 卖点关键词(左侧竖排)=====
    if keywords:
        kf = get_font(36, bold=True)
        total_h = len(keywords) * 50
        ky = (CANVAS - total_h) // 2 - 40
        for kw in keywords:
            bb = draw.textbbox((0,0), kw, font=kf)
            kw_w = bb[2] - bb[0]
            draw.rounded_rectangle([16, ky-4, 16+kw_w+24, ky+42],
                                   radius=6, fill=(0,0,0,100))
            draw.text((29, ky+1), kw, fill=(0,0,0,60), font=kf)
            draw.text((28, ky), kw, fill=(255,255,255,250), font=kf)
            ky += 50

    # ===== 底部活动条 =====
    if promos:
        # 自动判断季节标签
        if tag_text is None:
            import datetime
            m = datetime.datetime.now().month
            tag_text = {1:'年货节',2:'开春上新',3:'春季上新',4:'春季上新',
                        5:'初夏上新',6:'夏季上新',7:'夏季上新',8:'秋季上新',
                        9:'秋季上新',10:'秋冬上新',11:'秋冬上新',12:'年终大促'}.get(m,'新品上市')

        h = 95; th = 32; y0 = CANVAS - h
        # 过渡阴影
        for i in range(30):
            draw.rectangle([0, y0-30+i, CANVAS, y0-29+i], fill=(0,0,0,int(i*6)))
        # 白色标签栏
        draw.rectangle([0, y0, CANVAS, y0+th], fill=(255,255,255,250))
        tf = get_font(14, bold=True)
        tb = draw.textbbox((0,0), tag_text, font=tf)
        tw = tb[2]-tb[0]+28
        draw.rounded_rectangle([14, y0+4, 14+tw, y0+4+24], radius=5, fill=(56,161,105))
        draw.text((28, y0+7), tag_text, fill='white', font=tf)
        sf = get_font(12)
        draw.text((14+tw+14, y0+9), tag_sub, fill=(170,170,170), font=sf)

        # 红色主条(渐变)
        my = y0 + th
        for x in range(CANVAS):
            r = min(int(210+20*x/CANVAS), 230)
            draw.line([(x,my),(x,CANVAS)], fill=(r, min(int(50+8*x/CANVAS),58), 55))

        # 活动文字(数字大 42px,文字小 22px,支持 N 条活动)
        nf = get_font(42, bold=True)
        xf = get_font(22, bold=True)
        def measure(s):
            return sum(draw.textbbox((0,0),c,font=nf if c.isdigit() else xf)[2]
                       -draw.textbbox((0,0),c,font=nf if c.isdigit() else xf)[0]+1 for c in s)
        sep_w = 40
        total_w = sum(measure(p) for p in promos) + sep_w * (len(promos) - 1)
        sx = (CANVAS - total_w) // 2
        cy = my + (CANVAS - my - 42) // 2

        for idx, promo in enumerate(promos):
            for c in promo:
                f = nf if c.isdigit() else xf
                yo = 0 if c.isdigit() else 16
                bb = draw.textbbox((0,0), c, font=f)
                draw.text((sx+1, cy+yo+1), c, fill=(0,0,0,40), font=f)
                draw.text((sx, cy+yo), c, fill=(255,255,255), font=f)
                sx += bb[2] - bb[0] + 1
            if idx < len(promos) - 1:
                sep_x = sx + sep_w // 2
                draw.line([(sep_x, cy+6), (sep_x, cy+38)], fill=(255,255,255,100), width=2)
                sx += sep_w

    img = Image.alpha_composite(img, overlay)
    img.convert('RGB').save(output_path, quality=95)
    print(f'已生成: {output_path}')

调用示例

logo = '品牌名'
promos = ['1件9折', '3件85折']  # 支持 1-N 条
keywords = ['加绒', '保暖']     # 从商品描述提取

add_overlay('model1.png', 'carousel_01.jpg', logo, promos, keywords)
add_overlay('model2.png', 'carousel_02.jpg', logo, promos, keywords)
add_overlay('model3.png', 'carousel_03.jpg', logo, promos, keywords)
add_overlay('product.jpg', 'carousel_04.jpg', logo, promos, keywords)
add_overlay('product.jpg', 'carousel_05.jpg', logo)  # 白底图,无活动条/卖点

⚠️ 执行完成后删除中间产物:

rm -f /tmp/product-details/overlay.py

方案 2(降级):generate_image 直接生成

如果 run_command 不可用,把模特图传入 generate_imageImagePaths,在 prompt 中描述叠加布局。中文文字可能不完美但可接受。

方案 3(最后备选):browser_subagent + HTML

用 HTML/CSS 精确渲染后截图。用户会看到浏览器窗口,体验较差,仅作最终兜底。

5 张轮播图内容

  1. 模特/场景 正面(背景A)+ Logo + 卖点 + 活动条
  2. 模特/场景 侧面(背景B)+ Logo + 卖点 + 活动条
  3. 模特/场景 另一角度(背景C)+ Logo + 卖点 + 活动条
  4. 商品原图场景化 + Logo + 卖点 + 活动条
  5. 商品特写/白底图 + Logo(无活动条、无卖点)

Part 4: 详情图生成(9张)

编排规划

从以下类型中选择 9 张(根据品类调整):

优先级 类型 适用品类
★★★ 必选 主图封面 全部
★★☆ 建议 核心卖点图(2-3张) 全部
★★☆ 建议 细节标注图 全部
★★☆ 建议 使用场景/穿着场景 服饰/家居/食品
★★☆ 建议 规格参数表 全部
★☆☆ 可选 尺码对照表 服饰/鞋类
★☆☆ 可选 包装清单 3C/家居/礼品
★☆☆ 可选 对比图/竞品优势 全部
★☆☆ 可选 搭配推荐 服饰
★★☆ 建议 售后保障 全部

详情图生成方式

generate_image 逐张生成。 每张传入用户原图作为 ImagePaths

Prompt 通用结构

E-commerce product detail page image, 790px wide, approximately 1100px tall.
[Layout: what's shown, where elements are positioned]
[Chinese text content as decorative elements]
Product: [商品描述]
Style: [风格配色], professional Taobao/Tmall product detail page design.

9 张详情图 Prompt 模板

⚠️ 以下模板中的 [占位符] 需根据实际商品替换!

1. 主图封面

E-commerce hero banner, 790x1100px.
Large product photo centered, product: [商品描述].
Top: large bold Chinese title "[标题2-6字]".
Subtitle: "[副标题一句话]".
Season tag: "[年份+季节]新款".
Style: [风格配色], premium e-commerce design.

2-4. 核心卖点图(每个卖点一张)

Product feature highlight page, 790x1100px.
[左右分栏/上下分栏] layout for: [商品描述].
Feature title: "[卖点标题]" in large bold text.
Description: "[卖点说明1-3行]".
[产品细节照片/图标插画] showing the feature.
Style: [风格配色].

5. 细节标注图

Product detail annotation page, 790x1100px.
Center: full product photo of [商品描述].
4 annotation callouts with connecting lines:
  - "[细节1]" pointing to [部位1]
  - "[细节2]" pointing to [部位2]
  - "[细节3]" pointing to [部位3]
  - "[细节4]" pointing to [部位4]
Clean background, professional annotation style.

6. 使用场景/穿着场景

Lifestyle scene page, 790x1100px.
Title: "[场景标题]".
[模特穿着/产品使用] photo in [场景描述].
Subtitle: "[副标题]".
Style: [风格配色], aspirational lifestyle design.

7. 规格参数表

Product specification page, 790x1100px, clean table layout.
Title: "产品参数".
Table rows:
  品名: [商品名]
  [面料/材质]: [具体信息]
  [适用人群]: [具体信息]
  [颜色]: [具体信息]
  [其他参数...]
Small product thumbnail below.
Style: [风格配色], clean grid.

8. 尺码/规格对照表(服饰/鞋类)

Size chart page, 790x1100px.
Title: "尺码参考".
Table: [根据品类自动生成合适的尺码范围和度量项]
Note: "因测量方式不同,尺寸可能有1-3cm误差".
Size guide illustration.
Style: warm, parent-friendly design.

⚠️ 尺码范围应根据商品品类自动调整:

  • 童装:110-160
  • 成人男装:S/M/L/XL/2XL/3XL
  • 成人女装:XS/S/M/L/XL/2XL
  • 鞋类:36-45(或对应码)
  • 非服饰品类跳过此图,替换为"包装清单"或"对比优势"

9. 售后保障

After-sales guarantee page, 790x1100px.
Title: "售后保障".
4 guarantee icons in 2x2 grid:
  - 正品保证(shield icon)
  - 7天无理由退换(return icon)
  - 极速退款(refund icon)
  - 运费险(shipping icon)
Bottom: "品质之选 · 放心购买".
Style: trustworthy, warm, [风格配色].

输出规范

文件保存路径

所有生成的图片保存到 /tmp/product-details/

图片类型 文件名
模特/场景原图 model1.png, model2.png, model3.png
轮播成品图 carousel_01.jpg ~ carousel_05.jpg
详情图 detail_01.png ~ detail_09.png
用户原图副本 product.jpg

展示方式

view_file 在对话中直接展示所有图片:

  1. 先展示 5 张轮播图
  2. 再展示 9 张详情图
  3. 最后给出图片清单总结表格

错误处理

场景 处理方式
generate_image 生成的图片不符合预期 调整 prompt 重新生成,最多重试 2 次
PIL 不可用 自动降级到 generate_image 方案
用户原图分辨率过低 提示用户,但仍继续生成
generate_image 调用失败 跳过该张图,继续生成其余图片,最后告知用户

注意事项

✅ 正确 ❌ 错误
generate_image 传入用户原图作为 ImagePaths 不传原图导致商品外观偏差
所有中文文案由 AI 根据商品分析自动生成 要求用户自己写文案
模特/场景图背景有场景感 纯白或纯灰背景
直接在对话中输出图片 让用户手动去网页导出
PIL 首选、generate_image 降级 硬依赖某个方案不做兜底
所有图片风格统一 每张图风格不一样
根据品类调整构图/尺码/场景 所有商品用同一套模板
卖点关键词从描述自动提取 遗漏用户描述中的核心卖点
tag_text 根据季节自动生成 硬编码"秋冬上新"

Reviews (0)

Sign in to write a review.

No reviews yet. Be the first to review!

Comments (0)

Sign in to join the discussion.

No comments yet. Be the first to share your thoughts!

Compatible Platforms

Pricing

Free

Related Configs