v92-v105 多国适配 + 模板导出增强 + 生图可靠性优化
- 新增韩国(KR)适配:countries/pinterest 种子词、K-pop 提示词、UI 国家列表 - 爬虫跨运行持久化已采集 URL(.collected_urls.json),同关键词重复搜索采新图 - 模板导出增强:SPU 商品属性列名前缀剥离匹配、尺码下拉框 INDIRECT 动态引用、 SPU 字段映射(袖长/门襟/胸垫等)、季节/印花图案女装映射、建议售价统一必填、 SKU 分类/数量/单位直接填默认值 - 自定义模式:多模态提示词独立(custom_analyze_*)、生图提示词模板可配置 - Pinterest:空选品守卫、连续空分析保护(max_empty_analyze)、flat_prompt 配置覆盖 - 生图可靠性:开始/完成进度日志、异步任务轮询超时 60s→300s
This commit is contained in:
@@ -18,6 +18,9 @@ logs/
|
||||
# 缓存(可重新采集/生成)
|
||||
.cache/
|
||||
|
||||
# db 备份(临时备份,不入库)
|
||||
db/*.bak*
|
||||
|
||||
# Pinterest 登录态(首次手动登录后缓存,不入库)
|
||||
pinterest_scraper/.chrome_session/
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# POD 热点抓取 Agent(LangGraph 工程化版)
|
||||
|
||||
自动抓取海外各国(US / GB / JP / AU / MX / DE / BR / SA / PL / ES / IT / CA)实时热点 + 风格趋势,
|
||||
自动抓取海外各国(US / GB / JP / AU / MX / DE / BR / SA / PL / ES / IT / CA / KR)实时热点 + 风格趋势,
|
||||
过滤侵权风险,产出可直接用于 AI 生图的印花设计提示词,并完成 **设计稿 → 三合一模特试穿 → OSS 图床 →
|
||||
种草图 → 商品上传模板** 的完整 POD 生产链路。本版本用 **LangGraph** 重写,强调**工程化、节点兜底、可插拔**。
|
||||
|
||||
@@ -61,7 +61,8 @@ START → pinterest_init → pinterest_search → pinterest_scrape → pinterest
|
||||
|
||||
**并发控制**(`config.yaml` 的 `pinterest:`):`analyze_concurrency`(分析线程数)、`analyze_batch`
|
||||
(每轮取图数,0=自动补齐让 pipeline 队列满并发)、`max_designs`(每搜索词简报上限)、
|
||||
`scrape_concurrency`(爬图并发,必须=1)、`err400_limit`(400 超限放弃当前种子词)。
|
||||
`scrape_concurrency`(爬图并发,必须=1)、`err400_limit`(400 超限放弃当前种子词)、
|
||||
`max_empty_analyze`(连续空分析轮次上限,0=自动)。
|
||||
|
||||
**每个节点都用 `graph/validate.with_fallback` 包裹**:任何未预料异常都被捕获、记入
|
||||
`state['errors']`、返回最小更新,整图继续往下走,单点故障不中断流水线。致命图像服务错误(503 /
|
||||
@@ -97,6 +98,14 @@ START → pinterest_init → pinterest_custom_load → pinterest_analyze
|
||||
保证用户每次重新上传/选择的所有有效图片都会被重新多模态分析;分析批上限按「选品清单总数」截断,
|
||||
避免对多余图片浪费配额。`pinterest_custom_route` 只在 wait / analyze / done 间流转,从不 search。
|
||||
|
||||
**自定义模式提示词独立**:
|
||||
- **多模态分析提示词**:`prompts/custom_analyze_system.md` / `prompts/custom_analyze_user.md`
|
||||
(与 Pinterest 模式的 `pinterest_analyze_*` 完全独立,互不影响);
|
||||
- **生图提示词模板**:`config.yaml` 的 `custom.prompt_pieces`(`image_prompt_template` /
|
||||
`negative_prompt`)可编辑——以参考图片的整体氛围/主题/时代/风格类型为灵感,**明确禁止复制或模仿**
|
||||
参考图片的印刷 artwork、角色、布局、文字及服装/模特等元素,仅基于观察到的主题/技术/调色板/布局
|
||||
生成新设计;留空回退代码内置 `CUSTOM_IMAGE_PROMPT_TEMPLATE` / `CUSTOM_NEGATIVE_PROMPT`。
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
@@ -105,7 +114,7 @@ pod_trend_agent/
|
||||
├── ui_app.py # 桌面 UI(Tkinter)
|
||||
├── config.yaml # 全局配置(数据源、权重、黑名单、LLM、模板、compose/product/oss/seed_shot)
|
||||
├── configs/
|
||||
│ ├── countries/ # 各国 Google Trends 种子词(US|GB|JP|AU|MX|DE|BR|SA|PL|ES|IT|CA.yaml)
|
||||
│ ├── countries/ # 各国 Google Trends 种子词(US|GB|JP|AU|MX|DE|BR|SA|PL|ES|IT|CA|KR.yaml)
|
||||
│ ├── pinterest/ # 各国 Pinterest 种子词池(<CC>.yaml)
|
||||
│ ├── model_features.yaml # 模特特征库(按性别分组 female/male,种草图用)
|
||||
│ ├── seed_shot_templates.yaml # 种草图提示词模板
|
||||
@@ -115,6 +124,8 @@ pod_trend_agent/
|
||||
│ └── aesthetics.yaml # 审美 hint + 风格-配色 extra 规则 + 额外黑名单
|
||||
├── prompts/pinterest_analyze_system.md # 多模态分析系统提示词(Pinterest/自定义模式),可配置
|
||||
├── prompts/pinterest_analyze_user.md # 多模态分析用户提示词,可配置
|
||||
├── prompts/custom_analyze_system.md # 自定义模式多模态分析系统提示词(独立于 Pinterest)
|
||||
├── prompts/custom_analyze_user.md # 自定义模式多模态分析用户提示词(独立于 Pinterest)
|
||||
├── graph/
|
||||
│ ├── state.py # AgentState(共享状态)
|
||||
│ ├── validate.py # with_fallback 兜底 + 数据校验
|
||||
@@ -142,7 +153,7 @@ pod_trend_agent/
|
||||
├── basemap/ # 平铺衣服底图(<款号>/<SKU.code>/)
|
||||
├── material_library/ # 模特图(<品类>/)
|
||||
├── db/spu_sku.db # SPU/SKU 数据库
|
||||
├── pinterest_scraper/ # Playwright 爬虫 + Chrome 登录态
|
||||
├── pinterest_scraper/ # Playwright 爬虫 + Chrome 登录态(含跨运行持久化 .collected_urls.json)
|
||||
└── output/<country>/ # ★ 每个国家的产物独立文件夹
|
||||
├── design_briefs.json/md # 设计简报(含 image_prompt / composite_prompt)
|
||||
├── designs/ # 纯印花设计稿
|
||||
@@ -156,6 +167,9 @@ pod_trend_agent/
|
||||
2. **按需搜索**:每次只生成 1 个搜索词(`search_terms_per_run=1`),自动追加「 t-shirt design」后缀
|
||||
(保证爬到的图是真实印花艺术,而非生活方式/风景图);爬取成功才标记已用,失败不拉黑。
|
||||
3. **爬图**:Playwright 打开 Pinterest 搜索页截图采集(共享 `.chrome_session` 登录态,并发强制=1)。
|
||||
每个关键词维护**跨运行持久化已采集 URL 集合**(`save_dir/.collected_urls.json`):滚动采集时跳过
|
||||
历史 URL 旧图(不计入 count),继续下拉直至凑满新图或滚动到底(连续 10 轮无新图停止)——同一关键词
|
||||
重复搜索也能采到新图,而非永远返回顶部旧图。
|
||||
4. **图池 + MD5 去重**:图片注册 `image_pool.json`;分析过的 md5 一律拉黑(`used_images.json`);
|
||||
设计稿生成后全局 MD5 去重(`.cache/global_design_md5.json`),跨国家生效。
|
||||
5. **多模态分析**:大图先压缩(max 1024px / 1.5MB)再送 LLM,产出原创设计简报(motif/风格/配色/构图 +
|
||||
@@ -166,6 +180,11 @@ pod_trend_agent/
|
||||
生成 设计稿 → 三合一 → OSS 上传 → 种草图,边分析边生成,不等全部分析完。
|
||||
每完成一个产品立即追加落盘到 `output/<country>/<ts>/products_pending.jsonl`(中断/崩溃也不丢已
|
||||
完成产品),全部完成后统一合并写模板。
|
||||
7. **空选品守卫**:任务清单(`self._tasks`)为空时直接弹窗拦截并提示「请先添加选品(款号 → 颜色 →
|
||||
+添加选品)」;`run_pinterest_pipeline` 也有空选品守卫,即使绕过 UI 直接调用也会拒绝启动。
|
||||
8. **连续空分析保护**:图片分析连续多轮无新增简报(分析失败 / 图片均不适合印花)时,达到
|
||||
`pinterest.max_empty_analyze` 上限(0=自动:目标 SPU 数+2,至少 3)即终止分析直接收尾,
|
||||
避免「逐一取下一张参考图」式无限空转。
|
||||
|
||||
## 多模态分析提示词(可配置)
|
||||
|
||||
@@ -182,7 +201,8 @@ Pinterest 参考模式与自定义图片模式的多模态分析提示词已**
|
||||
3. 内置默认常量(兜底,向前兼容)。
|
||||
|
||||
直接编辑这两份文件即可自定义分析与生图引导规则;`pinterest_analyze_system.md` 里可调整
|
||||
`image_prompt` 二段式结构 / `negative_prompt` / `suitable_for_print` 判定标准等约束。
|
||||
`image_prompt` 二段式结构 / `suitable_for_print` 判定标准等约束(多模态分析不再产出
|
||||
`negative_prompt`,生图负向约束由固定 `print_suffix` 承担)。
|
||||
|
||||
## 生成可靠性 / 错误处理
|
||||
|
||||
@@ -192,6 +212,10 @@ Pinterest 参考模式与自定义图片模式的多模态分析提示词已**
|
||||
- **图像 API 重试退避**(`graph/backends/openai_image_backend.py`):429 尊重网关 `Retry-After`
|
||||
头,否则指数退避;5xx(500/502/503/504 超时)与网关空响应(JSON 解析失败)均退避 3/6/9s 重试、
|
||||
最多 3 次,避免空响应/超时风暴触发限流。
|
||||
- **生图进度日志**:每次生图调用提交前打印 `[img] 开始图生图/文生图(模型,尺寸,参考图 N 张)→ 文件名`,
|
||||
保存后打印 `[img] 已生成(耗时 Xs)`——同步成功不再静默,UI 日志区能实时看到生图进度,避免"看起来卡死"。
|
||||
- **异步任务轮询超时**:`_wait_task` 轮询超时 60s → 300s(与提交请求 timeout 一致)。网关异步任务实际
|
||||
需 30s~6 分钟(设计稿/三图合成),60s 轮询超时会把仍在处理中的任务误判为失败而重复提交,白白消耗配额和时间。
|
||||
- **yunfei / 标准 OpenAI 网关适配**:`compose.execution_mode` 与 `background` 参数默认不再传入——
|
||||
yunfei 等网关不认识它们会返回空 body;`base_url` 需带 `/v1` 前缀(如
|
||||
`https://img.yunfei.best/v1`),否则请求错误路径得到空响应。
|
||||
@@ -200,6 +224,8 @@ Pinterest 参考模式与自定义图片模式的多模态分析提示词已**
|
||||
两种模式统一走该映射:在「有图的文件夹」间按**任务序号**独立随机抽图,抽到模特图用模特三图提示词
|
||||
(图1模特+图2印花+图3底图),抽到平铺图用平铺三图提示词(图1平铺实拍+图2印花+图3底图)。
|
||||
同一 SPU 的多款不再共用同一张图;某类目录无图则只用另一类。每张种草图随机取不同模特特征。
|
||||
**合成提示词可配置覆盖**:`mark_dirs` 下配置 `flat_prompt` / `model_prompt` 时优先生效
|
||||
(`product_node._active_prompt`),留空才回退内置 `FLAT_LAY_PROMPT` / `MODEL_WEAR_PROMPT`。
|
||||
|
||||
## 模特性别分组
|
||||
|
||||
@@ -234,7 +260,19 @@ Pinterest 参考模式与自定义图片模式的多模态分析提示词已**
|
||||
- **申报价格**:模糊匹配所有含「申报价格」的列,统一按加价后价格填写(`price × (1+markup_percent%)`);
|
||||
- **款式来源**:SPU 行「款式来源」统一填「现货款」;
|
||||
- **商品产地**:所有国家统一填「中国大陆」;新增「产地省份」精确匹配列,统一填「广东省」(不再读站点/做字典映射);
|
||||
- **SKU 分类 / SKU 数量 / SKU 数量单位**:按「建议售价」同一套路检测——关键词模糊匹配定位列,读取列头下一行备注判断是否必填(含「非必填」才跳过),检测到且为必填时统一填固定值:`SKU分类=单品`、`SKU数量=1`、`SKU数量单位=件`;
|
||||
- **SKU 分类 / SKU 数量 / SKU 数量单位**:模板检测到这些列即统一填固定值(不再检测「非必填」备注):
|
||||
`SKU分类=单品`、`SKU数量=1`、`SKU数量单位=件`;
|
||||
- **建议售价 / 建议售价单位**:模板存在对应列且 `suggested_price_ratio > 0` 时统一必填——
|
||||
建议售价 = 申报价格 ×(1+比例%),单位统一填 `CNY`(不再检测模板备注);
|
||||
- **SPU 商品属性列名兼容**:`resolve_col` 支持「SPU商品属性-袖型」前缀剥离匹配——列名带前缀的模板
|
||||
(如沙特女装模板)精确匹配,列名不带前缀的模板(如黑白CasualNest Shop)自动剥离前缀后匹配;
|
||||
- **尺码下拉框动态引用**:`_read_size_options` 识别 `INDIRECT(...)` 动态引用公式,能解析则按下拉选项
|
||||
过滤 SKU 行(尺码不在下拉内跳过),无法解析(空单元格/跨表)时返回 None 不启用过滤,避免误杀全部 SKU 行;
|
||||
- **SPU 商品属性字段映射**:`placket_type→门襟类型`、`sleeve_type→袖型`、`sleeve_length_type→袖长`、
|
||||
`breast_pad→胸垫`、`layout→版型`、`silhouette→廓形`、`length_type→长度`、`belt→腰带`、
|
||||
`occasion→场合`、`scene→场景`、`hemline_shape→下摆形状`,各字段独立不覆盖;
|
||||
- **季节映射(女装)**:`spu.season` 的「四季」→「ALL/全球/所有」(`config.yaml` 的 `season_map.female` 可配置);
|
||||
- **印花图案映射(女装)**:`spu.pattern` 为「印花」时 →「卡通」(`pattern_map` 可配置);
|
||||
- **详情图文**:由全部主图 + 种草图组成(不再拼接 img_url_2);
|
||||
- 规格类型2 = `{size}*{color}`;币种=CNY;发货仓1~N 取模板顶头按「、」分隔,库存均 200;
|
||||
- 模板文件被占用(打开中)时自动换名 `<SKU>_已填写_N.xlsx`,不中断导出;
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.4 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 MiB |
+178
-1
@@ -14,6 +14,7 @@ countries:
|
||||
- ES
|
||||
- IT
|
||||
- CA
|
||||
- KR
|
||||
|
||||
# —— 可插拔数据源 ——
|
||||
# 在 graph/sources/ 注册表里登记;这里列出要启用的。
|
||||
@@ -48,6 +49,7 @@ pinterest:
|
||||
search_term_suffix: " t-shirt design" # Pinterest 搜索词自动追加的自定义后缀(可编辑;留空=不追加),保证 Pinterest 返回真正的印花图
|
||||
search_terms_per_run: 1 # 每次搜索词数量(direct 模式=从种子池随机取 N 个直接拼后缀;llm 模式=每次生成 1 个)
|
||||
max_search_rounds: 0 # 搜索轮次上限(0=自动:目标 SPU 数×2,至少 5;防网络故障无限循环)
|
||||
max_empty_analyze: 0 # 连续图片分析无新增简报的轮次上限(0=自动:目标SPU数+2,至少3;防"逐一取下一张参考图"空转)
|
||||
seed_sample: 40 # 每次从国家种子池随机抽取多少个种子词给 LLM
|
||||
max_used_terms_in_prompt: 100 # 已用搜索词最多注入 LLM 提示词的个数(防 token 超限)
|
||||
images_per_term: 40 # 每个搜索词爬取图片数量
|
||||
@@ -63,6 +65,58 @@ pinterest:
|
||||
proxy: "" # 图片下载代理(空=自动探测系统代理/VPN,默认走代理;配了如 http://127.0.0.1:7890 则用指定代理)
|
||||
login_check: true # 爬取前静态检测 Pinterest 登录态(只读 .chrome_session cookies,不启动 Chrome;未登录则跳过本轮爬取并告警)
|
||||
login_wait: true # 运行时检测到未登录时:false=跳过并告警(不阻塞);true=弹出 Chrome 等待手动登录
|
||||
# —— Pinterest 模式生图提示词的固定段(可编辑;留空=回退代码内置默认)——
|
||||
# 拼装顺序:image_prompt + print_suffix + spelling_rule(仅含文字时)
|
||||
# 凡 review 简报额外追加 review_rebrand_hint。
|
||||
prompt_pieces:
|
||||
print_suffix: >-
|
||||
standalone pure print design on a pure white background, the print artwork is SMALL and
|
||||
CENTERED with clearly larger white margins around it, print area between about 15x18 cm and
|
||||
26x32 cm, do NOT fill the entire canvas, do NOT force full-bleed, do NOT add any gradient,
|
||||
texture or background color behind the artwork, no garment, no shirt, no model, no mannequin,
|
||||
no watermark
|
||||
spelling_rule: >-
|
||||
Render every phrase shown in quotes exactly as written, correctly spelled.
|
||||
review_rebrand_hint: >-
|
||||
IMPORTANT: this theme is ONLY a loose stylistic reference. Do NOT reproduce any brand logo,
|
||||
trademark, character, mascot, copyrighted artwork or real person. Create a fully ORIGINAL
|
||||
design with a different name and distinct visual details and colors — a generic, non-infringing
|
||||
homage in the same mood, clearly distinct from the original.
|
||||
|
||||
# 自定义模式(pinterest.mode=custom)专属配置:多模态提示词与生图固定段独立于 Pinterest 参考模式。
|
||||
custom:
|
||||
# 自定义模式生图提示词的固定段(可编辑;留空=回退代码内置默认)。
|
||||
# 自定义模式生图正向提示词 = image_prompt_template({image_prompt} 替换为分析模型产出的新设计描述);
|
||||
# 负向 = negative_prompt(compose 生图时作为负向参数传给图像后端)。
|
||||
# 凡 review 简报额外追加 review_rebrand_hint。
|
||||
prompt_pieces:
|
||||
image_prompt_template: >-
|
||||
Use the attached bestseller product photo only as loose inspiration for
|
||||
overall mood, theme, era and style genre — do NOT reproduce, trace,
|
||||
rearrange, recolor or closely imitate its printed artwork, characters,
|
||||
layout or text, and do NOT render a shirt, garment, model, hanger, photo
|
||||
scene, product mockup or background of any kind. First, carefully examine
|
||||
the printed artwork on the garment in the attached photo: zoom in mentally
|
||||
on the print area, identify its subject, technique, palette and layout,
|
||||
and base the new design on THOSE observed traits. Ignore the model,
|
||||
background and photo quality. Then: {image_prompt}
|
||||
negative_prompt: >-
|
||||
copy of reference artwork, lookalike of the bestseller print, characters,
|
||||
mascots, likenesses, logos, trademarks, watermark, photorealistic shirt,
|
||||
apparel, product mockup, model, garment, hanger, busy background
|
||||
print_suffix: >-
|
||||
standalone pure print design on a pure white background, the print artwork is SMALL and
|
||||
CENTERED with clearly larger white margins around it, print area between about 15x18 cm and
|
||||
26x32 cm, do NOT fill the entire canvas, do NOT force full-bleed, do NOT add any gradient,
|
||||
texture or background color behind the artwork, no garment, no shirt, no model, no mannequin,
|
||||
no watermark
|
||||
spelling_rule: >-
|
||||
Render every phrase shown in quotes exactly as written, correctly spelled.
|
||||
review_rebrand_hint: >-
|
||||
IMPORTANT: this theme is ONLY a loose stylistic reference. Do NOT reproduce any brand logo,
|
||||
trademark, character, mascot, copyrighted artwork or real person. Create a fully ORIGINAL
|
||||
design with a different name and distinct visual details and colors — a generic, non-infringing
|
||||
homage in the same mood, clearly distinct from the original.
|
||||
|
||||
# 跨源融合权重(按 source 标签,无需和为 1)
|
||||
# 已下调 gt_trending(泛国家热点只作微弱信号),主力偏向 style+related(可印花型词)。
|
||||
@@ -72,6 +126,65 @@ weights:
|
||||
gt_related: 0.30
|
||||
pinterest: 0.0
|
||||
|
||||
# —— 成分映射表(可配置,仅作用于 component_1/2/3,绝不作用于 material)——
|
||||
# 女装模板下拉框是「中文+英文」格式,db 存中文,需映射到下拉选项;找不到映射保留原值。
|
||||
# 男装模板保留 db 原值(不查此表,不在此配置)。key=db 成分值,value=模板下拉框精确选项(一个字都不能错)。
|
||||
component_map:
|
||||
female:
|
||||
棉: 棉Cotton
|
||||
聚酯纤维: 聚酯纤维(涤纶)Polyester
|
||||
涤纶: 聚酯纤维(涤纶)Polyester
|
||||
再生聚酯纤维: 聚酯纤维(涤纶)Polyester
|
||||
聚酯纤维(涤纶): 聚酯纤维(涤纶)Polyester
|
||||
氨纶: 氨纶Elastane
|
||||
锦纶: 锦纶(尼龙)Polyamide
|
||||
尼龙: 尼龙Nylon
|
||||
腈纶: 腈纶Acrylic
|
||||
蚕丝: 蚕丝Silk
|
||||
亚麻: 亚麻Linen
|
||||
莫代尔: 莫代尔Modal
|
||||
粘纤: 粘胶(人棉)Viscose
|
||||
粘胶: 粘胶(人棉)Viscose
|
||||
粘胶纤维: 粘胶(人棉)Viscose
|
||||
人棉: 人棉Rayon
|
||||
碳纤维: 碳纤维Carbon
|
||||
金属: 金属Metal
|
||||
羊毛: 羊毛Wool
|
||||
羊绒: 羊绒Cashmere
|
||||
马海毛: 马海毛Mohair
|
||||
兔毛: 兔毛Rabbit Hair
|
||||
牛皮革: 牛皮革Bovine Leather
|
||||
羊皮革: 羊皮革Sheep Leather
|
||||
猪皮革: 猪皮革Pig Leather
|
||||
PU: PU Polyurethane
|
||||
PVC: PVC Polyvinyl Chloride
|
||||
铜氨纤维: 铜氨纤维Cupro
|
||||
莱赛尔: 莱赛尔(天丝)Lyocell
|
||||
天丝: 莱赛尔(天丝)Lyocell
|
||||
醋酸纤维: 醋酸纤维Acetate
|
||||
醋酯纤维: 醋酸纤维Acetate
|
||||
羽绒: 羽绒Down
|
||||
羽毛: 羽毛Feather
|
||||
羊驼毛: 羊驼毛Alpaca
|
||||
苎麻: 苎麻
|
||||
竹纤维: 竹纤维
|
||||
三醋酯纤维: 三醋酯纤维Triacetate
|
||||
金属镀膜纤维(金银丝): 金属镀膜纤维(金银丝)
|
||||
聚丙烯纤维: 聚丙烯纤维
|
||||
其他纤维: 其他纤维
|
||||
|
||||
# 季节值映射表(女装模板专用):key=db 季节值,value=模板下拉框精确选项。
|
||||
# 男装模板保留 db 原值(不查此表,不在此配置)。缺失/留空回退内置默认(四季→ALL/全球/所有)。
|
||||
season_map:
|
||||
female:
|
||||
四季: ALL/全球/所有
|
||||
|
||||
# 印花图案值映射表(女装模板专用):key=db pattern 值,value=模板下拉框精确选项。
|
||||
# 男装模板保留 db 原值(不查此表,不在此配置)。缺失/留空回退内置默认(印花→卡通)。
|
||||
pattern_map:
|
||||
female:
|
||||
印花: 卡通
|
||||
|
||||
# 合规黑名单(全局,生效于所有国家;各国专属侵权盲区写在 prompts/<country>/aesthetics.yaml 的 extra_blacklist)
|
||||
blacklist:
|
||||
- disney
|
||||
@@ -163,6 +276,8 @@ RULES:/n1.底色锁定:从图3提取衣服底色与面料,最终合成中必须1
|
||||
image_prompt: "{motif}, {art_style}, {color_palette}, {composition}, standalone pure print design, print-ready artwork, isolated on pure white background, no background, no scene, no texture, no frame, no border, flat vector-like graphic, crisp clean edges, high resolution, ultra sharp, high contrast, IT-market aesthetic: renaissance elegance, roman heritage, tuscan countryside warmth, la dolce vita retro charm, size: the print artwork must be SMALL and CENTERED with clearly larger white margins around it, print area between about 15x18 cm and 26x32 cm, keep proportions, scale naturally to the content, do NOT stretch, do NOT fill the entire canvas, do NOT force full-bleed, leave wide balanced white margins around the artwork, no garment, no shirt, no model, no mannequin, no watermark, text: optional - add short original English words or an Italian slogan ONLY if they fit the print, or keep it text-free; any text must be safe, short and original; no brand names, no logos, no trademarked phrases, no real people names"
|
||||
CA:
|
||||
image_prompt: "{motif}, {art_style}, {color_palette}, {composition}, standalone pure print design, print-ready artwork, isolated on pure white background, no background, no scene, no texture, no frame, no border, flat vector-like graphic, crisp clean edges, high resolution, ultra sharp, high contrast, CA-market aesthetic: maple-leaf pride, northern-lights wonder, rocky-mountain outdoors, cozy cottage and hockey spirit, size: the print artwork must be SMALL and CENTERED with clearly larger white margins around it, print area between about 15x18 cm and 26x32 cm, keep proportions, scale naturally to the content, do NOT stretch, do NOT fill the entire canvas, do NOT force full-bleed, leave wide balanced white margins around the artwork, no garment, no shirt, no model, no mannequin, no watermark, text: optional - add short original English words or a French slogan ONLY if they fit the print, or keep it text-free; any text must be safe, short and original; no brand names, no logos, no trademarked phrases, no real people names"
|
||||
KR:
|
||||
image_prompt: "{motif}, {art_style}, {color_palette}, {composition}, standalone pure print design, print-ready artwork, isolated on pure white background, no background, no scene, no texture, no frame, no border, flat vector-like graphic, crisp clean edges, high resolution, ultra sharp, high contrast, KR-market aesthetic: trendy K-pop street culture, Seoul neon nightlife, Y2K retro-futurism, cute-hip aesthetic, bold typography with hangul accents, size: the print artwork must be SMALL and CENTERED with clearly larger white margins around it, print area between about 15x18 cm and 26x32 cm, keep proportions, scale naturally to the content, do NOT stretch, do NOT fill the entire canvas, do NOT force full-bleed, leave wide balanced white margins around the artwork, no garment, no shirt, no model, no mannequin, no watermark, text: optional - add short original English words or a Korean slogan ONLY if they fit the print, or keep it text-free; any text must be safe, short and original; no brand names, no logos, no trademarked phrases, no real people names"
|
||||
|
||||
# —— 第三阶段 compose:生成纯印花设计稿 + 导出简报包(在 product 之前)——
|
||||
# 用前 N 个 safe 简报的 image_prompt 调图像后端文生图,产物 output/<country>/designs/,
|
||||
@@ -222,7 +337,69 @@ product:
|
||||
model_dir: "模特图" # 模特图文件夹名(material_library 下)
|
||||
flat_dir: "平铺图" # 平铺图文件夹名(material_library 下)
|
||||
model_prompt: "" # 留空=内置模特三图提示词 MODEL_WEAR_PROMPT
|
||||
flat_prompt: "" # 留空=内置平铺三图提示词 FLAT_LAY_PROMPT
|
||||
flat_prompt: |-
|
||||
|
||||
**你是一个专业的电商AI视觉合成工具**,核心任务是执行"高保真印花与色彩移植/印花替换"。
|
||||
|
||||
## 1. 图片角色定义
|
||||
* **图1 (基底图):** 衣服平铺实拍图。
|
||||
* **功能:** 仅提供版型、轮廓、褶皱形态、光影结构、拍摄角度与构图。
|
||||
* **限制:** 输出必须保留图1的摆放角度、背景和光影逻辑,但**彻底摒弃**其原有的面料颜色。
|
||||
* **图2 (设计稿):** 纯印花设计稿。
|
||||
* **功能:** 仅提供“图案元素”(线条、色号、比例)。
|
||||
* **限制:** 提取图案时必须**完全去除**图2自带的背景色。
|
||||
* **图3 (底图):** 平铺衣服底图。
|
||||
* **功能:** 仅作为“皮肤”,提供衣服的**唯一基底颜色**与面料材质纹理。
|
||||
* **限制:** 忽略其背景/场景,100%保留其衣服底色与质感。
|
||||
|
||||
## 2. 核心任务
|
||||
构建一张最终合成的平铺图,必须同时满足:
|
||||
1. **结构:** 保留图1的版型与褶皱细节。
|
||||
2. **底色:** 强制应用图3的颜色与材质。
|
||||
3. **图案:** 叠加图2的印花设计。
|
||||
|
||||
**最终效果 = 图1版型光影 + 图3底色材质 + 图2印花图案**
|
||||
|
||||
## 3. 执行规则 (严格执行,权重由高到低)
|
||||
|
||||
### 0. 禁止人物
|
||||
* 严禁出现任何人体、模特、头颈、手臂或穿着效果。
|
||||
* 必须保持纯平铺俯拍商品图形式。
|
||||
|
||||
### 1. 底色强制锁定 (Color Lock - 最高优先级)
|
||||
* **基底替换:** 必须强制使用**图3的颜色**作为衣服的**唯一**基底色。
|
||||
* **100%覆盖:** 彻底清除图1原有的面料颜色,严禁图1旧底色透出、混合或泛灰。
|
||||
* **色调一致性:** 最终成衣的固有色必须与图3肉眼完全一致,不得因光影合成而发生色相偏移。
|
||||
|
||||
### 2. 纯印花剥离与叠加
|
||||
* **去底处理:** 从图2中**仅提取**设计元素、线条、色块,**完全丢弃/移除**图2自身可能存在的任何背景色或画布底色。
|
||||
* **叠加逻辑:** 将提取的纯图案,以“纹理融合”的方式叠加在图3的底色之上。印花必须依附于图3的底色,不可遮盖或改变图3的底色范围。
|
||||
|
||||
### 3. 印花尺寸适配
|
||||
* 将提取的印花居中印在胸/背/衣身主体区域。
|
||||
* 印花面积占比严格控制在衣身主体的30%-45%。
|
||||
* 四周必须留白,严禁印花过大撑满衣服,或过小(<20%)。
|
||||
|
||||
### 4. 主体遮罩重建
|
||||
* 精准识别图1的衣服本体完整区域(包含领口到下摆、袖子)。
|
||||
* 用“图3底色+图2印花”合成出的新面料,完全覆盖图1的原有面料区域。
|
||||
* 清除原区域的所有旧色和旧图案,只保留图1的边缘轮廓形态。
|
||||
|
||||
### 5. 精准形态贴合
|
||||
* 合成后的面料必须严格遵循图1的平铺形态。
|
||||
* 领口、袖口、下摆、侧缝等结构必须清晰。
|
||||
* **自然变形:** 印花在遇到褶皱、翻折处时,必须随面料纹理发生自然的拉伸、挤压和变形,杜绝僵硬的“贴纸感”。
|
||||
|
||||
### 6. 光影重塑与色相锁定
|
||||
* **借用光影:** 仅借用图1的光照方向、明暗对比度和投影位置。
|
||||
* **色相锁定:** 在应用明暗变化时,只调整亮度和对比度,**严禁改变色相(Hue)**。
|
||||
* 确保阴影处依然是图3颜色的深色版,高光处是图3颜色的亮色版,保持投影与图1完全一致。
|
||||
|
||||
### 7. 纯净输出
|
||||
* 仅输出一张最终合成的平铺图。
|
||||
* 背景环境、桌面、构图、拍摄角度必须与图1保持100%一致。
|
||||
* 画面中不得出现人像、肢体、人台。
|
||||
#留空=内置平铺三图提示词 FLAT_LAY_PROMPT
|
||||
brief_index: 0 # 用第几个 safe 简报的提示词生成(0=第一个)
|
||||
spu_code: "" # 款号(留空自动选第一个有本地底图的)
|
||||
sku_code: "" # 颜色编码(留空自动选该款第一个有底图的);多个颜色用逗号分隔(如 "DG015-VT01,DG015-DARK HEATHER")
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
# 韩国专属数据源配置(configs/countries/KR.yaml)
|
||||
trending:
|
||||
enabled: true
|
||||
limit: 40
|
||||
style:
|
||||
enabled: true
|
||||
seeds:
|
||||
- kpop
|
||||
- seoul
|
||||
- korean aesthetic
|
||||
- seoul nightlife
|
||||
- seoul neon
|
||||
- y2k
|
||||
- korean street fashion
|
||||
- k-streetwear
|
||||
- korean drama aesthetic
|
||||
- korean cafe
|
||||
- hanbok
|
||||
- hanok
|
||||
- gyeongbokgung
|
||||
- korean traditional pattern
|
||||
- dancheong
|
||||
- korean calligraphy
|
||||
- hangul
|
||||
- korean mask dance
|
||||
- korean drum
|
||||
- korean fan dance
|
||||
- taekwondo
|
||||
- korean tiger
|
||||
- kumiho
|
||||
- korean fox
|
||||
- korean crane
|
||||
- korean magpie
|
||||
- korean zodiac
|
||||
- cherry blossom korea
|
||||
- jinhae cherry blossom
|
||||
- korean autumn leaves
|
||||
- ginkgo
|
||||
- maple korea
|
||||
- korean pine
|
||||
- mugunghwa
|
||||
- korean flower
|
||||
- plum blossom korea
|
||||
- kimchi
|
||||
- bibimbap
|
||||
- tteokbokki
|
||||
- kimbap
|
||||
- bulgogi
|
||||
- samgyeopsal
|
||||
- korean fried chicken
|
||||
- korean street food
|
||||
- bingsu
|
||||
- hotteok
|
||||
- korean dessert
|
||||
- jeju island
|
||||
- hallasan
|
||||
- jeju coast
|
||||
- busan
|
||||
- haeundae
|
||||
- hangang
|
||||
- namsan tower
|
||||
- seoul skyline
|
||||
- korean retro
|
||||
- korean vintage
|
||||
- seoul art
|
||||
- korean minimal
|
||||
- korean wildlife
|
||||
- korean mountain
|
||||
- korean sea
|
||||
- korean fishing village
|
||||
- korean lantern
|
||||
- korean festival
|
||||
related:
|
||||
enabled: true
|
||||
seed_keywords:
|
||||
- korean retro
|
||||
- seoul street art
|
||||
- korean vintage
|
||||
- kpop aesthetic
|
||||
- hanbok pattern
|
||||
- korean traditional
|
||||
- korean cafe art
|
||||
- y2k korea
|
||||
- korean wildlife
|
||||
- korean minimal
|
||||
- seoul art
|
||||
- korean food
|
||||
- korean pattern
|
||||
- korean summer
|
||||
- korean music
|
||||
- jeju nature
|
||||
- korean folk art
|
||||
- seoul night
|
||||
timeframe: today 3-m
|
||||
@@ -0,0 +1,89 @@
|
||||
# Pinterest 参考模式种子词(面向视觉灵感,非热点关键词)
|
||||
# 约束:避开品牌/角色/名人/宗教/国旗/酒精等侵权与敏感项
|
||||
seeds:
|
||||
- 케이팝 일러스트
|
||||
- 서울 네온 야경
|
||||
- 레트로 한국
|
||||
- Y2K 디자인
|
||||
- 한복 패턴
|
||||
- 단청 문양
|
||||
- 한옥 일러스트
|
||||
- 경복궁 그림
|
||||
- 한글 타이포그래피
|
||||
- 한국 전통문양
|
||||
- 매화 그림
|
||||
- 벚꽃 일러스트
|
||||
- 단풍 일러스트
|
||||
- 은행잎 패턴
|
||||
- 호랑이 그림
|
||||
- 구미호 일러스트
|
||||
- 한국 까치
|
||||
- 두루미 그림
|
||||
- 한국 토끼
|
||||
- 강아지 일러스트
|
||||
- 고양이 일러스트
|
||||
- 귀여운 동물
|
||||
- 별자리 일러스트
|
||||
- 달 그림
|
||||
- 별 그림
|
||||
- 고래 일러스트
|
||||
- 돌고래 그림
|
||||
- 물고기 패턴
|
||||
- 나비 일러스트
|
||||
- 잠자리 그림
|
||||
- 무당벌레
|
||||
- 다람쥐 일러스트
|
||||
- 펭귄 그림
|
||||
- 팥빙수 일러스트
|
||||
- 떡볶이 일러스트
|
||||
- 김밥 그림
|
||||
- 비빔밥 일러스트
|
||||
- 불고기 그림
|
||||
- 치킨 일러스트
|
||||
- 라면 그림
|
||||
- 만두 일러스트
|
||||
- 커피 일러스트
|
||||
- 카페 디자인
|
||||
- 과일 일러스트
|
||||
- 딸기 그림
|
||||
- 수박 패턴
|
||||
- 감귤 그림
|
||||
- 복숭아 일러스트
|
||||
- 제주도 풍경
|
||||
- 부산 해운대
|
||||
- 한강 야경
|
||||
- 남산타워 일러스트
|
||||
- 서울 스카이라인
|
||||
- 한국 스트릿 패션
|
||||
- 한국 카페 감성
|
||||
- 레트로 한국 포스터
|
||||
- 한국 미니멀
|
||||
- 한국 자연
|
||||
- 한국 바다
|
||||
- 태권도 일러스트
|
||||
- 한국 탈춤
|
||||
- 사물놀이 일러스트
|
||||
- 한국 전통 악기
|
||||
- 한국 춤
|
||||
- 코스모스 그림
|
||||
- 진달래 일러스트
|
||||
- 개나리 그림
|
||||
- 국화 일러스트
|
||||
- 소나무 그림
|
||||
- 대나무 일러스트
|
||||
- 연꽃 그림
|
||||
- 국화 패턴
|
||||
- 물고기 비늘 패턴
|
||||
- 소라 그림
|
||||
- 조개 일러스트
|
||||
- # —— 节日主题(适合印花,避开宗教人物/国旗/酒精/猪等敏感项)——
|
||||
- 설날 디자인
|
||||
- 추석 일러스트
|
||||
- 보름달 그림
|
||||
- 크리스마스 디자인
|
||||
- 할로윈 일러스트
|
||||
- 발렌타인 디자인
|
||||
- 어린이날 일러스트
|
||||
- 스승의날 그림
|
||||
- 한복 입은 캐릭터
|
||||
- 전통놀이 일러스트
|
||||
@@ -1,7 +1,10 @@
|
||||
# 种草图提示词模板库 —— 跨境电商上衣专用版(服装主体构图+印花中心+零遮挡强约束+得体姿态+全亮调场景版)
|
||||
# 种草图提示词模板库 —— 跨境电商上衣专用版(服装主体构图+印花中心+零遮挡强约束+得体姿态+全亮调场景+结构部件保色+必穿下装版)
|
||||
# 占位符:[商品名称]、[材质]、[模特特征]、[服装风格]
|
||||
# 核心逻辑:画面主体永远是衣服。取景自头顶留白至下摆以下,整件衣服100%完整入画,
|
||||
# 头部占比≤1/4且五官弱化,视觉中心恒定为胸前印花。
|
||||
# 下装规则:模特必须真实穿着下装(长裤/牛仔裤等),下装仅是不入画,绝不等于不穿;画面下沿严禁出现裸腿或内裤。
|
||||
# 结构保色规则:全部模板统一内置一句通用约束(仅负面禁止,无商品类型条件判断)——
|
||||
# 抽绳/帽子/罗纹等结构部件禁止被改色、禁止被画上印花颜色,短袖无此部件自动不生效,卫衣自动锁色。
|
||||
# 摄影参数说明:50mm为主力镜头控制自然透视,f/1.4-f/2.8控制景深虚化,8k强化面料细节,3:4符合电商标准长图比例。
|
||||
|
||||
seed_shot_templates:
|
||||
@@ -10,167 +13,167 @@ seed_shot_templates:
|
||||
# ==========================================
|
||||
- name: "纯白背景正面服装主体展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部位于画面最上沿且占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔自然,肩部放松下沉,双手自然垂放在身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白无缝背景纸前,身体正对镜头微侧15度,整体呈现[服装风格]的调性,完整展示衣服正面的印花图案与[材质]面料的垂坠感。采用电商标准的高亮柔光,左右各一盏柔光箱消除杂乱阴影,光线均匀分布。画面比例为3:4。商业白底图摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部位于画面最上沿且占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔自然,肩部放松下沉,双手自然垂放在身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白无缝背景纸前,身体正对镜头微侧15度,整体呈现[服装风格]的调性,完整展示衣服正面的印花图案与[材质]面料的垂坠感。采用电商标准的高亮柔光,左右各一盏柔光箱消除杂乱阴影,光线均匀分布。画面比例为3:4。商业白底图摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "高级浅灰背景服装主体展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔自然,肩部放松,双手自然垂放或单手插兜姿态收尾于身体两侧,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在高级浅灰背景纸前,身体正对镜头,姿态略微随性,整体呈现[服装风格]的调性,完整展示衣服正面印花与[材质]的挺括度。采用影棚标准柔光与边缘光结合。画面比例为3:4。商业白底摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔自然,肩部放松,双手自然垂放或单手插兜姿态收尾于身体两侧,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在高级浅灰背景纸前,身体正对镜头,姿态略微随性,整体呈现[服装风格]的调性,完整展示衣服正面印花与[材质]的挺括度。采用影棚标准柔光与边缘光结合。画面比例为3:4。商业白底摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "纯白背景下摆与版型展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,重点同时覆盖胸前印花与下摆缝线,二者均须完整清晰;头部占比不超过画面高度的四分之一,五官弱化不做强调,禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,双手背于身后或自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,身体正对镜头,整体呈现[服装风格]的调性,画面聚焦展示衣服正面印花图案与下摆的缝线工艺及宽松版型。采用影棚高显色柔光箱,突出印花色彩与[材质]的紧密编织纹理。画面比例为3:4。电商白底图摄影,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,重点同时覆盖胸前印花与下摆缝线,二者均须完整清晰;头部占比不超过画面高度的四分之一,五官弱化不做强调,禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,双手背于身后或自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,身体正对镜头,整体呈现[服装风格]的调性,画面聚焦展示衣服正面印花图案与下摆的缝线工艺及宽松版型。采用影棚高显色柔光箱,突出印花色彩与[材质]的紧密编织纹理。画面比例为3:4。电商白底图摄影,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "低饱和克莱因蓝背景服装主体棚拍"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔有张力,肩线平直,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在低饱和克莱因蓝的无缝背景纸前,身体正对镜头,整体呈现[服装风格]的调性,突出衣服正面印花图案的视觉冲击力与剪裁,展示[材质]的独特纹理。光线采用双灯硬光与柔光箱结合,形成干净分明的明暗对比。画面比例为3:4。极简主义商业摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔有张力,肩线平直,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在低饱和克莱因蓝的无缝背景纸前,身体正对镜头,整体呈现[服装风格]的调性,突出衣服正面印花图案的视觉冲击力与剪裁,展示[材质]的独特纹理。光线采用双灯硬光与柔光箱结合,形成干净分明的明暗对比。画面比例为3:4。极简主义商业摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "纯白背景微转体动态展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身向一侧微转约30度后回望镜头方向,肩部放松,双手自然垂放于身体两侧,转动幅度不得使印花侧转到画面边缘之外,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白无缝背景纸前,呈现轻微转体的微动态,展示衣服正面印花在转动下的视觉效果与[材质]面料的动态垂坠感。采用影棚高亮柔光,光比干净分明。画面比例为3:4。电商白底图摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身向一侧微转约30度后回望镜头方向,肩部放松,双手自然垂放于身体两侧,转动幅度不得使印花侧转到画面边缘之外,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白无缝背景纸前,呈现轻微转体的微动态,展示衣服正面印花在转动下的视觉效果与[材质]面料的动态垂坠感。采用影棚高亮柔光,光比干净分明。画面比例为3:4。电商白底图摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
# ==========================================
|
||||
# 二、 面料与印花特写区(打消购买顾虑)
|
||||
# ==========================================
|
||||
- name: "纯白背景领口细节特写"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装细节构图:镜头聚焦领口与上胸区域,取景范围为鼻底以下至腰部以上,画面主体是这件[商品名称]的领口罗纹、缝线工艺、肩部做工与上胸区域的印花上缘;模特面部仅保留唇部以下的局部作比例陪衬,禁止以五官为画面焦点,禁止把镜头对准脸部,禁止裁切所要展示的衣服细节部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特肩部放松下沉,双手不在画面内,绝对不可遮挡衣服任何部位。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,画面聚焦展示衣服的领口工艺细节与[材质]面料的紧密编织纹理。采用影棚标准高显色柔光箱,光线均匀且突出材质的高密度纹理与亲肤特性。画面比例为3:4。电商白底图摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装细节构图:镜头聚焦领口与上胸区域,取景范围为鼻底以下至腰部以上,画面主体是这件[商品名称]的领口罗纹、缝线工艺、肩部做工与上胸区域的印花上缘;模特面部仅保留唇部以下的局部作比例陪衬,禁止以五官为画面焦点,禁止把镜头对准脸部,禁止裁切所要展示的衣服细节部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特肩部放松下沉,双手不在画面内,绝对不可遮挡衣服任何部位。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,画面聚焦展示衣服的领口工艺细节与[材质]面料的紧密编织纹理。采用影棚标准高显色柔光箱,光线均匀且突出材质的高密度纹理与亲肤特性。画面比例为3:4。电商白底图摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "明亮室内逆光面料透气质感展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是被逆光照透的面料与胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特在阳光明媚的玻璃幕墙大堂内逆光站立,发丝被自然光照亮,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服在明亮逆光下展现出的[材质]面料透光性与柔软质感。光线为正午明亮的自然逆光,在衣服边缘形成柔和轮廓光。画面比例为3:4。清透氧气感摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是被逆光照透的面料与胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特在阳光明媚的玻璃幕墙大堂内逆光站立,发丝被自然光照亮,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服在明亮逆光下展现出的[材质]面料透光性与柔软质感。光线为正午明亮的自然逆光,在衣服边缘形成柔和轮廓光。画面比例为3:4。清透氧气感摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "双手拉扯领口弹性展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装细节构图:镜头聚焦领口与上胸区域,取景范围为鼻底以下至腰部以上,画面主体是双手轻拉领口的拉伸状态、领口罗纹回弹纹理与上胸区域的印花上缘;模特面部仅保留唇部以下的局部作比例陪衬,禁止以五官为画面焦点,禁止把镜头对准脸部,禁止裁切所要展示的衣服细节部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸。【动作硬约束】模特双手捏住领口左右两侧边缘向外轻拉展示弹力,手部仅接触领口边缘线,绝对不可移向胸口中央遮挡印花。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯色背景前,凸显[材质]面料的回弹性与结实度。采用高亮柔光,突出面料拉伸时的纹理张力。画面比例为3:4。商业电商摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装细节构图:镜头聚焦领口与上胸区域,取景范围为鼻底以下至腰部以上,画面主体是双手轻拉领口的拉伸状态、领口罗纹回弹纹理与上胸区域的印花上缘;模特面部仅保留唇部以下的局部作比例陪衬,禁止以五官为画面焦点,禁止把镜头对准脸部,禁止裁切所要展示的衣服细节部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特双手捏住领口左右两侧边缘向外轻拉展示弹力,手部仅接触领口边缘线,绝对不可移向胸口中央遮挡印花。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯色背景前,凸显[材质]面料的回弹性与结实度。采用高亮柔光,突出面料拉伸时的纹理张力。画面比例为3:4。商业电商摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "低头凝视正面印花特写"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;模特微微低头使视线落在胸前印花上,头部随低头角度自然变小并略带透视缩短,成为氛围陪衬,画面的绝对视觉中心依然是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特微微低头注视胸前印花,头发不得垂落遮盖肩部与印花区域,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡衣服。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,整体呈现[服装风格]的调性,画面聚焦展示正面印花的色彩细节与[材质]面料的质感。采用影棚顶部柔光与正面补光,突出印花图案的清晰度。画面比例为3:4。电商白底图摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;模特微微低头使视线落在胸前印花上,头部随低头角度自然变小并略带透视缩短,成为氛围陪衬,画面的绝对视觉中心依然是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特微微低头注视胸前印花,头发不得垂落遮盖肩部与印花区域,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡衣服。【稳定性约束】背景必须保持干净简洁,不可产生与服装颜色冲突的杂色。模特站在纯白背景纸前,整体呈现[服装风格]的调性,画面聚焦展示正面印花的色彩细节与[材质]面料的质感。采用影棚顶部柔光与正面补光,突出印花图案的清晰度。画面比例为3:4。电商白底图摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
# ==========================================
|
||||
# 三、 居家生活场景区(营造松弛感与舒适度)
|
||||
# ==========================================
|
||||
- name: "居家沙发服装主体坐姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特端坐于沙发上,上半身自然挺直微侧,双手自然搭在大腿或沙发扶手上远离胸口,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特得体地坐在明亮现代极简风格的客厅布艺沙发上,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的舒适度。室内采用柔和的高调漫反射自然光,背景为高度虚化的明亮居家环境。画面比例为3:4。柯达Portra 400胶片质感,色彩柔和明亮,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于沙发上,上半身自然挺直微侧,双手自然搭在大腿或沙发扶手上远离胸口,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特得体地坐在明亮现代极简风格的客厅布艺沙发上,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的舒适度。室内采用柔和的高调漫反射自然光,背景为高度虚化的明亮居家环境。画面比例为3:4。柯达Portra 400胶片质感,色彩柔和明亮,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "居家落地窗自然光服装主体展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在高层公寓明亮的落地窗前,身体正面对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]亲肤舒适属性。采用日间明亮的柔和逆光,画面通透,衣服受光充足色彩还原准确。背景为大虚化的明亮城市楼宇与蓝天。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在高层公寓明亮的落地窗前,身体正面对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]亲肤舒适属性。采用日间明亮的柔和逆光,画面通透,衣服受光充足色彩还原准确。背景为大虚化的明亮城市楼宇与蓝天。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "周末清晨床头服装主体坐姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特端坐于床沿,上半身自然挺直,双手自然搭在大腿上远离胸口,被子或床品绝对不可堆叠遮挡衣服下摆。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特得体地坐在明亮的床边,展现周末清晨的松弛感,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的亲肤无拘束感。室内采用清晨明亮的高调自然光,背景为高度虚化的卧室环境。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于床沿,上半身自然挺直,双手自然搭在大腿上远离胸口,被子或床品绝对不可堆叠遮挡衣服下摆。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特得体地坐在明亮的床边,展现周末清晨的松弛感,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的亲肤无拘束感。室内采用清晨明亮的高调自然光,背景为高度虚化的卧室环境。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "居家厨房服装主体场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止围裙等其他服饰遮挡衣服。【动作硬约束】模特站在中岛台侧面,上半身放松自然,双手轻搭台面边缘远离胸口,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮的现代开放式厨房中岛台旁,身体正对镜头微侧,姿态放松自然,整体呈现[服装风格]的调性,展示衣服正面印花在居家生活中的百搭属性与[材质]面料的舒适耐穿度。室内采用明亮的漫反射自然光与暖色室内灯,背景为高度虚化的厨房台面与绿植。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止围裙等其他服饰遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特站在中岛台侧面,上半身放松自然,双手轻搭台面边缘远离胸口,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮的现代开放式厨房中岛台旁,身体正对镜头微侧,姿态放松自然,整体呈现[服装风格]的调性,展示衣服正面印花在居家生活中的百搭属性与[材质]面料的舒适耐穿度。室内采用明亮的漫反射自然光与暖色室内灯,背景为高度虚化的厨房台面与绿植。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "周末居家阅读服装主体场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止书本遮挡衣服。【动作硬约束】模特坐在明亮飘窗边,书本置于腰腹高度的画面下沿位置,上胸与胸前印花完全不被遮挡,另一只手自然垂放,绝对不可将书举至胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮的窗边阅读,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花图案与[材质]面料的柔软亲肤感。室内采用柔和的窗光侧顺光保证衣服受光均匀,背景为高度虚化的温馨居家环境。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止书本遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特坐在明亮飘窗边,书本置于腰腹高度的画面下沿位置,上胸与胸前印花完全不被遮挡,另一只手自然垂放,绝对不可将书举至胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮的窗边阅读,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花图案与[材质]面料的柔软亲肤感。室内采用柔和的窗光侧顺光保证衣服受光均匀,背景为高度虚化的温馨居家环境。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
# ==========================================
|
||||
# 四、 户外休闲/运动场景区(展现百搭与透气)
|
||||
# ==========================================
|
||||
- name: "阳光草坪服装主体站姿"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止强烈树影大面积压暗衣服。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光充足的城市林荫道上,身体正对镜头微侧,表情放松带浅笑,整体展现[服装风格]的氛围,凸显[材质]在自然光照下的透气与百搭。午后阳光透过树叶洒下明亮光斑,光斑只落在背景上不打在衣服表面,衣服受光均匀色彩准确。背景为高度虚化的都市街景。画面比例为3:4。徕卡Q2摄影质感,高对比度明亮色彩,50mm镜头,f/1.7大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止强烈树影大面积压暗衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光充足的城市林荫道上,身体正对镜头微侧,表情放松带浅笑,整体展现[服装风格]的氛围,凸显[材质]在自然光照下的透气与百搭。午后阳光透过树叶洒下明亮光斑,光斑只落在背景上不打在衣服表面,衣服受光均匀色彩准确。背景为高度虚化的都市街景。画面比例为3:4。徕卡Q2摄影质感,高对比度明亮色彩,50mm镜头,f/1.7大光圈,8k分辨率。
|
||||
|
||||
- name: "都市街头OOTD服装主体展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身微靠墙面,肩部放松,咖啡杯持有手收在腰侧画面最下沿,另一只手自然垂放,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光明媚的现代商业街区外墙前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的抗皱性。采用午后天光与建筑反射光,光线均匀打亮衣服正面,画面明亮通透,背景为高度虚化的都市街景与阳光光斑。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身微靠墙面,肩部放松,咖啡杯持有手收在腰侧画面最下沿,另一只手自然垂放,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光明媚的现代商业街区外墙前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的抗皱性。采用午后天光与建筑反射光,光线均匀打亮衣服正面,画面明亮通透,背景为高度虚化的都市街景与阳光光斑。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "天台蓝天白云服装主体场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在无遮挡的空旷天台上,背景是大面积的蓝天白云,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气感。正午明亮的顺光均匀打在衣服上,无死角的还原服装真实颜色。画面比例为3:4。徕卡Q2摄影质感,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在无遮挡的空旷天台上,背景是大面积的蓝天白云,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气感。正午明亮的顺光均匀打在衣服上,无死角的还原服装真实颜色。画面比例为3:4。徕卡Q2摄影质感,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "自然公园服装主体站姿外景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止衣物被风吹乱遮盖印花。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光充足的公园绿植前,微风轻拂发丝,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气性与轻盈感。光线为明亮的顺光搭配自然反光板补光,衣服受光均匀色彩鲜亮,背景为大面积虚化的鲜绿植被与光斑。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,85mm镜头,f/1.8光圈,清新高调摄影,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止衣物被风吹乱遮盖印花,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光充足的公园绿植前,微风轻拂发丝,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气性与轻盈感。光线为明亮的顺光搭配自然反光板补光,衣服受光均匀色彩鲜亮,背景为大面积虚化的鲜绿植被与光斑。画面比例为3:4。清透氧气感色彩,索尼A7R4画质,85mm镜头,f/1.8光圈,清新高调摄影,8k分辨率。
|
||||
|
||||
- name: "滑板公园服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光明媚的滑板公园旁,身体正对镜头,呈现不经意的随性状态,整体展现[服装风格]的氛围,展示衣服正面印花与[材质]的运动属性。明亮阳光形成轻微侧光并配合反光板给衣服暗部补光,保证印花区域无死黑,背景为高度虚化的彩色滑板场地与涂鸦墙。画面比例为3:4。徕卡Q2摄影质感,50mm镜头,f/1.7光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在阳光明媚的滑板公园旁,身体正对镜头,呈现不经意的随性状态,整体展现[服装风格]的氛围,展示衣服正面印花与[材质]的运动属性。明亮阳光形成轻微侧光并配合反光板给衣服暗部补光,保证印花区域无死黑,背景为高度虚化的彩色滑板场地与涂鸦墙。画面比例为3:4。徕卡Q2摄影质感,50mm镜头,f/1.7光圈,8k分辨率。
|
||||
|
||||
- name: "林荫道骑行服装主体场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特站在复古自行车旁,握车把的手位于画面最下沿腰腹高度,另一只手自然垂放,头微转向镜头方向,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特停在两旁长满梧桐树的林荫小道旁,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气性。明亮阳光透过树叶洒下光斑,光斑只点缀背景避开衣服表面,衣服受光均匀,背景为高度虚化的树干与明亮光斑。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特站在复古自行车旁,握车把的手位于画面最下沿腰腹高度,另一只手自然垂放,头微转向镜头方向,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特停在两旁长满梧桐树的林荫小道旁,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的透气性。明亮阳光透过树叶洒下光斑,光斑只点缀背景避开衣服表面,衣服受光均匀,背景为高度虚化的树干与明亮光斑。画面比例为3:4。日系胶片质感,柯达Portra 400色彩预设,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "海边沙滩服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在细软的沙滩上,海风轻扬发丝,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈与夏日属性。光线为正午强烈的顺光,衣服过曝得到良好控制,色彩鲜明通透,背景为高度虚化的蔚蓝海水与远处海平线。画面比例为3:4。索尼A7R4画质,50mm镜头,f/2.0光圈,高饱和度清透色彩,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的休闲短裤或长裤并搭配鞋子,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在细软的沙滩上,海风轻扬发丝,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈与夏日属性。光线为正午强烈的顺光,衣服过曝得到良好控制,色彩鲜明通透,背景为高度虚化的蔚蓝海水与远处海平线。画面比例为3:4。索尼A7R4画质,50mm镜头,f/2.0光圈,高饱和度清透色彩,8k分辨率。
|
||||
|
||||
- name: "露营帐篷服装主体坐姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特端坐于露营椅上,上半身自然挺直,搪瓷杯收在腰腹高度的画面下沿,另一只手自然垂放,绝对不可举杯遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在森林空地的露营椅上,旁边有搭好的白色金字塔帐篷,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的户外属性。采用正午明亮的漫射自然光,衣服受光均匀色彩还原准确,背景为高度虚化的茂密松林与光斑。画面比例为3:4。复古胶片质感,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于露营椅上,上半身自然挺直,搪瓷杯收在腰腹高度的画面下沿,另一只手自然垂放,绝对不可举杯遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在森林空地的露营椅上,旁边有搭好的白色金字塔帐篷,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的户外属性。采用正午明亮的漫射自然光,衣服受光均匀色彩还原准确,背景为高度虚化的茂密松林与光斑。画面比例为3:4。复古胶片质感,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "海边浅滩服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止海水打湿变色衣服。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在海边浅滩旁,笑容明朗,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈感。光线为下午的明亮阳光,海面反光形成天然柔和补光打亮衣服正面,背景为高度虚化的蔚蓝大海与天空。画面比例为3:4。夏日清透色彩,高饱和度,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的休闲短裤或长裤并搭配鞋子,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止海水打湿变色衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在海边浅滩旁,笑容明朗,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈感。光线为下午的明亮阳光,海面反光形成天然柔和补光打亮衣服正面,背景为高度虚化的蔚蓝大海与天空。画面比例为3:4。夏日清透色彩,高饱和度,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "热带绿植温室服装主体场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止植物枝叶伸入前景遮挡衣服。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,与身后绿植保持距离,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在长满大型龟背竹与天堂鸟的植物园温室中,笑容明朗,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈与透气感。光线为穿透玻璃顶的明亮均匀自然光,衣服表面光影干净无杂乱叶影,背景为高度虚化的茂密绿植。画面比例为3:4。富士Provia 400X色彩预设,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止植物枝叶伸入前景遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,与身后绿植保持距离,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在长满大型龟背竹与天堂鸟的植物园温室中,笑容明朗,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的轻盈与透气感。光线为穿透玻璃顶的明亮均匀自然光,衣服表面光影干净无杂乱叶影,背景为高度虚化的茂密绿植。画面比例为3:4。富士Provia 400X色彩预设,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
|
||||
- name: "现代美术馆纯白服装主体外景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特背靠在明亮的现代美术馆纯白外墙前,气质清冷,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]的极简高级感。采用明亮的顺光漫反射,墙面反光为衣服提供均匀补光,背景为低饱和的明亮白调与几何光影,画面干净清透。画面比例为3:4。极简主义商业摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特背靠在明亮的现代美术馆纯白外墙前,气质清冷,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]的极简高级感。采用明亮的顺光漫反射,墙面反光为衣服提供均匀补光,背景为低饱和的明亮白调与几何光影,画面干净清透。画面比例为3:4。极简主义商业摄影,85mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
- name: "山顶服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在山顶的岩石平台上,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花图案与[材质]面料在户外的耐穿与透气属性。采用正午明亮的顺光并配合天空的自然柔光罩效果,衣服受光均匀色彩通透,背景为高度虚化的连绵山脉与蓝天白云。画面比例为3:4。电影级情绪摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在山顶的岩石平台上,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花图案与[材质]面料在户外的耐穿与透气属性。采用正午明亮的顺光并配合天空的自然柔光罩效果,衣服受光均匀色彩通透,背景为高度虚化的连绵山脉与蓝天白云。画面比例为3:4。电影级情绪摄影,50mm镜头,f/2.8光圈,8k分辨率。
|
||||
|
||||
# ==========================================
|
||||
# 五、 工作/通勤场景区(展现日常实用度)
|
||||
# ==========================================
|
||||
- name: "办公场景服装主体坐姿展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止桌面物品升高遮挡衣服下摆。【动作硬约束】模特端坐于办公桌前,上半身自然挺直微侧,双手平放键盘或桌面上远离胸口,屏幕与桌面位于画面最下沿之外,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮的极简办公桌前,展现干练气质,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的抗皱与挺括感。室内采用明亮的高调白光照明,光线均匀铺满衣服正面,背景为高度虚化的办公环境与绿植,画面通透干净。画面比例为3:4。商业电商摄影,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止桌面物品升高遮挡衣服下摆,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于办公桌前,上半身自然挺直微侧,双手平放键盘或桌面上远离胸口,屏幕与桌面位于画面最下沿之外,绝对不可抬手遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮的极简办公桌前,展现干练气质,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的抗皱与挺括感。室内采用明亮的高调白光照明,光线均匀铺满衣服正面,背景为高度虚化的办公环境与绿植,画面通透干净。画面比例为3:4。商业电商摄影,50mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "咖啡馆服装主体坐姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止咖啡杯与杯蒸汽遮挡衣服。【动作硬约束】模特端坐于窗边座位,上半身自然挺直微侧,咖啡杯托在手心置于腰腹高度的画面下沿,杯体远离胸口区域,另一只手自然放在桌面,绝对不可将杯子抬至胸前。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮风格咖啡馆的窗边座位上,姿态松弛,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的柔软垂坠感。明亮自然光从窗户侧面射入并配合室内暖光补足衣服正面亮度,画面通透,背景为高度虚化的木质装潢与绿植。画面比例为3:4。日系胶片质感,富士Provia 400X色彩预设,50mm镜头,f/1.8大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止咖啡杯与杯蒸汽遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于窗边座位,上半身自然挺直微侧,咖啡杯托在手心置于腰腹高度的画面下沿,杯体远离胸口区域,另一只手自然放在桌面,绝对不可将杯子抬至胸前。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在明亮风格咖啡馆的窗边座位上,姿态松弛,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的柔软垂坠感。明亮自然光从窗户侧面射入并配合室内暖光补足衣服正面亮度,画面通透,背景为高度虚化的木质装潢与绿植。画面比例为3:4。日系胶片质感,富士Provia 400X色彩预设,50mm镜头,f/1.8大光圈,8k分辨率。
|
||||
|
||||
- name: "书店服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止书本遮挡衣服。【动作硬约束】模特上半身挺拔微侧,持书的手将书收在腰腹高度的画面下沿视线瞥向书页,另一只手自然垂放,绝对不可将书举起靠近胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮的高大木质书架前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的挺括与质感。书店采用明亮的射灯与自然光交织,射灯角度经过调整避免在衣服上留下脸部阴影,背景为高度虚化的书脊与明亮光斑。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止书本遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,持书的手将书收在腰腹高度的画面下沿视线瞥向书页,另一只手自然垂放,绝对不可将书举起靠近胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮的高大木质书架前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的挺括与质感。书店采用明亮的射灯与自然光交织,射灯角度经过调整避免在衣服上留下脸部阴影,背景为高度虚化的书脊与明亮光斑。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8大光圈,8k分辨率。
|
||||
|
||||
- name: "复古家具店服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止家具道具伸入前景遮挡衣服。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,与周围家具保持安全距离,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在摆满上世纪老物件的中古家具店内,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的质感。店内采用明亮的自然光漫反射,环境家具均为背景虚化元素,不在衣服上投下明显阴影,背景为高度虚化的胡桃木柜与明亮光斑。画面比例为3:4。富士Provia 400X色彩预设,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止家具道具伸入前景遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,与周围家具保持安全距离,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在摆满上世纪老物件的中古家具店内,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的质感。店内采用明亮的自然光漫反射,环境家具均为背景虚化元素,不在衣服上投下明显阴影,背景为高度虚化的胡桃木柜与明亮光斑。画面比例为3:4。富士Provia 400X色彩预设,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "艺术画廊服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特由侧身观展状态转回正对镜头,上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在灯光柔和明亮的现代艺术画廊内,气质疏离高级,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]的高级调性。画廊专业顶光灯打出均匀漫反射铺满衣服正面,背景为高度虚化的洁白墙面与画框。画面比例为3:4。索尼A7R4画质,50mm镜头,f/1.8大光圈,清冷调高级感,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特由侧身观展状态转回正对镜头,上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在灯光柔和明亮的现代艺术画廊内,气质疏离高级,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]的高级调性。画廊专业顶光灯打出均匀漫反射铺满衣服正面,背景为高度虚化的洁白墙面与画框。画面比例为3:4。索尼A7R4画质,50mm镜头,f/1.8大光圈,清冷调高级感,8k分辨率。
|
||||
|
||||
- name: "超市货架服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止彩色货架光线污染衣服色调。【动作硬约束】模特上半身挺拔,扶购物车的手位于画面最下沿,另一只手自然垂放,姿态俏皮个性,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在摆满色彩鲜艳饮料的超市货架前,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花图案与背景色彩的碰撞感及[材质]的日常实穿度。货架顶部的明亮冷光源仅照亮背景,模特所在的前景由柔和补光灯独立打亮,确保衣服色彩不受环境色影响而偏色,背景为高度虚化的彩色商品。画面比例为3:4。赛博潮流摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止彩色货架光线污染衣服色调,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,扶购物车的手位于画面最下沿,另一只手自然垂放,姿态俏皮个性,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在摆满色彩鲜艳饮料的超市货架前,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花图案与背景色彩的碰撞感及[材质]的日常实穿度。货架顶部的明亮冷光源仅照亮背景,模特所在的前景由柔和补光灯独立打亮,确保衣服色彩不受环境色影响而偏色,背景为高度虚化的彩色商品。画面比例为3:4。赛博潮流摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
# ==========================================
|
||||
# 六、 情绪氛围与高亮特色场景区(提升品牌调性)
|
||||
# ==========================================
|
||||
- name: "明亮工业风咖啡馆服装主体展示"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮工业风咖啡馆的纯白水泥墙前,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的硬挺与廓形。采用正午明亮的自然光与室内暖光交织,衣服正面受光均匀立体,背景为高度虚化的明亮通道与绿植。画面比例为3:4。潮流电商摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在明亮工业风咖啡馆的纯白水泥墙前,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的硬挺与廓形。采用正午明亮的自然光与室内暖光交织,衣服正面受光均匀立体,背景为高度虚化的明亮通道与绿植。画面比例为3:4。潮流电商摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
- name: "录音棚服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止耳机线垂落遮挡印花。【动作硬约束】模特佩戴监听耳机站立于麦克风架旁,麦杆收至脸侧避开胸口区域,一只手轻轻扶住耳机耳罩位于画面侧缘,另一只手自然垂放,绝对不可让手部或设备遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特在明亮的录音棚内,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的挺括廓形。采用明亮的暖色聚光灯配合正面柔光板补光,确保印花区域通透明亮,背景为高度虚化的吸音棉墙面与调音台。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止耳机线垂落遮挡印花,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特佩戴监听耳机站立于麦克风架旁,麦杆收至脸侧避开胸口区域,一只手轻轻扶住耳机耳罩位于画面侧缘,另一只手自然垂放,绝对不可让手部或设备遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特在明亮的录音棚内,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的挺括廓形。采用明亮的暖色聚光灯配合正面柔光板补光,确保印花区域通透明亮,背景为高度虚化的吸音棉墙面与调音台。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.8光圈,8k分辨率。
|
||||
|
||||
- name: "暖光清吧服装主体坐姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止酒杯遮挡衣服。【动作硬约束】模特端坐于吧台前,上半身自然挺直微侧,酒杯托在手心置于吧台面的画面下沿高度,远离胸口,另一只手自然垂放,绝对不可举杯遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在氛围感清吧的吧台前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]在暖光下的质感。采用明亮的暖黄主光源配合正面白色补光板,衣服正面曝光充足色彩不偏橙,背景为高度虚化的酒瓶阵列与明亮灯带。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止酒杯遮挡衣服,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特端坐于吧台前,上半身自然挺直微侧,酒杯托在手心置于吧台面的画面下沿高度,远离胸口,另一只手自然垂放,绝对不可举杯遮挡印花。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特坐在氛围感清吧的吧台前,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]在暖光下的质感。采用明亮的暖黄主光源配合正面白色补光板,衣服正面曝光充足色彩不偏橙,背景为高度虚化的酒瓶阵列与明亮灯带。画面比例为3:4。电影级情绪摄影,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
|
||||
- name: "日落黄昏街头服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止剪影化处理导致衣服发黑。【动作硬约束】模特上半身微倚天桥栏杆,肩部放松,双手自然垂放于身体两侧胯部附近,栏杆金属管避开衣服下摆高度,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特倚靠在城市明亮的天桥栏杆旁,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花在黄昏暖光下的视觉效果。采用日落黄金时刻的明亮顺侧光,金色阳光直接铺满衣服正面而非逆光,色彩温暖且印花清晰锐利,背景为高度虚化的明亮车流与城市天际线。画面比例为3:4。潮流摄影,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止剪影化处理导致衣服发黑,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身微倚天桥栏杆,肩部放松,双手自然垂放于身体两侧胯部附近,栏杆金属管避开衣服下摆高度,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特倚靠在城市明亮的天桥栏杆旁,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花在黄昏暖光下的视觉效果。采用日落黄金时刻的明亮顺侧光,金色阳光直接铺满衣服正面而非逆光,色彩温暖且印花清晰锐利,背景为高度虚化的明亮车流与城市天际线。画面比例为3:4。潮流摄影,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
|
||||
- name: "旱冰场服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止场地彩光污染衣服原有色彩。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,姿态从容,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在复古旱冰场中央,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的随性与飘逸。场地采用明亮的主射灯独立照亮模特并配有正面柔光,衣服保持自身固有色不被环境粉紫光染色,背景为高度虚化的霓虹灯带与溜冰场护栏。画面比例为3:4。复古胶片质感,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止场地彩光污染衣服原有色彩,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔微侧,肩部放松,双手自然垂放于身体两侧胯部附近,姿态从容,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特站在复古旱冰场中央,身体正对镜头微侧,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的随性与飘逸。场地采用明亮的主射灯独立照亮模特并配有正面柔光,衣服保持自身固有色不被环境粉紫光染色,背景为高度虚化的霓虹灯带与溜冰场护栏。画面比例为3:4。复古胶片质感,50mm镜头,f/1.4大光圈,8k分辨率。
|
||||
|
||||
- name: "明亮现代地下车库服装主体站姿场景"
|
||||
prompt: |
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件衣服,绝对禁止在外面叠加任何外套、夹克或衬衫。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口。【动作硬约束】模特上半身挺拔背靠水泥柱,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特背靠在明亮的现代地下车库环氧地坪和纯白水泥柱上,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的耐穿属性。采用顶部的明亮白光聚光灯正面补光组合,画面清透无暗角,衣服受光均匀对比适中,背景为高度虚化的明亮车库通道与反光地面。画面比例为3:4。潮流摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
【最高优先级约束】请严格保留参考图1中模特所穿衣服的完整外观,包括其原有的颜色、印花图案、版型款式、材质纹理与缝线细节,绝对禁止对衣服本身进行任何形式的修改、重新设计、变色或改变图案。仅提取这件[商品名称],将其作为单件上衣穿在一位[模特特征]的身上,模特仅单穿这一件上衣,绝对禁止在外面叠加任何外套、夹克或衬衫;同时模特下半身必须穿着与衣服风格协调的深色或基础色长裤或牛仔裤,下装即使位于画面下沿之外也必须真实穿着,形成完整的日常着装状态。【构图约束】服装主体构图:取景范围自模特头顶上方少许留白起,至衣服下摆下方一掌宽处止,这件[商品名称]的领口、肩线、双袖、下摆与正面印花必须100%完整入画且无遮挡;头部占比不超过画面高度的四分之一,五官弱化不做强调,画面的绝对视觉中心是胸前印花;禁止面部特写构图,禁止裁切衣服任何部位。【负面约束】禁止改变衣服颜色,禁止遮挡材质纹理,禁止遮挡或破坏印花图案完整性,禁止双手交叉抱胸,禁止手部遮挡胸口,禁止不穿下装,禁止裸露下半身,禁止画面下沿出现裸腿或内裤,禁止改变抽绳、帽绳、下摆罗纹、袖口罗纹等服装结构部件的原始颜色,禁止将印花图案或印花颜色延伸绘制到抽绳、帽子、罗纹等结构部件上,所有结构部件必须严格保持参考图中的原始同色状态。【动作硬约束】模特上半身挺拔背靠水泥柱,肩部放松,双手自然垂放于身体两侧胯部附近,绝对不可抬手遮挡胸口。【稳定性约束】背景必须保持干净明亮,不可产生昏暗杂色。模特背靠在明亮的现代地下车库环氧地坪和纯白水泥柱上,身体正对镜头,整体呈现[服装风格]的调性,展示衣服正面印花与[材质]面料的耐穿属性。采用顶部的明亮白光聚光灯正面补光组合,画面清透无暗角,衣服受光均匀对比适中,背景为高度虚化的明亮车库通道与反光地面。画面比例为3:4。潮流摄影,85mm镜头,f/2.0光圈,8k分辨率。
|
||||
|
||||
+11
-1
@@ -39,7 +39,17 @@ CREATE TABLE SPU (
|
||||
fabric_weight_unit_1 TEXT,
|
||||
lining_texture TEXT,
|
||||
country TEXT,
|
||||
mark TEXT
|
||||
mark TEXT,
|
||||
placket_type TEXT DEFAULT '套头衫',
|
||||
sleeve_type TEXT DEFAULT '常规袖/直筒袖',
|
||||
sleeve_length_type TEXT DEFAULT '短袖',
|
||||
breast_pad TEXT DEFAULT '否',
|
||||
silhouette TEXT DEFAULT 'H',
|
||||
length_type TEXT DEFAULT '常规款',
|
||||
belt TEXT DEFAULT '否',
|
||||
occasion TEXT DEFAULT '休闲外出',
|
||||
scene TEXT DEFAULT '休闲',
|
||||
hemline_shape TEXT DEFAULT '伞状'
|
||||
)
|
||||
""")
|
||||
|
||||
|
||||
Binary file not shown.
+18
-6
@@ -81,6 +81,12 @@ def _pinterest_route(state: Dict[str, Any]) -> str:
|
||||
if max_rounds <= 0:
|
||||
max_rounds = max(target * 2, 5)
|
||||
|
||||
# 简报已达目标 → 停止补分析,直接收尾出模板(即使用户图池还有未消费图片也不再分析,
|
||||
# 避免目标简报数的小任务把整池图分析成冗余简报、浪费配额)
|
||||
if len(briefs) >= target:
|
||||
print(f"[pinterest_route] 简报已达目标 {len(briefs)}/{target},停止补分析,结束(将收尾出模板)")
|
||||
return "done"
|
||||
|
||||
# 简报池还有待处理/在途简报 → 先让后台消化,不分析新图也不采集
|
||||
if pipe is not None and hasattr(pipe, "pending_count"):
|
||||
pending = pipe.pending_count()
|
||||
@@ -88,7 +94,7 @@ def _pinterest_route(state: Dict[str, Any]) -> str:
|
||||
# 日志由 pinterest_wait 节点进入时统一打印(阻塞等待消化,避免此处高频刷屏)
|
||||
return "wait"
|
||||
|
||||
# 简报池空闲 → 检查图池:还有未消费图片 → 补分析(不管简报离目标差多少,先把这批用完)
|
||||
# 简报池空闲 + 简报未达标 + 图池还有未消费图片 → 补分析(缺口批大小由 analyze_node 按 target 收敛)
|
||||
try:
|
||||
from graph.pinterest import load_image_pool, load_used_images, pool_unused_images
|
||||
pool = load_image_pool(str(state.get("output_dir") or ""), state.get("country") or "")
|
||||
@@ -96,16 +102,22 @@ def _pinterest_route(state: Dict[str, Any]) -> str:
|
||||
unused = pool_unused_images(pool, used)
|
||||
except Exception: # noqa: BLE001
|
||||
unused = []
|
||||
# 连续多轮图片分析无新增简报(分析失败 / 图片均不适合印花)→ 视为无法生成,
|
||||
# 直接收尾,避免"取下一张参考图"式无限空转
|
||||
max_empty = int(pcfg.get("max_empty_analyze") or 0)
|
||||
if max_empty <= 0:
|
||||
max_empty = max(target + 2, 3)
|
||||
empty = int(state.get("pinterest_empty_rounds") or 0)
|
||||
if empty >= max_empty:
|
||||
print(f"[pinterest_route] 连续 {empty} 轮图片分析无新增简报(目标 {len(briefs)}/{target} 条简报未达标),"
|
||||
f"无法生成 → 放弃补分析,直接收尾(不再逐一取下一张参考图)")
|
||||
return "done"
|
||||
|
||||
if unused:
|
||||
print(f"[pinterest_route] 简报池空闲,图池还有 {len(unused)} 张未消费图片,补分析"
|
||||
f"(简报 {len(briefs)}/{target})")
|
||||
return "analyze"
|
||||
|
||||
# 简报池空闲 + 图池空 → 检查简报是否已达标
|
||||
if len(briefs) >= target:
|
||||
print(f"[pinterest_route] 图池已空,简报已达目标 {len(briefs)}/{target},结束")
|
||||
return "done"
|
||||
|
||||
# 简报池空闲 + 图池空 + 简报不达标 → 新一轮搜索采集
|
||||
if rounds >= max_rounds:
|
||||
print(f"[pinterest_route] 已达最大轮次 {max_rounds},图池已空,简报 {len(briefs)}/{target},按现有结果继续")
|
||||
|
||||
@@ -78,14 +78,14 @@ def _shrink_blob_to_2mb(img_path: str, blob: bytes, max_bytes: int = 2 * 1024 *
|
||||
return blob
|
||||
|
||||
|
||||
def _save_from_response(j: dict, out_path: str) -> str:
|
||||
def _save_from_response(j: dict, out_path: str, started: float = None) -> str:
|
||||
"""从同步/异步最终响应提取图片(data[].b64_json 或 url)并保存。"""
|
||||
data_item = (j.get("data") or [{}])[0]
|
||||
b64 = data_item.get("b64_json")
|
||||
if b64:
|
||||
Path(out_path).parent.mkdir(parents=True, exist_ok=True)
|
||||
Path(out_path).write_bytes(base64.b64decode(b64))
|
||||
return out_path
|
||||
else:
|
||||
url = data_item.get("url")
|
||||
if not url:
|
||||
raise RuntimeError(f"图像 API 返回无 b64_json/url: {str(j)[:200]}")
|
||||
@@ -93,14 +93,17 @@ def _save_from_response(j: dict, out_path: str) -> str:
|
||||
img_resp.raise_for_status()
|
||||
Path(out_path).parent.mkdir(parents=True, exist_ok=True)
|
||||
Path(out_path).write_bytes(img_resp.content)
|
||||
if started is not None:
|
||||
print(f"[img] 已生成(耗时 {time.time() - started:.0f}s): {out_path}")
|
||||
return out_path
|
||||
|
||||
|
||||
def _wait_task(base_url: str, headers: dict, task_id: str, poll_after_ms: int,
|
||||
timeout: int = 60) -> dict:
|
||||
timeout: int = 300) -> dict:
|
||||
"""轮询异步图像任务直到完成;uncertain(结果暂时不确定)继续等,不重复提交。
|
||||
timeout 默认 60s:异步路径不稳定(ai-media 网关常 uncertain/task not found),
|
||||
超时即抛异常由调用方重试同步提交。"""
|
||||
timeout 默认 300s(与提交请求 timeout 一致):网关异步任务实际需 30s~6 分钟
|
||||
(设计稿/三图合成),60s 轮询超时会把仍在处理中的任务误判为失败而重复提交,
|
||||
白白消耗配额和时间。超时即抛异常由调用方重试同步提交。"""
|
||||
deadline = time.time() + timeout
|
||||
last = ""
|
||||
while time.time() < deadline:
|
||||
@@ -126,14 +129,15 @@ def _wait_task(base_url: str, headers: dict, task_id: str, poll_after_ms: int,
|
||||
raise RuntimeError(f"图像异步任务超时({timeout}s)")
|
||||
|
||||
|
||||
def _resolve_task_or_sync(j: dict, base_url: str, headers: dict, out_path: str) -> str:
|
||||
def _resolve_task_or_sync(j: dict, base_url: str, headers: dict, out_path: str,
|
||||
started: float = None) -> str:
|
||||
"""提交后的统一处理:异步任务则轮询,然后提取图片保存。"""
|
||||
if j.get("object") == "image.task" or j.get("task_id") or j.get("id", "").startswith("imgtask"):
|
||||
tid = j.get("task_id") or j.get("id") or ""
|
||||
if not tid:
|
||||
raise RuntimeError(f"异步任务无 task_id: {str(j)[:200]}")
|
||||
j = _wait_task(base_url, headers, tid, int(j.get("poll_after_ms") or 2000))
|
||||
return _save_from_response(j, out_path)
|
||||
return _save_from_response(j, out_path, started=started)
|
||||
|
||||
|
||||
class OpenAIImageBackend(ImageBackend):
|
||||
@@ -191,6 +195,8 @@ class OpenAIImageBackend(ImageBackend):
|
||||
data["execution_mode"] = em
|
||||
if seed is not None:
|
||||
data["seed"] = seed
|
||||
started = time.time()
|
||||
print(f"[img] 开始图生图({model},{data['size']},参考图 {len(file_payloads)} 张)→ {Path(out_path).name}")
|
||||
# 提交重试:异步路径不稳定 → 失败重试同步提交(最多 3 次);
|
||||
# 内容政策拦截(content_policy_violation)多为网关误判 → 等待后重试
|
||||
last_err: Optional[str] = None
|
||||
@@ -222,7 +228,8 @@ class OpenAIImageBackend(ImageBackend):
|
||||
continue
|
||||
raise RuntimeError(f"图像 API {resp.status_code}: {body[:300]}")
|
||||
try:
|
||||
return _resolve_task_or_sync(resp.json(), base_url, headers, out_path)
|
||||
return _resolve_task_or_sync(resp.json(), base_url, headers, out_path,
|
||||
started=started)
|
||||
except json.JSONDecodeError as e:
|
||||
# 空/非 JSON 响应:多为网关过载返回空 body → 退避后重试,
|
||||
# 避免即时重压触发网关 429(用户实测空响应风暴 → 429)
|
||||
@@ -264,6 +271,8 @@ class OpenAIImageBackend(ImageBackend):
|
||||
data["execution_mode"] = em
|
||||
if seed is not None:
|
||||
data["seed"] = seed
|
||||
started = time.time()
|
||||
print(f"[img] 开始文生图({model},{data['size']})→ {Path(out_path).name}")
|
||||
last_err: Optional[str] = None
|
||||
for attempt in range(3):
|
||||
resp = requests.post(f"{base_url}/images/generations", headers=headers, json=data,
|
||||
@@ -293,7 +302,8 @@ class OpenAIImageBackend(ImageBackend):
|
||||
continue
|
||||
raise RuntimeError(f"图像 API {resp.status_code}: {body[:300]}")
|
||||
try:
|
||||
return _resolve_task_or_sync(resp.json(), base_url, headers, out_path)
|
||||
return _resolve_task_or_sync(resp.json(), base_url, headers, out_path,
|
||||
started=started)
|
||||
except json.JSONDecodeError as e:
|
||||
# 空/非 JSON 响应:多为网关过载返回空 body → 退避后重试,
|
||||
# 避免即时重压触发网关 429(用户实测空响应风暴 → 429)
|
||||
|
||||
@@ -170,21 +170,21 @@ class MockBackend:
|
||||
terms = [f"{t} {suffix}" if suffix not in t.lower() else t for t in terms]
|
||||
return {"search_terms": terms}
|
||||
|
||||
def analyze_pinterest_images(self, image_paths, term="", country="", on_400=None):
|
||||
"""规则生成设计简报(零 API 成本):按搜索词启发式推导风格/配色/构图。"""
|
||||
def analyze_pinterest_images(self, image_paths, term="", country="", on_400=None, custom_mode=False):
|
||||
"""规则生成设计简报(零 API 成本):按搜索词启发式推导风格/配色/构图。
|
||||
|
||||
custom_mode: 仅作签名兼容(mock 为规则生成,不区分模式)。
|
||||
"""
|
||||
from ..classify import classify, prompt_suggestion
|
||||
cat = classify(term)
|
||||
art_style, palette = derive_style_palette(term, country, category=cat)
|
||||
motif = prompt_suggestion(term, cat).split(" --no ")[0].split(",")[0].strip()
|
||||
composition = derive_composition(term, cat)
|
||||
negative = ("no real people, no likeness of any person, no copyrighted characters, "
|
||||
"no brand logos, no trademarks, no celebrity, no readable text unless safe")
|
||||
n = max(1, len(image_paths or []))
|
||||
paths = list(image_paths or [])
|
||||
return [{
|
||||
"topic": term,
|
||||
"suitable_for_print": True,
|
||||
"negative_prompt": negative,
|
||||
"image_prompt": (f"{motif}, {art_style}, {palette}, {composition}, "
|
||||
f"original {art_style} t-shirt print design, "
|
||||
f"no brand logo, no trademark, no character, no watermark"),
|
||||
|
||||
@@ -362,12 +362,8 @@ image_prompt = two parts:
|
||||
NEVER mention shirts, apparel, models, scenes, sizes, backgrounds or
|
||||
watermarks — placement is handled externally.
|
||||
|
||||
negative_prompt: copy of reference artwork, likenesses, characters, logos,
|
||||
trademarks, watermark, photorealistic shirt/product mockups, busy background;
|
||||
add garbled-lettering terms only if your design includes text.
|
||||
|
||||
OUTPUT — ONLY valid JSON, no fences:
|
||||
{"designs":[{"suitable_for_print":<bool>,"negative_prompt":"<str>","image_prompt":"<str>"}]}"""
|
||||
{"designs":[{"suitable_for_print":<bool>,"image_prompt":"<str>"}]}"""
|
||||
|
||||
PINTEREST_ANALYZE_SCHEMA = {
|
||||
"name": "pinterest_design_briefs",
|
||||
@@ -380,10 +376,9 @@ PINTEREST_ANALYZE_SCHEMA = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"suitable_for_print": {"type": "boolean"},
|
||||
"negative_prompt": {"type": "string"},
|
||||
"image_prompt": {"type": "string"},
|
||||
},
|
||||
"required": ["suitable_for_print", "negative_prompt", "image_prompt"],
|
||||
"required": ["suitable_for_print", "image_prompt"],
|
||||
"additionalProperties": False,
|
||||
},
|
||||
}
|
||||
@@ -411,6 +406,61 @@ def _pinterest_analyze_prompt_file(country: str, filename: str) -> str:
|
||||
return ""
|
||||
|
||||
|
||||
# 自定义模式(pinterest.mode=custom)多模态分析系统提示词内置默认:
|
||||
# 输入是「现有爆款产品图」(模特实拍/平铺图),定位衣服上的印花并产出同风格、不同执行的非侵权原创设计。
|
||||
# 该文本为「内置默认」,可被 prompts/custom_analyze_system.md 覆盖(缺失/留空回退这里)。
|
||||
CUSTOM_ANALYZE_SYSTEM_PROMPT = """You are a POD T-shirt design analyst working in CUSTOM-REFERENCE mode. You are given ONE existing bestseller product photo — an on-model shot or a flat-lay shot of a printed garment. Your job:
|
||||
1. Locate the printed artwork on the garment and judge whether that PRINT can inspire a new T-shirt design (ignore the shirt itself, the model, the background, watermarks and photo quality — judge only the printed artwork).
|
||||
2. Write an ORIGINAL design brief that keeps the bestseller's general vibe (theme, style genre, era, mood) but is a clearly different, non-infringing work.
|
||||
|
||||
RULES:
|
||||
0. REFERENCE HANDLING — the attached photo is a product mockup of an existing bestseller, not an artwork file. Use it ONLY to identify the printed artwork and distill its appeal into generic style keywords (retro, y2k, minimal, grunge, boho, kawaii, western, cottagecore, vintage cartoon...). Never reproduce, trace, rearrange, recolor or closely imitate the print, its layout, characters or text.
|
||||
1. SAME SUBJECT FAMILY, NEW EXECUTION — the new design must belong to the same visual family as the bestseller print so a buyer would instantly see they are "same style, different shirt". LOCK these elements to the bestseller's: (a) general subject category (e.g., human/animal figure silhouette, celestial object, floral, vehicle, typography-led...), (b) art technique (e.g., grunge ink silhouette, clean line art, watercolor, distressed collage...), (c) palette (monochrome / muted / neon...). VARY these: the exact subject, the pose, the composition and layout, and any decorative framing. The result must be clearly original — no traced or rearranged reuse of the reference artwork — while staying recognizably in the same genre.
|
||||
2. IP SCREENING — if the bestseller print contains brand logos, trademarks, slogans, mascots, copyrighted characters (including stylized or silhouette versions), real people/celebrities, movie/game/anime/band IP, or lyrics, do NOT imitate them; swap in fully generic equivalents (e.g., an unnamed cartoon animal instead of a recognizable mascot). Also avoid politics, religion, violence, sexual content, alcohol, drugs, gambling, flags, death/occult themes.
|
||||
3. FORM — ONE clear central subject with strong graphic composition; print-ready standalone artwork. ANY colors are fine — rich palettes, gradients and detailed shading are all acceptable. Because the reference is a product photo, explicitly exclude the garment and the photo itself: never describe shirts, models, hangers, scenes or backgrounds. Photographic elements in the print may be re-rendered as detailed full-color illustrations, retro badges or vintage stickers.
|
||||
4. TEXT — short ORIGINAL English wording (1-6 words) allowed; wrap exact words in double quotes and demand exact spelling; integrate into composition. Never reuse, translate or near-duplicate the bestseller print's wording; no brand/band/movie names or famous slogans. When unsure, omit.
|
||||
|
||||
suitable_for_print: judge ONLY the printed artwork extracted from the bestseller photo. DEFAULT TRUE for graphics, illustrations, badges, vector art, typography prints, or prints visible on mockups. FALSE only for: blank garments with no artwork, prints that are indiscernible due to watermark, blur or very low quality, pure subjectless photo scenery, memes/screenshots/collages with no usable motif. Even when FALSE, still fill all fields so downstream never breaks.
|
||||
|
||||
image_prompt = two parts:
|
||||
1) mandatory opener: "First, carefully examine the printed artwork on the garment in the attached photo: zoom in mentally on the print area, identify its subject, technique, palette and layout, and base the new design on THOSE observed traits. Ignore the model, background and photo quality. Then: use the attached bestseller product photo only as loose inspiration for overall mood, theme, era and style genre — do NOT reproduce, trace, rearrange, recolor or closely imitate its printed artwork, characters, layout or text, and do NOT render a shirt, garment, model, hanger, photo scene, product mockup or background of any kind."
|
||||
2) the new design: [same subject family as observed] + [same technique and palette family] + [changed exact subject, pose, composition and framing] + [mood], plus quoted original text if used. NEVER mention shirts, apparel, models, scenes, sizes, backgrounds or watermarks — placement is handled externally. Before output, verify the new design shares the locked elements (subject category, technique, palette) with the observed print; if not, revise it.
|
||||
|
||||
OUTPUT — ONLY valid JSON, no fences:
|
||||
{"designs":[{"suitable_for_print":<bool>,"image_prompt":"<str>"}]}"""
|
||||
|
||||
|
||||
def _custom_analyze_prompt_file(filename: str) -> str:
|
||||
"""定位自定义模式多模态分析提示词文件:优先运行根 prompts(exe 旁,可编辑),回退数据根 prompts。
|
||||
|
||||
只读全局 prompts/<filename>(自定义模式不按国家区分)。找不到返回空串,由调用方回退内置默认。
|
||||
"""
|
||||
for base in (runtime_root(), project_root()):
|
||||
p = base / "prompts" / filename
|
||||
if p.exists():
|
||||
return p.read_text(encoding="utf-8").strip()
|
||||
return ""
|
||||
|
||||
|
||||
def resolve_custom_analyze_system_prompt() -> str:
|
||||
"""自定义模式多模态分析系统提示词(可配置):命中 prompts/custom_analyze_system.md,
|
||||
否则回退内置 CUSTOM_ANALYZE_SYSTEM_PROMPT。"""
|
||||
text = _custom_analyze_prompt_file("custom_analyze_system.md")
|
||||
return text if text else CUSTOM_ANALYZE_SYSTEM_PROMPT
|
||||
|
||||
|
||||
def build_custom_analyze_user_prompt() -> str:
|
||||
"""自定义模式多模态分析用户提示词(可配置):命中 prompts/custom_analyze_user.md 否则内置默认。"""
|
||||
text = _custom_analyze_prompt_file("custom_analyze_user.md")
|
||||
if text:
|
||||
return text
|
||||
return (
|
||||
"Analyze the attached bestseller product photo, locate its printed artwork, "
|
||||
"and produce one ORIGINAL T-shirt print design brief that keeps its general vibe "
|
||||
"without copying its printed artwork."
|
||||
)
|
||||
|
||||
|
||||
def resolve_pinterest_analyze_system_prompt(country: str = "") -> str:
|
||||
"""多模态分析系统提示词(可配置):命中 prompts/pinterest_analyze_system.md(国家覆盖优先),
|
||||
否则回退内置 PINTEREST_ANALYZE_SYSTEM_PROMPT。"""
|
||||
@@ -628,12 +678,14 @@ class OpenAICompatBackend(LLMBackend):
|
||||
terms = [f"{t} {suffix}" if suffix not in t.lower() else t for t in terms]
|
||||
return {"search_terms": terms}
|
||||
|
||||
def analyze_pinterest_images(self, image_paths: List[str], term: str, country: str = "",
|
||||
on_400=None) -> List[Dict[str, Any]]:
|
||||
def analyze_pinterest_images(self, image_paths: List[str], term: str = "", country: str = "",
|
||||
on_400=None, custom_mode: bool = False) -> List[Dict[str, Any]]:
|
||||
"""多模态分析 Pinterest 图片 → 原创设计简报列表。
|
||||
|
||||
图片输入失败/无有效图片时直接放弃(返回 [],不降级纯文本),由节点跳过该产品。
|
||||
on_400: 每次 HTTP 400(且含「内容/图片」)时回调(供调用方累计放弃计数)。
|
||||
custom_mode: True=自定义模式,用独立的多模态提示词(CUSTOM-REFERENCE 版,
|
||||
见 prompts/custom_analyze_system.md / custom_analyze_user.md),输入是现有爆款产品图。
|
||||
"""
|
||||
cfg = self._cfg
|
||||
api_key = cfg.get("api_key", "")
|
||||
@@ -683,14 +735,20 @@ class OpenAICompatBackend(LLMBackend):
|
||||
pass
|
||||
|
||||
def _call() -> str:
|
||||
if custom_mode:
|
||||
sys_prompt = resolve_custom_analyze_system_prompt()
|
||||
user_prompt = build_custom_analyze_user_prompt()
|
||||
else:
|
||||
sys_prompt = resolve_pinterest_analyze_system_prompt(country)
|
||||
user_prompt = build_pinterest_analyze_user_prompt(country)
|
||||
user_content: List[Any] = [
|
||||
{"type": "text", "text": build_pinterest_analyze_user_prompt(country)},
|
||||
{"type": "text", "text": user_prompt},
|
||||
]
|
||||
user_content += [{"type": "image_url", "image_url": {"url": u}} for u in data_uris]
|
||||
payload = {
|
||||
"model": model,
|
||||
"messages": [
|
||||
{"role": "system", "content": resolve_pinterest_analyze_system_prompt(country)},
|
||||
{"role": "system", "content": sys_prompt},
|
||||
{"role": "user", "content": user_content},
|
||||
],
|
||||
"temperature": 0.5,
|
||||
@@ -742,7 +800,6 @@ class OpenAICompatBackend(LLMBackend):
|
||||
designs.append({
|
||||
"topic": term,
|
||||
"suitable_for_print": bool(d.get("suitable_for_print", True)),
|
||||
"negative_prompt": str(d.get("negative_prompt", "")).strip(),
|
||||
"image_prompt": str(d.get("image_prompt", "")).strip(),
|
||||
# 生图参考:每条简报对应其来源爬取图(LLM 按图逐张产出简报,顺序一一对应)
|
||||
"ref_images": [str(image_paths[i])] if i < len(image_paths) else [],
|
||||
|
||||
@@ -74,7 +74,6 @@ def _enrich_briefs(raw_briefs: List[Dict[str, Any]], country: str,
|
||||
"suitable_for_print": True,
|
||||
"design_category": classify(term),
|
||||
"concept": f"围绕「{term}」的原创印花设计",
|
||||
"negative_prompt": str(b.get("negative_prompt") or "").strip(),
|
||||
"image_prompt": str(b.get("image_prompt") or "").strip(),
|
||||
"ref_images": [str(p) for p in (b.get("ref_images") or []) if str(p)],
|
||||
"source_md5": str(b.get("source_md5") or "").strip().lower(),
|
||||
@@ -114,11 +113,11 @@ def pinterest_analyze_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if batch_size <= 0:
|
||||
batch_size = max_designs # 自动:一次最多分析 max_designs 张(每张图→1条简报)
|
||||
need = batch_size
|
||||
# 自定义模式:本地图池是唯一且有限的图源,最多分析「选品清单总数」张即可,
|
||||
# 避免多余分析(超出的图源在简报达标后由自定义路由结束,不浪费配额)。
|
||||
if bool(state.get("custom_mode")):
|
||||
# 按目标简报数收敛:最多分析到满足选品清单所需的简报数即可(target=spu_tasks,每款一个设计),
|
||||
# 普通与自定义模式一致——避免单一产品任务也把整池未消费图片全部分析成冗余简报、浪费配额;
|
||||
# 分析出的简报若不适合可丢弃,缺口不足时再由路由补分析/search。
|
||||
_t = int(state.get("pinterest_target") or 1) or 1
|
||||
need = max(0, min(need, _t))
|
||||
need = max(1, min(need, _t))
|
||||
|
||||
# 1) 图池取未消费图片(md5 不在 used_images);无 → 返回空,路由触发搜索
|
||||
pool = load_image_pool(output_dir, country)
|
||||
@@ -204,7 +203,8 @@ def pinterest_analyze_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
if pipe is not None and hasattr(pipe, "record_400"):
|
||||
if pipe.record_400():
|
||||
pipe._abort_current_term()
|
||||
res = llm.analyze_pinterest_images(paths, term, country, on_400=_on_400) or []
|
||||
res = llm.analyze_pinterest_images(paths, term, country, on_400=_on_400,
|
||||
custom_mode=bool(state.get("custom_mode"))) or []
|
||||
# 把每条简报的来源图路径回填为原始图(压缩图仅用于分析,参考图用原图)
|
||||
return _assign_refs(res, chunk)
|
||||
except Exception as e: # noqa: BLE001
|
||||
@@ -269,6 +269,16 @@ def pinterest_analyze_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
accumulated = list(state.get("briefs") or [])
|
||||
accumulated.extend(new_briefs)
|
||||
|
||||
# 连续无产出计数器:本次无新增简报 → 递增(防"逐一取下一张参考图"空转);
|
||||
# 有新增简报 → 重置为 0
|
||||
empty_rounds = int(state.get("pinterest_empty_rounds") or 0)
|
||||
if new_briefs:
|
||||
empty_rounds = 0
|
||||
else:
|
||||
empty_rounds += 1
|
||||
print(f"[pinterest_analyze] 本轮无新增简报(连续 {empty_rounds} 轮无产出),"
|
||||
f"超过上限后将自动结束")
|
||||
|
||||
# 推送实际新增且保留的简报到并发生成流水线(简报池):边分析边生成设计/三合一/种草图
|
||||
pushed = accumulated[old_count:]
|
||||
pipe = state.get("pinterest_pipeline")
|
||||
@@ -293,4 +303,5 @@ def pinterest_analyze_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
}
|
||||
print(f"[pinterest_analyze] 本轮分析 {len(batch)} 张图 → 简报 {len(new_briefs)} 条,"
|
||||
f"累计 {len(accumulated)} 条({country})")
|
||||
return {"pinterest_briefs": kept, "briefs": accumulated, "stats": stats, "errors": errors}
|
||||
return {"pinterest_briefs": kept, "briefs": accumulated, "stats": stats, "errors": errors,
|
||||
"pinterest_empty_rounds": empty_rounds}
|
||||
|
||||
+46
-15
@@ -22,11 +22,7 @@ PINTEREST_PRINT_SUFFIX = (
|
||||
"no garment, no shirt, no model, no mannequin, no watermark"
|
||||
)
|
||||
|
||||
# Pinterest 生图提示词 4 段结构中第 3 段的引导前缀:把 LLM 产出的 negative_prompt
|
||||
# 转成一条正向「Strictly avoid: ...」条款拼进 image_prompt,让防复制/防商标约束落到生成指令
|
||||
NEG_LEAD = "Strictly avoid: "
|
||||
|
||||
# Pinterest 生图提示词 4 段结构中第 4 段(仅当设计含文字时追加):
|
||||
# Pinterest 生图提示词 3 段结构中第 2 段(仅当设计含文字时追加):
|
||||
# 要求模型把引号内的文字按原文逐字正确拼写,避免乱码/拼错
|
||||
SPELLING_RULE = (
|
||||
"Render every phrase shown in quotes exactly as written, "
|
||||
@@ -43,6 +39,26 @@ REVIEW_REBRAND_HINT = (
|
||||
"a generic, non-infringing homage in the same mood, clearly distinct from the original."
|
||||
)
|
||||
|
||||
# —— 自定义模式(custom)生图模板:固定前缀 + 分析模型 image_prompt + 固定负向 ——
|
||||
# 自定义模式分析模型产出的是「新设计描述」,生图时套用这套固定模板(含防复制/防服装约束),
|
||||
# 负向用固定文本(写入 composite_negative,compose 生图时作为负向参数传给图像后端)。
|
||||
CUSTOM_IMAGE_PROMPT_TEMPLATE = (
|
||||
"Use the attached bestseller product photo only as loose inspiration for "
|
||||
"overall mood, theme, era and style genre — do NOT reproduce, trace, "
|
||||
"rearrange, recolor or closely imitate its printed artwork, characters, "
|
||||
"layout or text, and do NOT render a shirt, garment, model, hanger, photo "
|
||||
"scene, product mockup or background of any kind. First, carefully examine "
|
||||
"the printed artwork on the garment in the attached photo: zoom in mentally "
|
||||
"on the print area, identify its subject, technique, palette and layout, and "
|
||||
"base the new design on THOSE observed traits. Ignore the model, background "
|
||||
"and photo quality. Then: {image_prompt}"
|
||||
)
|
||||
CUSTOM_NEGATIVE_PROMPT = (
|
||||
"copy of reference artwork, lookalike of the bestseller print, characters, "
|
||||
"mascots, likenesses, logos, trademarks, watermark, photorealistic shirt, "
|
||||
"apparel, product mockup, model, garment, hanger, busy background"
|
||||
)
|
||||
|
||||
# 图像生成策略敏感词 → 安全等效描述(生成设计稿前清洗 motif,
|
||||
# 避免 gpt-image 等内容策略频繁拦截导致"生图限制多")
|
||||
_IMG_RISKY_SWAP = {
|
||||
@@ -76,6 +92,17 @@ def prompt_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
cc = state["country_config"]
|
||||
extra_rules = cc.get("extra_style_rules") or []
|
||||
tpls = config.get("prompt_templates") or {}
|
||||
# Pinterest 生图提示词固定段:可配置(config.pinterest.prompt_pieces),留空/缺失回退内置常量。
|
||||
# 自定义模式(custom_mode)用独立的一套固定段(config.custom.prompt_pieces),默认与 Pinterest 相同、可单独编辑。
|
||||
if bool(state.get("custom_mode")):
|
||||
pp = (config.get("custom") or {}).get("prompt_pieces") or {}
|
||||
else:
|
||||
pp = (config.get("pinterest") or {}).get("prompt_pieces") or {}
|
||||
print_suffix = (pp.get("print_suffix") or "").strip() or PINTEREST_PRINT_SUFFIX
|
||||
spelling_rule = (pp.get("spelling_rule") or "").strip() or SPELLING_RULE
|
||||
review_rebrand_hint = (pp.get("review_rebrand_hint") or "").strip() or REVIEW_REBRAND_HINT
|
||||
custom_ip_tpl = (pp.get("image_prompt_template") or "").strip() or CUSTOM_IMAGE_PROMPT_TEMPLATE
|
||||
custom_neg = (pp.get("negative_prompt") or "").strip() or CUSTOM_NEGATIVE_PROMPT
|
||||
|
||||
briefs: List[Dict[str, Any]] = []
|
||||
for r in screened:
|
||||
@@ -95,20 +122,24 @@ def prompt_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
|
||||
prompts = assemble_prompts(motif, art_style, palette, composition, tpls, country)
|
||||
llm_ip = (r.get("image_prompt") or "").strip()
|
||||
llm_neg = (r.get("negative_prompt") or "").strip()
|
||||
if r.get("source") == "pinterest" and llm_ip:
|
||||
# —— Pinterest 参考模式:跳过四要素模板,按 4 段结构拼 image_prompt ——
|
||||
if bool(state.get("custom_mode")):
|
||||
# —— 自定义模式:固定模板(前缀 + 分析 image_prompt),负向用固定文本 ——
|
||||
# 模板含防复制/防服装约束,不再追加 print_suffix;负向写入 composite_negative,
|
||||
# compose 生图时作为负向参数传给图像后端。
|
||||
prompts["image_prompt"] = custom_ip_tpl.replace("{image_prompt}", llm_ip)
|
||||
prompts["composite_negative"] = custom_neg
|
||||
print(f"[prompt] 自定义模式按固定模板拼 image_prompt(含固定负向): 「{r['topic']}」")
|
||||
else:
|
||||
# —— Pinterest 参考模式:跳过四要素模板,按 3 段结构拼 image_prompt ——
|
||||
# ① image_prompt(分析模型产出) + 固定输出形态后缀 PINTEREST_PRINT_SUFFIX
|
||||
# ② 负向条款(由 LLM negative_prompt 经 NEG_LEAD 引导,转化进正向指令)
|
||||
# ③ 拼写锁定句 SPELLING_RULE(仅当 LLM image_prompt 已含引号文字段时)
|
||||
# ② 拼写锁定句 SPELLING_RULE(仅当 LLM image_prompt 已含引号文字段时)
|
||||
# 是否含文字、拼写与否均由分析模型产出决定,本模式不注入 slogan。
|
||||
seg: List[str] = [llm_ip, PINTEREST_PRINT_SUFFIX.strip()]
|
||||
if llm_neg:
|
||||
seg.append(NEG_LEAD + llm_neg)
|
||||
seg: List[str] = [llm_ip, print_suffix]
|
||||
if '"' in llm_ip:
|
||||
seg.append(SPELLING_RULE)
|
||||
seg.append(spelling_rule)
|
||||
prompts["image_prompt"] = ", ".join(seg)
|
||||
print(f"[prompt] Pinterest 简报按 4 段结构拼 image_prompt(跳过四要素模板): 「{r['topic']}」")
|
||||
print(f"[prompt] Pinterest 简报按 3 段结构拼 image_prompt(跳过四要素模板): 「{r['topic']}」")
|
||||
else:
|
||||
# —— 热点采集模式:四要素模板装配 + 文字印花(约 30% 概率注入 slogan)——
|
||||
slogan = (r.get("slogan") or "").strip()
|
||||
@@ -119,7 +150,7 @@ def prompt_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
r["used_slogan"] = slogan
|
||||
# review(疑似商标/受保护主题)→ 追加「原创化魔改」引导(两个模式通用)
|
||||
if str(r.get("risk_level", "")).strip().lower() == "review":
|
||||
prompts["image_prompt"] = prompts["image_prompt"] + " " + REVIEW_REBRAND_HINT
|
||||
prompts["image_prompt"] = prompts["image_prompt"] + " " + review_rebrand_hint
|
||||
print(f"[prompt] review 简报注入原创化魔改引导: 「{r['topic']}」")
|
||||
r.update(prompts)
|
||||
r["motif"] = motif
|
||||
|
||||
@@ -67,7 +67,8 @@ def template_export_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
db_path = root / db_path
|
||||
break
|
||||
|
||||
from graph.template_export import export_products
|
||||
from graph.template_export import (export_products, _resolve_component_map,
|
||||
_resolve_season_map, _resolve_pattern_map)
|
||||
tdir = (pcfg.get("template_dir") or "").strip() or str(Path(tp).parent)
|
||||
prod_dir = output_dir / "product"
|
||||
prod_dir.mkdir(parents=True, exist_ok=True)
|
||||
@@ -120,6 +121,9 @@ def template_export_node(state: Dict[str, Any]) -> Dict[str, Any]:
|
||||
db_path, batch, tdir, tp, str(out),
|
||||
markup_percent=float(pcfg.get("markup_percent") or 0),
|
||||
suggested_price_ratio=float(pcfg.get("suggested_price_ratio") or 0),
|
||||
component_map=_resolve_component_map(config),
|
||||
season_map=_resolve_season_map(config),
|
||||
pattern_map=_resolve_pattern_map(config),
|
||||
)
|
||||
for r in products:
|
||||
if (r.get("composite_path") or r.get("printed_path")) and (r.get("en_title") or "").strip():
|
||||
|
||||
@@ -38,6 +38,7 @@ class AgentState(TypedDict, total=False):
|
||||
# —— Pinterest 按需搜索循环状态 ——
|
||||
pinterest_target: int # 目标简报数(= spu_tasks 数量,每款一个设计)
|
||||
pinterest_rounds: int # 已搜索轮次
|
||||
pinterest_empty_rounds: int # 连续图片分析无新增简报的轮数(防"逐一取下一张参考图"空转)
|
||||
pinterest_attempted: List[str] # 本轮已尝试(未持久化)的搜索词,防同轮重复
|
||||
pinterest_pipeline: Any # PinterestPipeline 实例(简报池 + 并发生成线程)
|
||||
|
||||
|
||||
+238
-64
@@ -22,6 +22,7 @@ _CAROUSEL_KW = ("轮播", "carousel", "カルーセル")
|
||||
|
||||
# 成分值字典映射:db 成分值 → 女装模板下拉框选项(男装模板选项与 db 值一致,直接保留)。
|
||||
# 女装模板(如 SatVoy 沙特)成分下拉框是「中文+英文」格式(棉Cotton),db 存中文(棉),需映射。
|
||||
# 该字典为「内置默认」,运行时可被 config.yaml 顶层 component_map.female 覆盖(缺失/留空回退这里)。
|
||||
_COMPONENT_FEMALE_MAP = {
|
||||
"棉": "棉Cotton",
|
||||
"聚酯纤维": "聚酯纤维(涤纶)Polyester",
|
||||
@@ -32,11 +33,108 @@ _COMPONENT_FEMALE_MAP = {
|
||||
}
|
||||
|
||||
|
||||
def _map_component(value: Any, gender: Optional[str]) -> Any:
|
||||
"""成分值按性别映射:male/None 保留原值;female 查女装字典(找不到保留原值)。"""
|
||||
def _resolve_component_map(config: Optional[Dict[str, Any]]) -> Dict[str, Any]:
|
||||
"""从 config 读取可配置成分映射(config.component_map.female),缺失/留空回退内置默认。
|
||||
|
||||
仅作用于 component_1/2/3;material 字段不经过任何映射,原样透传。
|
||||
"""
|
||||
if not config:
|
||||
return dict(_COMPONENT_FEMALE_MAP)
|
||||
female = None
|
||||
try:
|
||||
cm = config.get("component_map") or {}
|
||||
female = (cm.get("female") or {}) if isinstance(cm, dict) else {}
|
||||
except Exception: # noqa: BLE001
|
||||
female = {}
|
||||
if not isinstance(female, dict) or not female:
|
||||
return dict(_COMPONENT_FEMALE_MAP)
|
||||
merged = dict(_COMPONENT_FEMALE_MAP)
|
||||
merged.update({str(k): v for k, v in female.items() if v not in (None, "")})
|
||||
return merged
|
||||
|
||||
|
||||
def _map_component(value: Any, gender: Optional[str], cmp_map: Optional[Dict[str, Any]] = None) -> Any:
|
||||
"""成分值按性别映射(仅 component 字段,不作用于 material):male/None 保留原值;
|
||||
female 查成分映射表(默认内置、可由 config 覆盖,找不到保留原值)。"""
|
||||
if gender != "female" or value in (None, ""):
|
||||
return value
|
||||
return _COMPONENT_FEMALE_MAP.get(value, value)
|
||||
mapping = cmp_map if cmp_map is not None else _COMPONENT_FEMALE_MAP
|
||||
return mapping.get(value, value)
|
||||
|
||||
|
||||
# 季节值字典映射:db 季节值 → 女装模板下拉框选项(男装模板与 db 值一致,直接保留)。
|
||||
# 女装模板(如 SatVoy 沙特)季节下拉框用「ALL/全球/所有」等英文+中文格式,db 存「四季」,需映射。
|
||||
# 该字典为「内置默认」,运行时可被 config.yaml 顶层 season_map.female 覆盖(缺失/留空回退这里)。
|
||||
_SEASON_FEMALE_MAP = {
|
||||
"四季": "ALL/全球/所有",
|
||||
}
|
||||
|
||||
|
||||
# 印花图案值字典映射:db pattern 值 → 女装模板下拉框选项(男装模板与 db 值一致,直接保留)。
|
||||
# 女装模板遇到 pattern="印花" 时映射为「卡通」;该字典为「内置默认」,
|
||||
# 运行时可被 config.yaml 顶层 pattern_map.female 覆盖(缺失/留空回退这里)。
|
||||
_PATTERN_FEMALE_MAP = {
|
||||
"印花": "卡通",
|
||||
}
|
||||
|
||||
|
||||
def _resolve_pattern_map(config: Optional[Dict[str, Any]]) -> Dict[str, Any]:
|
||||
"""从 config 读取可配置图案映射(config.pattern_map.female),缺失/留空回退内置默认。
|
||||
|
||||
仅作用于 spu.pattern 字段(女装模板时映射,男装/None 保留原值)。
|
||||
"""
|
||||
if not config:
|
||||
return dict(_PATTERN_FEMALE_MAP)
|
||||
female = None
|
||||
try:
|
||||
pm = config.get("pattern_map") or {}
|
||||
female = (pm.get("female") or {}) if isinstance(pm, dict) else {}
|
||||
except Exception: # noqa: BLE001
|
||||
female = {}
|
||||
if not isinstance(female, dict) or not female:
|
||||
return dict(_PATTERN_FEMALE_MAP)
|
||||
merged = dict(_PATTERN_FEMALE_MAP)
|
||||
merged.update({str(k): v for k, v in female.items() if v not in (None, "")})
|
||||
return merged
|
||||
|
||||
|
||||
def _map_pattern(value: Any, gender: Optional[str], pattern_map: Optional[Dict[str, Any]] = None) -> Any:
|
||||
"""图案值按性别映射(仅 spu.pattern 字段):male/None 保留原值;
|
||||
female 查图案映射表(默认内置、可由 config 覆盖,找不到保留原值),如「印花」→「卡通」。"""
|
||||
if gender != "female" or value is None:
|
||||
return value
|
||||
v = str(value).strip()
|
||||
mapping = pattern_map if pattern_map is not None else _PATTERN_FEMALE_MAP
|
||||
return mapping.get(v, value)
|
||||
|
||||
|
||||
def _resolve_season_map(config: Optional[Dict[str, Any]]) -> Dict[str, Any]:
|
||||
"""从 config 读取可配置季节映射(config.season_map.female),缺失/留空回退内置默认。
|
||||
|
||||
仅作用于 spu.season 字段(女装模板时映射,男装/None 保留原值)。
|
||||
"""
|
||||
if not config:
|
||||
return dict(_SEASON_FEMALE_MAP)
|
||||
female = None
|
||||
try:
|
||||
sm = config.get("season_map") or {}
|
||||
female = (sm.get("female") or {}) if isinstance(sm, dict) else {}
|
||||
except Exception: # noqa: BLE001
|
||||
female = {}
|
||||
if not isinstance(female, dict) or not female:
|
||||
return dict(_SEASON_FEMALE_MAP)
|
||||
merged = dict(_SEASON_FEMALE_MAP)
|
||||
merged.update({str(k): v for k, v in female.items() if v not in (None, "")})
|
||||
return merged
|
||||
|
||||
|
||||
def _map_season(value: Any, gender: Optional[str], season_map: Optional[Dict[str, Any]] = None) -> Any:
|
||||
"""季节值按性别映射(仅 spu.season 字段):male/None 保留原值;
|
||||
female 查季节映射表(默认内置、可由 config 覆盖,找不到保留原值)。"""
|
||||
if gender != "female" or value in (None, ""):
|
||||
return value
|
||||
mapping = season_map if season_map is not None else _SEASON_FEMALE_MAP
|
||||
return mapping.get(str(value), value)
|
||||
|
||||
|
||||
def _template_gender(template_path: str) -> Optional[str]:
|
||||
@@ -230,13 +328,20 @@ def _fill_design_fields(router, spu_code: str, oss_code: str, cn_title: str, en_
|
||||
def _build_spu_row(spu: Dict[str, Any], spu_code: str,
|
||||
color: Optional[str] = None,
|
||||
fabric_headers: Optional[List[str]] = None,
|
||||
gender: Optional[str] = None) -> Dict[str, Any]:
|
||||
"""构造一行 SPU(固定字段:SKC货号=code、风格=休闲、商品产地=中国大陆、产地省份=广东省;多颜色时用色值列区分)。
|
||||
gender: Optional[str] = None,
|
||||
component_map: Optional[Dict[str, Any]] = None,
|
||||
season_map: Optional[Dict[str, Any]] = None,
|
||||
pattern_map: Optional[Dict[str, Any]] = None,
|
||||
oss_code: str = "") -> Dict[str, Any]:
|
||||
"""构造一行 SPU(固定字段:SKC货号=当前生成货号、风格=休闲、商品产地=中国大陆、产地省份=广东省;多颜色时用色值区分)。
|
||||
fabric 填「面料弹性」列(fabric_headers,如 SPU商品属性-面料弹性,检测到才填 spu.fabric)。
|
||||
component_1/2/3 按性别映射(gender=female 时查 _COMPONENT_FEMALE_MAP,男装/None 保留原值)。"""
|
||||
component_1/2/3 按性别映射(gender=female 时查成分映射表 component_map,男装/None 保留原值;
|
||||
material 字段不经过任何映射,原样透传)。
|
||||
season 按性别映射(gender=female 时查季节映射表 season_map,如「四季」→「ALL/全球/所有」)。
|
||||
pattern 按性别映射(gender=female 时空值查图案映射表 pattern_map,如空值→「卡通」)。"""
|
||||
row: Dict[str, Any] = {
|
||||
"基础信息-商品层级": "spu",
|
||||
"SKC货号": spu_code, # code 路由为 SKC货号(用户要求)
|
||||
"SKC货号": oss_code or spu_code, # SKC货号 = 当前生成货号 oss_code(无则回退 spu_code)
|
||||
"风格": "休闲", # style 路由为"休闲"(用户要求)
|
||||
"商品产地": "中国大陆", # 所有国家统一「中国大陆」,不读经营站点/不做字典匹配(用户要求)
|
||||
"产地省份": "广东省", # 新增:精确匹配「产地省份」列,统一填「广东省」(用户要求)
|
||||
@@ -247,7 +352,11 @@ def _build_spu_row(spu: Dict[str, Any], spu_code: str,
|
||||
for dbk, header in SPU_MAP.items():
|
||||
v = spu.get(dbk)
|
||||
if dbk in ("component_1", "component_2", "component_3"):
|
||||
v = _map_component(v, gender)
|
||||
v = _map_component(v, gender, component_map)
|
||||
elif dbk == "season":
|
||||
v = _map_season(v, gender, season_map)
|
||||
elif dbk == "pattern":
|
||||
v = _map_pattern(v, gender, pattern_map)
|
||||
if v not in (None, ""):
|
||||
row[header] = v
|
||||
fabric = spu.get("fabric")
|
||||
@@ -289,13 +398,62 @@ def _find_suggested_unit_headers(router) -> List[str]:
|
||||
return [str(k) for k in router.column_map if "建议售价单位" in str(k)]
|
||||
|
||||
|
||||
def _read_suggested_required(router, col: int) -> bool:
|
||||
"""读取「建议售价」列下方注意事项,判断是否必填。
|
||||
结合「非必填/必填」判断(不能只看「必填」两字):含「非必填」→非必填;否则含「必填」→必填。"""
|
||||
note = str(router.ws.cell(router.header_row + 1, col).value or "")
|
||||
if "非必填" in note:
|
||||
return False
|
||||
return "必填" in note
|
||||
def _read_range_values(ws, ref: str) -> Optional[set]:
|
||||
"""读取单元格/区域内的非空值集合;解析失败返回 None。"""
|
||||
try:
|
||||
cells = ws[ref]
|
||||
except Exception: # noqa: BLE001
|
||||
return None
|
||||
opts = []
|
||||
if isinstance(cells, (list, tuple)):
|
||||
for row in cells:
|
||||
for cell in row:
|
||||
if cell.value not in (None, ""):
|
||||
opts.append(str(cell.value).strip())
|
||||
else:
|
||||
if cells.value not in (None, ""):
|
||||
opts.append(str(cells.value).strip())
|
||||
return set(opts) if opts else None
|
||||
|
||||
|
||||
def _read_size_options(router) -> Optional[set]:
|
||||
"""读取「尺码」列的 dataValidation 下拉选项集合;无下拉/非 list/无值 返回 None。
|
||||
|
||||
仅作「尺码下拉受限时过滤 SKU 行」用:sku.size 不在下拉选项内则该 SKU 行跳过。
|
||||
支持下拉直接内联("S,M,L")、引用区域("=Sheet!$A$1:$A$5")、动态引用(INDIRECT(...))。
|
||||
动态引用无法解析(INDIRECT 指向空单元格/公式/跨表)→ 返回 None(不启用过滤,避免误杀全部 SKU 行)。"""
|
||||
import re
|
||||
from openpyxl.utils import get_column_letter
|
||||
col = router.column_map.get("尺码") or router.column_map.get("商品规格-尺码")
|
||||
if col is None:
|
||||
return None
|
||||
lf = get_column_letter(col)
|
||||
dvs = getattr(router.ws, "data_validations", None)
|
||||
if dvs is None:
|
||||
return None
|
||||
for dv in dvs.dataValidation:
|
||||
if getattr(dv, "type", "") != "list":
|
||||
continue
|
||||
if lf not in str(getattr(dv, "sqref", "")):
|
||||
continue
|
||||
f = (getattr(dv, "formula1", "") or "").strip()
|
||||
if not f:
|
||||
continue
|
||||
# 动态引用 INDIRECT(...):尝试解析引用的单元格/区域内容;无法解析 → 不过滤
|
||||
m = re.match(r"^=?INDIRECT\((.+)\)$", f, re.IGNORECASE)
|
||||
if m:
|
||||
opts = _read_range_values(router.ws, m.group(1).strip())
|
||||
return opts if opts else None
|
||||
# 引用区域(=Sheet!$A$1:$A$5 或 Sheet!$A$1:$A$5)
|
||||
ref = f[1:] if f.startswith("=") else f
|
||||
if ":" in ref:
|
||||
opts = _read_range_values(router.ws, ref)
|
||||
return opts if opts else None
|
||||
# 内联列表("S,M,L" / "S;M;L" / "S,M,L")
|
||||
sep = "," if "," in f else (";" if ";" in f else ",")
|
||||
opts = [x.strip() for x in f.split(sep) if x.strip()]
|
||||
return set(opts) if opts else None
|
||||
return None
|
||||
|
||||
|
||||
def _find_sku_category_headers(router) -> List[str]:
|
||||
@@ -313,22 +471,6 @@ def _find_sku_qty_unit_headers(router) -> List[str]:
|
||||
return [str(k) for k in router.column_map if "SKU数量单位" in str(k)]
|
||||
|
||||
|
||||
def _required_headers(router, headers) -> List[str]:
|
||||
"""过滤「非必填」列:读列头下一行备注(与建议售价同套路),备注显式写「非必填」才跳过。
|
||||
|
||||
SKU分类/SKU数量/SKU数量单位在本模板族属必填项(SKU分类备注「必填」,数量/单位为按规则填写),
|
||||
因此默认视为需填写,仅在列备注写明「非必填」时跳过。"""
|
||||
keep: List[str] = []
|
||||
for h in headers:
|
||||
col = router.column_map.get(h)
|
||||
if col is not None:
|
||||
note = str(router.ws.cell(router.header_row + 1, col).value or "")
|
||||
if "非必填" in note:
|
||||
continue
|
||||
keep.append(h)
|
||||
return keep
|
||||
|
||||
|
||||
def _build_sku_row(spu_code: str, sc: str, sk: Dict[str, Any], size: str, color: str,
|
||||
warehouses: List[str], markup_percent: float = 0.0,
|
||||
multi: bool = True, price_header: str = "申报价格-日本站",
|
||||
@@ -337,12 +479,13 @@ def _build_sku_row(spu_code: str, sc: str, sk: Dict[str, Any], size: str, color:
|
||||
sa_size_headers: Optional[List[str]] = None,
|
||||
suggested_price_ratio: float = 0.0,
|
||||
suggested_price_headers: Optional[List[str]] = None,
|
||||
suggested_required: Optional[Dict[str, bool]] = None,
|
||||
suggested_unit_headers: Optional[List[str]] = None,
|
||||
sku_category_headers: Optional[List[str]] = None,
|
||||
sku_qty_headers: Optional[List[str]] = None,
|
||||
sku_qty_unit_headers: Optional[List[str]] = None) -> Dict[str, Any]:
|
||||
"""构造一行 SKU(固定字段:SPU货号、SKC货号=sku.code、规格类型2、币种 CNY、发货仓1~N 及库存 200)。
|
||||
sku_qty_unit_headers: Optional[List[str]] = None,
|
||||
oss_code: str = "",
|
||||
size_options: Optional[set] = None) -> Dict[str, Any]:
|
||||
"""构造一行 SKU(固定字段:SPU货号、SKC货号=当前生成货号 oss_code、规格类型2、币种 CNY、发货仓1~N 及库存 200)。
|
||||
价格(price_headers 列,如 申报价格-美国站/日本站,模糊匹配到多个时全部填)= SKU.price × (1+markup/100),
|
||||
预先填好。建议售价(suggested_price_headers 列,模板「建议售价」必填时才填)= 申报价格 × (1+suggested_price_ratio/100),
|
||||
填了建议售价同时填「建议售价单位」=CNY。bust 填所有「胸围」列(bust_headers,如 基码表-胸围(cm)/胸围全围(cm),检测到才填)。
|
||||
@@ -351,7 +494,7 @@ def _build_sku_row(spu_code: str, sc: str, sk: Dict[str, Any], size: str, color:
|
||||
row: Dict[str, Any] = {
|
||||
"基础信息-商品层级": "sku",
|
||||
"SPU货号": spu_code,
|
||||
"SKC货号": sk.get("code") or sc, # SKC货号 = SKU 的 code(款号-颜色编码)
|
||||
"SKC货号": oss_code or spu_code, # SKC货号 = 当前生成货号 oss_code(无则回退 spu_code)
|
||||
"色值(主规格)": color,
|
||||
"规格类型2": "尺码", # 规格类型2 统一填「尺码」(不填 size 值)
|
||||
"币种": "CNY",
|
||||
@@ -381,11 +524,10 @@ def _build_sku_row(spu_code: str, sc: str, sk: Dict[str, Any], size: str, color:
|
||||
v = round(float(v) * (1 + markup_percent / 100), 2) # 申报价格 = price × (1+加价%)
|
||||
for h in price_headers:
|
||||
row[h] = v
|
||||
# 建议售价 = 申报价格 × (1+建议售价比例%);模板「建议售价」必填时才填,填了同时填单位 CNY
|
||||
# 建议售价 = 申报价格 × (1+建议售价比例%);统一必填,填了同时填单位 CNY
|
||||
if suggested_price_headers and suggested_price_ratio > 0:
|
||||
suggested = round(v * (1 + suggested_price_ratio / 100), 2)
|
||||
for h in suggested_price_headers:
|
||||
if (suggested_required or {}).get(h, True):
|
||||
row[h] = suggested
|
||||
for uh in suggested_unit_headers:
|
||||
row[uh] = "CNY"
|
||||
@@ -393,6 +535,8 @@ def _build_sku_row(spu_code: str, sc: str, sk: Dict[str, Any], size: str, color:
|
||||
if dbk == "size":
|
||||
if v in (None, ""):
|
||||
continue
|
||||
if size_options is not None and v not in size_options:
|
||||
return None # 尺码不在模板下拉框选项内,跳过该 SKU 行
|
||||
row[header] = v
|
||||
for h in sa_size_headers:
|
||||
row[h] = v
|
||||
@@ -443,13 +587,23 @@ SPU_MAP: Dict[str, str] = {
|
||||
"target_audience": "适用人群",
|
||||
"season": "季节",
|
||||
"is_transparent": "是否透明",
|
||||
"layout": "版型",
|
||||
"weaving_method": "织造方式",
|
||||
"printing_type": "印花类型",
|
||||
"fabric_texture_1": "面料纹理1",
|
||||
"fabric_weight_1": "面料克重1(g/m²)",
|
||||
"fabric_weight_unit_1": "面料克重1(g/m²)单位",
|
||||
"lining_texture": "里料纹理",
|
||||
"placket_type": "SPU商品属性-门襟类型",
|
||||
"sleeve_type": "SPU商品属性-袖型",
|
||||
"sleeve_length_type": "SPU商品属性-袖长",
|
||||
"breast_pad": "SPU商品属性-胸垫",
|
||||
"layout": "SPU商品属性-版型",
|
||||
"silhouette": "SPU商品属性-廓形",
|
||||
"length_type": "SPU商品属性-长度",
|
||||
"belt": "SPU商品属性-腰带",
|
||||
"occasion": "SPU商品属性-场合",
|
||||
"scene": "SPU商品属性-场景",
|
||||
"hemline_shape": "SPU商品属性-下摆形状",
|
||||
}
|
||||
|
||||
# db SKU 字段 -> 上传模板列名
|
||||
@@ -541,9 +695,11 @@ def _insert_product_block(
|
||||
fabric_headers: Optional[List[str]] = None,
|
||||
sa_size_headers: Optional[List[str]] = None,
|
||||
gender: Optional[str] = None,
|
||||
component_map: Optional[Dict[str, Any]] = None,
|
||||
season_map: Optional[Dict[str, Any]] = None,
|
||||
pattern_map: Optional[Dict[str, Any]] = None,
|
||||
suggested_price_ratio: float = 0.0,
|
||||
suggested_price_headers: Optional[List[str]] = None,
|
||||
suggested_required: Optional[Dict[str, bool]] = None,
|
||||
suggested_unit_headers: Optional[List[str]] = None,
|
||||
sku_category_headers: Optional[List[str]] = None,
|
||||
sku_qty_headers: Optional[List[str]] = None,
|
||||
@@ -572,13 +728,16 @@ def _insert_product_block(
|
||||
|
||||
color_col = router.resolve_col("色值(主规格)")
|
||||
block_rows: List[int] = []
|
||||
size_options = _read_size_options(router) # 尺码下拉框选项(sku.size 不在其中则跳过该 SKU 行)
|
||||
|
||||
if spu_per_color:
|
||||
# 单 SPU 多色:1 个 SPU 行(无色值,SPU 级信息由 _fill_design_fields 填充)
|
||||
# + 全部颜色尺码 SKU 行(色值在 SKU 行区分)
|
||||
block_rows.append(router.insert(
|
||||
_build_spu_row(spu, spu_code, fabric_headers=fabric_headers,
|
||||
gender=gender),
|
||||
gender=gender, component_map=component_map,
|
||||
season_map=season_map, pattern_map=pattern_map,
|
||||
oss_code=oss_code),
|
||||
match="exact",
|
||||
))
|
||||
for ci, (sc, skus) in enumerate(skus_by_color):
|
||||
@@ -588,20 +747,21 @@ def _insert_product_block(
|
||||
# 该颜色全部尺码 SKU(SKU 行 SPU货号/SKU货号=spu_code,色值区分)
|
||||
for i, sk in enumerate(skus):
|
||||
size = sk.get("size") or f"{i+1}"
|
||||
block_rows.append(router.insert(
|
||||
_build_sku_row(spu_code, sc, sk, size, color, warehouses,
|
||||
row = _build_sku_row(spu_code, sc, sk, size, color, warehouses,
|
||||
markup_percent=markup_percent, multi=True,
|
||||
bust_headers=bust_headers, price_headers=price_headers,
|
||||
sa_size_headers=sa_size_headers,
|
||||
suggested_price_ratio=suggested_price_ratio,
|
||||
suggested_price_headers=suggested_price_headers,
|
||||
suggested_required=suggested_required,
|
||||
|
||||
suggested_unit_headers=suggested_unit_headers,
|
||||
sku_category_headers=sku_category_headers,
|
||||
sku_qty_headers=sku_qty_headers,
|
||||
sku_qty_unit_headers=sku_qty_unit_headers),
|
||||
spu_code=spu_code, match="exact",
|
||||
))
|
||||
sku_qty_unit_headers=sku_qty_unit_headers,
|
||||
oss_code=oss_code, size_options=size_options)
|
||||
if row is None:
|
||||
continue
|
||||
block_rows.append(router.insert(row, spu_code=spu_code, match="exact"))
|
||||
|
||||
# 轮播图:首色 SKU 行轮播图1 = 生成首图;SKU 行按色值填 db url/生成图
|
||||
if ci == 0 and images:
|
||||
@@ -616,26 +776,30 @@ def _insert_product_block(
|
||||
# 单 SPU + 多颜色变体:1 个 SPU 行(无色值)+ 所有颜色所有尺码 SKU 行(色值区分)
|
||||
block_rows.append(router.insert(
|
||||
_build_spu_row(spu, spu_code, fabric_headers=fabric_headers,
|
||||
gender=gender), match="exact"))
|
||||
gender=gender, component_map=component_map,
|
||||
season_map=season_map, pattern_map=pattern_map,
|
||||
oss_code=oss_code), match="exact"))
|
||||
multi_variant = len(skus_by_color) > 1
|
||||
for ci, (sc, skus) in enumerate(skus_by_color):
|
||||
first = skus[0]
|
||||
color = first.get("color") or sc
|
||||
for i, sk in enumerate(skus):
|
||||
size = sk.get("size") or f"{i+1}"
|
||||
block_rows.append(router.insert(
|
||||
_build_sku_row(spu_code, sc, sk, size, color, warehouses,
|
||||
row = _build_sku_row(spu_code, sc, sk, size, color, warehouses,
|
||||
markup_percent=markup_percent, multi=multi_variant,
|
||||
bust_headers=bust_headers, price_headers=price_headers,
|
||||
sa_size_headers=sa_size_headers,
|
||||
suggested_price_ratio=suggested_price_ratio,
|
||||
suggested_price_headers=suggested_price_headers,
|
||||
suggested_required=suggested_required,
|
||||
|
||||
suggested_unit_headers=suggested_unit_headers,
|
||||
sku_category_headers=sku_category_headers,
|
||||
sku_qty_headers=sku_qty_headers,
|
||||
sku_qty_unit_headers=sku_qty_unit_headers),
|
||||
))
|
||||
sku_qty_unit_headers=sku_qty_unit_headers,
|
||||
oss_code=oss_code, size_options=size_options)
|
||||
if row is None:
|
||||
continue
|
||||
block_rows.append(router.insert(row))
|
||||
sku_imgs = [x for x in (images[1:] + images[:1]) if x][:4] if (ci == 0 and images) else []
|
||||
_fill_sku_carousel(router, spu_code, color, color_col, first, sku_imgs)
|
||||
|
||||
@@ -674,6 +838,9 @@ def export_product(
|
||||
append_to: str = "",
|
||||
markup_percent: float = 0.0,
|
||||
suggested_price_ratio: float = 0.0,
|
||||
component_map: Optional[Dict[str, Any]] = None,
|
||||
season_map: Optional[Dict[str, Any]] = None,
|
||||
pattern_map: Optional[Dict[str, Any]] = None,
|
||||
) -> Path:
|
||||
"""生成商品上传"已填写"模板(支持多产品合并到同一文件)。
|
||||
|
||||
@@ -707,11 +874,10 @@ def export_product(
|
||||
gender = _template_gender(template_path) # 类目含「男」→male /「女」→female(成分值映射用)
|
||||
suggested_price_headers = _find_suggested_price_headers(router) # 建议售价列(不含单位)
|
||||
suggested_unit_headers = _find_suggested_unit_headers(router) # 建议售价单位列
|
||||
suggested_required = {h: _read_suggested_required(router, router.column_map[h])
|
||||
for h in suggested_price_headers} # 各建议售价列是否必填(结合非必填/必填判断)
|
||||
sku_category_headers = _required_headers(router, _find_sku_category_headers(router)) # SKU分类列(非必填才跳过)
|
||||
sku_qty_headers = _required_headers(router, _find_sku_qty_headers(router)) # SKU数量列
|
||||
sku_qty_unit_headers = _required_headers(router, _find_sku_qty_unit_headers(router)) # SKU数量单位列
|
||||
|
||||
sku_category_headers = _find_sku_category_headers(router) # SKU分类列(存在即填默认值「单品」)
|
||||
sku_qty_headers = _find_sku_qty_headers(router) # SKU数量列(存在即填 1)
|
||||
sku_qty_unit_headers = _find_sku_qty_unit_headers(router) # SKU数量单位列(存在即填「件」)
|
||||
_insert_product_block(router, db_path, spu_code, sku_code,
|
||||
warehouses, price_headers,
|
||||
markup_percent=markup_percent, images=images,
|
||||
@@ -724,9 +890,12 @@ def export_product(
|
||||
fabric_headers=fabric_headers,
|
||||
sa_size_headers=sa_size_headers,
|
||||
gender=gender,
|
||||
component_map=component_map,
|
||||
season_map=season_map,
|
||||
pattern_map=pattern_map,
|
||||
suggested_price_ratio=suggested_price_ratio,
|
||||
suggested_price_headers=suggested_price_headers,
|
||||
suggested_required=suggested_required,
|
||||
|
||||
suggested_unit_headers=suggested_unit_headers,
|
||||
sku_category_headers=sku_category_headers,
|
||||
sku_qty_headers=sku_qty_headers,
|
||||
@@ -748,6 +917,9 @@ def export_products(
|
||||
out_path: str,
|
||||
markup_percent: float = 0.0,
|
||||
suggested_price_ratio: float = 0.0,
|
||||
component_map: Optional[Dict[str, Any]] = None,
|
||||
season_map: Optional[Dict[str, Any]] = None,
|
||||
pattern_map: Optional[Dict[str, Any]] = None,
|
||||
) -> Path:
|
||||
"""批量合并导出:所有产品一次性写入同一模板,只打开/保存一次。
|
||||
|
||||
@@ -768,11 +940,10 @@ def export_products(
|
||||
gender = _template_gender(template_path) # 类目含「男」→male /「女」→female(成分值映射用)
|
||||
suggested_price_headers = _find_suggested_price_headers(router) # 建议售价列(不含单位)
|
||||
suggested_unit_headers = _find_suggested_unit_headers(router) # 建议售价单位列
|
||||
suggested_required = {h: _read_suggested_required(router, router.column_map[h])
|
||||
for h in suggested_price_headers} # 各建议售价列是否必填(结合非必填/必填判断)
|
||||
sku_category_headers = _required_headers(router, _find_sku_category_headers(router)) # SKU分类列(非必填才跳过)
|
||||
sku_qty_headers = _required_headers(router, _find_sku_qty_headers(router)) # SKU数量列
|
||||
sku_qty_unit_headers = _required_headers(router, _find_sku_qty_unit_headers(router)) # SKU数量单位列
|
||||
|
||||
sku_category_headers = _find_sku_category_headers(router) # SKU分类列(存在即填默认值「单品」)
|
||||
sku_qty_headers = _find_sku_qty_headers(router) # SKU数量列(存在即填 1)
|
||||
sku_qty_unit_headers = _find_sku_qty_unit_headers(router) # SKU数量单位列(存在即填「件」)
|
||||
for r in products:
|
||||
try:
|
||||
_insert_product_block(
|
||||
@@ -793,9 +964,12 @@ def export_products(
|
||||
fabric_headers=fabric_headers,
|
||||
sa_size_headers=sa_size_headers,
|
||||
gender=gender,
|
||||
component_map=component_map,
|
||||
season_map=season_map,
|
||||
pattern_map=pattern_map,
|
||||
suggested_price_ratio=suggested_price_ratio,
|
||||
suggested_price_headers=suggested_price_headers,
|
||||
suggested_required=suggested_required,
|
||||
|
||||
suggested_unit_headers=suggested_unit_headers,
|
||||
sku_category_headers=sku_category_headers,
|
||||
sku_qty_headers=sku_qty_headers,
|
||||
|
||||
@@ -138,7 +138,6 @@ def validate_brief(b: Dict[str, Any]) -> Dict[str, Any]:
|
||||
b.setdefault("color_palette", "balanced modern palette")
|
||||
b.setdefault("composition", "centered emblem with balanced negative space")
|
||||
b.setdefault("concept", b.get("topic", ""))
|
||||
b.setdefault("negative_prompt", "")
|
||||
b.setdefault("image_prompt", "")
|
||||
b.setdefault("wearable_prompt", "")
|
||||
b.setdefault("composite_prompt", "")
|
||||
|
||||
@@ -437,7 +437,15 @@ async def _ensure_logged_in(page: Page, search_url: str, login_wait: bool = Fals
|
||||
async def scrape(keyword: str, count: int, headless: bool = False,
|
||||
proxy: str | None = None,
|
||||
cdp_url: str | None = None,
|
||||
login_wait: bool = False) -> set[str]:
|
||||
login_wait: bool = False,
|
||||
known_urls: set[str] | None = None) -> set[str]:
|
||||
"""按关键词滚动采集 Pinterest 图片 URL。
|
||||
|
||||
known_urls:该关键词历史已采集 URL 集合(跨运行持久化,见 scraper.scrape_pinterest)。
|
||||
滚动时命中 known_urls 的旧图直接跳过(不计入 count),从而在重复搜索同一关键词时
|
||||
自动往下拉采集新图,而不是反复下载顶部旧图。
|
||||
"""
|
||||
known = set(known_urls or [])
|
||||
imgs_url: set[str] = set()
|
||||
async with async_playwright() as p:
|
||||
if cdp_url:
|
||||
@@ -506,6 +514,8 @@ async def scrape(keyword: str, count: int, headless: bool = False,
|
||||
for s in srcset.split(",")
|
||||
]
|
||||
max_url = max(candidates, key=lambda x: x[1])[0]
|
||||
if max_url in known:
|
||||
continue # 已采集过的旧图 → 跳过(不计入 count,驱动往下拉)
|
||||
imgs_url.add(max_url)
|
||||
|
||||
# 模拟人工: 鼠标平滑移动到随机位置 + 分段连续滚动,
|
||||
|
||||
@@ -3,11 +3,15 @@
|
||||
用法:
|
||||
from pinterest_scraper.scraper import scrape_pinterest
|
||||
files = scrape_pinterest("vintage 70s", count=40, save_dir="output/pinterest_ref/US/vintage_70s")
|
||||
|
||||
增量续采:每个 save_dir 下维护 .collected_urls.json(该关键词历史已采集 URL 集合)。
|
||||
重复搜索同一关键词时自动跳过旧图、往下拉采集新图,避免反复下载顶部重复图片。
|
||||
"""
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
from typing import List, Optional
|
||||
from typing import List, Optional, Set
|
||||
|
||||
from pinterest_scraper.pinterest_image_capture import (
|
||||
detect_proxy,
|
||||
@@ -17,6 +21,27 @@ from pinterest_scraper.pinterest_image_capture import (
|
||||
)
|
||||
|
||||
|
||||
def _load_collected_urls(save_dir: str) -> Set[str]:
|
||||
"""读该关键词历史已采集 URL(.collected_urls.json),不存在/损坏返回空集。"""
|
||||
p = Path(save_dir) / ".collected_urls.json"
|
||||
if not p.exists():
|
||||
return set()
|
||||
try:
|
||||
data = json.loads(p.read_text(encoding="utf-8"))
|
||||
return {str(u) for u in data if str(u).strip()}
|
||||
except Exception: # noqa: BLE001
|
||||
return set()
|
||||
|
||||
|
||||
def _save_collected_urls(save_dir: str, urls: Set[str]) -> None:
|
||||
"""把已采集 URL 集合持久化到 .collected_urls.json(供下次增量续采)。"""
|
||||
try:
|
||||
p = Path(save_dir) / ".collected_urls.json"
|
||||
p.write_text(json.dumps(sorted(urls), ensure_ascii=False), encoding="utf-8")
|
||||
except Exception as e: # noqa: BLE001
|
||||
print(f"[pinterest] 已采集 URL 持久化失败: {e}")
|
||||
|
||||
|
||||
def scrape_pinterest(keyword: str, count: int = 40, save_dir: Optional[str] = None,
|
||||
proxy: Optional[str] = None, headless: bool = False,
|
||||
cdp_url: Optional[str] = None,
|
||||
@@ -27,6 +52,8 @@ def scrape_pinterest(keyword: str, count: int = 40, save_dir: Optional[str] = No
|
||||
- login_wait=False(默认):运行时检测到未登录时不阻塞,直接返回空列表(由调用方跳过并告警);
|
||||
login_wait=True:弹出 Chrome 窗口等待手动登录一次,登录态缓存在
|
||||
pinterest_scraper/.chrome_session,之后自动复用。
|
||||
- 增量续采:读取 save_dir/.collected_urls.json 历史已采集 URL,滚动时跳过旧图往下拉,
|
||||
只下载新图,并把新 URL 合并写回(种子词用尽复用同一关键词时自动采集更靠后的新图)。
|
||||
"""
|
||||
# 代理解析:显式传入 > 自动探测 > 直连
|
||||
if proxy is None:
|
||||
@@ -41,12 +68,22 @@ def scrape_pinterest(keyword: str, count: int = 40, save_dir: Optional[str] = No
|
||||
os.makedirs(out, exist_ok=True)
|
||||
print(f"[pinterest] 关键词: {keyword} | 数量: {count} | 保存目录: {out}")
|
||||
|
||||
imgs_url = asyncio.run(scrape(keyword, count, headless, proxy, cdp_url, login_wait))
|
||||
# 跨运行已采集 URL:重复搜索同一关键词时跳过旧图、往下拉续采
|
||||
known = _load_collected_urls(out)
|
||||
if known:
|
||||
print(f"[pinterest] 该关键词已采集过 {len(known)} 个 URL,将跳过旧图往下拉续采新图")
|
||||
|
||||
imgs_url = asyncio.run(scrape(keyword, count, headless, proxy, cdp_url, login_wait,
|
||||
known_urls=known))
|
||||
if not imgs_url:
|
||||
print(f"[pinterest] 未收集到图片(可能未登录或搜索无结果): {keyword}")
|
||||
print(f"[pinterest] 未收集到新图片(可能未登录、搜索无结果或该关键词已无新图): {keyword}")
|
||||
return []
|
||||
asyncio.run(download_all(imgs_url, out, proxy))
|
||||
|
||||
# 合并本次新采集 URL 到持久化集合,供下次增量续采
|
||||
known |= imgs_url
|
||||
_save_collected_urls(out, known)
|
||||
|
||||
files = [str(p) for p in sorted(Path(out).iterdir()) if p.is_file()]
|
||||
print(f"[pinterest] 完成,共下载 {len(files)} 张图片: {keyword}")
|
||||
print(f"[pinterest] 完成,本次新增 {len(imgs_url)} 张图片(累计已采集 {len(known)} 个 URL): {keyword}")
|
||||
return files
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
# 韩国审美与风格-配色规则(prompts/KR/aesthetics.yaml)
|
||||
style_hint: "Trendy K-pop street culture, Seoul neon nightlife, Y2K retro-futurism, cute-hip aesthetic, bold typography with hangul accents. Prefer: K-pop, Seoul Neon, Y2K, Hanbok Pattern, Korean Food, K-Street Fashion, Jeju Nature, Retro Korea."
|
||||
|
||||
extra_style_rules:
|
||||
- keywords: [kpop, idol, concert, fan, lightstick, music]
|
||||
art_style: "kpop idol badge illustration"
|
||||
color_palette: "purple, pink, black, silver"
|
||||
- keywords: [seoul, neon, night, hongdae, gangnam, city]
|
||||
art_style: "seoul neon night street illustration"
|
||||
color_palette: "neon pink, electric blue, black, cyan"
|
||||
- keywords: [y2k, retro, futuristic, chrome, futuristic]
|
||||
art_style: "y2k retro-futurism graphic"
|
||||
color_palette: "silver, pink, light blue, purple"
|
||||
- keywords: [hanbok, traditional, dancheong, palace, royal]
|
||||
art_style: "hanbok dancheong pattern illustration"
|
||||
color_palette: "crimson red, royal blue, gold, white"
|
||||
- keywords: [kimchi, bibimbap, tteokbokki, kimbap, bulgogi, food]
|
||||
art_style: "playful korean food illustration"
|
||||
color_palette: "chili red, golden yellow, leaf green, cream"
|
||||
- keywords: [tiger, kumiho, fox, crane, magpie, folklore, animal]
|
||||
art_style: "korean folklore animal illustration"
|
||||
color_palette: "orange, white, black, red"
|
||||
- keywords: [cherry blossom, sakura, jinhae, spring, flower]
|
||||
art_style: "korean cherry blossom illustration"
|
||||
color_palette: "blossom pink, white, pale green, soft gray"
|
||||
- keywords: [jeju, island, hallasan, ocean, coast]
|
||||
art_style: "jeju island nature illustration"
|
||||
color_palette: "ocean blue, sea green, cream, volcanic black"
|
||||
- keywords: [hangul, korean letter, typography, calligraphy, text]
|
||||
art_style: "bold hangul typography design"
|
||||
color_palette: "black, white, red, yellow"
|
||||
- keywords: [hanok, gyeongbokgung, temple, architecture, traditional house]
|
||||
art_style: "korean hanok architecture illustration"
|
||||
color_palette: "wood brown, roof gray, red, white"
|
||||
- keywords: [mask, talchum, dance, festival, folk]
|
||||
art_style: "korean mask dance folk illustration"
|
||||
color_palette: "red, yellow, black, white"
|
||||
- keywords: [cafe, coffee, bingsu, dessert, sweet, drink]
|
||||
art_style: "korean cafe dessert illustration"
|
||||
color_palette: "cream white, coffee brown, pink, mint"
|
||||
- keywords: [streetwear, street fashion, k-fashion, hip, style]
|
||||
art_style: "korean street fashion illustration"
|
||||
color_palette: "black, white, neon green, red"
|
||||
- keywords: [taekwondo, martial arts, sport, fight]
|
||||
art_style: "taekwondo martial art silhouette graphic"
|
||||
color_palette: "black, white, red, blue"
|
||||
- keywords: [moon, star, night, dreamy, galaxy]
|
||||
art_style: "korean dreamy night illustration"
|
||||
color_palette: "deep blue, star gold, silver, purple"
|
||||
- keywords: [zodiac, tiger year, new year, year of]
|
||||
art_style: "korean zodiac animal illustration"
|
||||
color_palette: "red, gold, orange, white"
|
||||
- keywords: [mugunghwa, rose of sharon, korean flower, floral]
|
||||
art_style: "korean national flower illustration"
|
||||
color_palette: "pink, white, green, yellow"
|
||||
- keywords: [ginkgo, autumn, maple, fall, leaf]
|
||||
art_style: "korean autumn leaves illustration"
|
||||
color_palette: "ginkgo yellow, maple red, brown, warm orange"
|
||||
- keywords: [pattern, geometric, traditional pattern, motif]
|
||||
art_style: "korean traditional pattern design"
|
||||
color_palette: "red, blue, gold, white"
|
||||
- keywords: [drum, janggu, samulnori, instrument, music traditional]
|
||||
art_style: "korean traditional music illustration"
|
||||
color_palette: "red, gold, black, white"
|
||||
- keywords: [seoul skyline, tower, landmark, namsan, han river]
|
||||
art_style: "seoul landmark skyline illustration"
|
||||
color_palette: "night blue, neon pink, white, gold"
|
||||
- keywords: [busan, haeundae, sea, beach, fishing village]
|
||||
art_style: "korean coastal town illustration"
|
||||
color_palette: "sea blue, sandy beige, coral, white"
|
||||
- keywords: [hanbok character, cute, mascot, chibi, doll]
|
||||
art_style: "cute hanbok mascot illustration"
|
||||
color_palette: "pastel pink, mint, cream, red"
|
||||
- keywords: [lantern, lotus, temple lantern, buddhist festival]
|
||||
art_style: "korean lotus lantern illustration"
|
||||
color_palette: "gold, crimson, white, green"
|
||||
|
||||
# 韩国常见侵权盲区(按国家隔离)
|
||||
extra_blacklist:
|
||||
# —— K-pop 偶像团体 / 组合 ——
|
||||
- bts
|
||||
- blackpink
|
||||
- exo
|
||||
- twice
|
||||
- seventeen
|
||||
- "stray kids"
|
||||
- enhypen
|
||||
- itzy
|
||||
- aespa
|
||||
- ive
|
||||
- "le sserafim"
|
||||
- nct
|
||||
- "red velvet"
|
||||
- newjeans
|
||||
- "super junior"
|
||||
- shinee
|
||||
- "big bang"
|
||||
- tvxq
|
||||
- "girl's generation"
|
||||
- snsd
|
||||
- mamamoo
|
||||
- "(g)i-dle"
|
||||
- txt
|
||||
- got7
|
||||
- monsta x
|
||||
- "black label"
|
||||
# —— 粉丝名(专属名称)——
|
||||
- army
|
||||
- blink
|
||||
- once
|
||||
- nctzen
|
||||
- midzy
|
||||
- carat
|
||||
- stay
|
||||
# —— 真实艺人(肖像权)——
|
||||
- iu
|
||||
- lisa
|
||||
- jennie
|
||||
- jisoo
|
||||
- rose
|
||||
- jungkook
|
||||
- jimin
|
||||
- v
|
||||
- suga
|
||||
- rm
|
||||
- j-hope
|
||||
- "cha eun-woo"
|
||||
- "lee min-ho"
|
||||
- "kim soo-hyun"
|
||||
- "song hye-kyo"
|
||||
- "bae suzy"
|
||||
- "park bo-gum"
|
||||
- hyun bin
|
||||
- "kim tae-hee"
|
||||
- "yoo jae-suk"
|
||||
- psy
|
||||
# —— 品牌 ——
|
||||
- samsung
|
||||
- "lg electronics"
|
||||
- hyundai
|
||||
- kia
|
||||
- naver
|
||||
- kakao
|
||||
- bibigo
|
||||
- ottogi
|
||||
- nongshim
|
||||
- lotte
|
||||
- "tous les jours"
|
||||
- "paris baguette"
|
||||
- innisfree
|
||||
- amorepacific
|
||||
- "line friends"
|
||||
- "kakao friends"
|
||||
# —— IP / 版权 ——
|
||||
- "line friends"
|
||||
- "kakao friends"
|
||||
- pororo
|
||||
- tayo
|
||||
- larva
|
||||
- pinkfong
|
||||
- "baby shark"
|
||||
- pengsoo
|
||||
- cocomong
|
||||
- "robocar poli"
|
||||
- "squid game"
|
||||
@@ -0,0 +1,10 @@
|
||||
# 韩国专属补充指令
|
||||
- 设计口吻:K-pop 街头文化活力、首尔霓虹夜生活、Y2K 复古未来、可爱甜酷审美、大胆排印与韩文字点缀。
|
||||
- 合规重点(韩国特有):
|
||||
* 偶像团体(BTS、BLACKPINK、EXO、TWICE、NewJeans、SEVENTEEN、Stray Kids、ENHYPEN、ITZY、aespa、IVE、LE SSERAFIM、NCT、Red Velvet 等)名称、logo、应援色、粉丝名(ARMY、BLINK、ONCE 等)与成员肖像禁止。
|
||||
* 真实艺人(IU、Lisa、Jennie、Jisoo、Rosé、Jungkook、V、Jimin、Suga、RM、J-Hope、차은우 车银优、이민호 李敏镐、김수현 金秀贤、송혜교 宋慧乔、배수지 裴秀智 等)肖像权。
|
||||
* 品牌(Samsung、LG、Hyundai、Kia、Naver、Kakao、Bibigo、Ottogi、Nongshim、Lotte、Tous Les Jours、Paris Baguette、Innisfree、Line Friends、Kakao Friends)logo 与名称禁止。
|
||||
* 版权 IP:Line Friends、Kakao Friends、뽀로로(Pororo)、타요(Tayo the Little Bus)、라바(Larva)、핑크퐁(Pinkfong) Baby Shark、펭수(Pengsoo) 等角色禁止。
|
||||
- 可做"首尔霓虹夜景 / 原创 K-pop 风格角色 / 韩式传统图案(한복、단청、매화)/ 韩国美食 / 韩国街头潮流 / 济州自然"等原创设计。
|
||||
- 文字规则:韩文或英文短句可加可不加,与印花适配即可(如 SEOUL、K-문화、사랑해);任何文字严禁政治/宗教/仇恨/暴力/性/品牌/商标/真实人物姓名等敏感内容。
|
||||
- Return JSON 输出格式必须严格遵循系统提示词中的 schema,不要输出任何额外文字。
|
||||
@@ -0,0 +1,19 @@
|
||||
You are a POD T-shirt design analyst working in CUSTOM-REFERENCE mode. You are given ONE existing bestseller product photo — an on-model shot or a flat-lay shot of a printed garment. Your job:
|
||||
1. Locate the printed artwork on the garment and judge whether that PRINT can inspire a new T-shirt design (ignore the shirt itself, the model, the background, watermarks and photo quality — judge only the printed artwork).
|
||||
2. Write an ORIGINAL design brief that keeps the bestseller's general vibe (theme, style genre, era, mood) but is a clearly different, non-infringing work.
|
||||
|
||||
RULES:
|
||||
0. REFERENCE HANDLING — the attached photo is a product mockup of an existing bestseller, not an artwork file. Use it ONLY to identify the printed artwork and distill its appeal into generic style keywords (retro, y2k, minimal, grunge, boho, kawaii, western, cottagecore, vintage cartoon...). Never reproduce, trace, rearrange, recolor or closely imitate the print, its layout, characters or text.
|
||||
1. SAME SUBJECT FAMILY, NEW EXECUTION — the new design must belong to the same visual family as the bestseller print so a buyer would instantly see they are "same style, different shirt". LOCK these elements to the bestseller's: (a) general subject category (e.g., human/animal figure silhouette, celestial object, floral, vehicle, typography-led...), (b) art technique (e.g., grunge ink silhouette, clean line art, watercolor, distressed collage...), (c) palette (monochrome / muted / neon...). VARY these: the exact subject, the pose, the composition and layout, and any decorative framing. The result must be clearly original — no traced or rearranged reuse of the reference artwork — while staying recognizably in the same genre.
|
||||
2. IP SCREENING — if the bestseller print contains brand logos, trademarks, slogans, mascots, copyrighted characters (including stylized or silhouette versions), real people/celebrities, movie/game/anime/band IP, or lyrics, do NOT imitate them; swap in fully generic equivalents (e.g., an unnamed cartoon animal instead of a recognizable mascot). Also avoid politics, religion, violence, sexual content, alcohol, drugs, gambling, flags, death/occult themes.
|
||||
3. FORM — ONE clear central subject with strong graphic composition; print-ready standalone artwork. ANY colors are fine — rich palettes, gradients and detailed shading are all acceptable. Because the reference is a product photo, explicitly exclude the garment and the photo itself: never describe shirts, models, hangers, scenes or backgrounds. Photographic elements in the print may be re-rendered as detailed full-color illustrations, retro badges or vintage stickers.
|
||||
4. TEXT — short ORIGINAL English wording (1-6 words) allowed; wrap exact words in double quotes and demand exact spelling; integrate into composition. Never reuse, translate or near-duplicate the bestseller print's wording; no brand/band/movie names or famous slogans. When unsure, omit.
|
||||
|
||||
suitable_for_print: judge ONLY the printed artwork extracted from the bestseller photo. DEFAULT TRUE for graphics, illustrations, badges, vector art, typography prints, or prints visible on mockups. FALSE only for: blank garments with no artwork, prints that are indiscernible due to watermark, blur or very low quality, pure subjectless photo scenery, memes/screenshots/collages with no usable motif. Even when FALSE, still fill all fields so downstream never breaks.
|
||||
|
||||
image_prompt = two parts:
|
||||
1) mandatory opener: "First, carefully examine the printed artwork on the garment in the attached photo: zoom in mentally on the print area, identify its subject, technique, palette and layout, and base the new design on THOSE observed traits. Ignore the model, background and photo quality. Then: use the attached bestseller product photo only as loose inspiration for overall mood, theme, era and style genre — do NOT reproduce, trace, rearrange, recolor or closely imitate its printed artwork, characters, layout or text, and do NOT render a shirt, garment, model, hanger, photo scene, product mockup or background of any kind."
|
||||
2) the new design: [same subject family as observed] + [same technique and palette family] + [changed exact subject, pose, composition and framing] + [mood], plus quoted original text if used. NEVER mention shirts, apparel, models, scenes, sizes, backgrounds or watermarks — placement is handled externally. Before output, verify the new design shares the locked elements (subject category, technique, palette) with the observed print; if not, revise it.
|
||||
|
||||
OUTPUT — ONLY valid JSON, no fences:
|
||||
{"designs":[{"suitable_for_print":<bool>,"image_prompt":"<str>"}]}
|
||||
@@ -0,0 +1 @@
|
||||
Analyze the attached bestseller product photo, locate its printed artwork, and produce one ORIGINAL T-shirt print design brief that keeps its general vibe without copying its printed artwork.
|
||||
@@ -42,9 +42,5 @@ image_prompt = two parts:
|
||||
NEVER mention shirts, apparel, models, scenes, sizes, backgrounds or
|
||||
watermarks — placement is handled externally.
|
||||
|
||||
negative_prompt: copy of reference artwork, likenesses, characters, logos,
|
||||
trademarks, watermark, photorealistic shirt/product mockups, busy background;
|
||||
add garbled-lettering terms only if your design includes text.
|
||||
|
||||
OUTPUT — ONLY valid JSON, no fences:
|
||||
{"designs":[{"suitable_for_print":<bool>,"negative_prompt":"<str>","image_prompt":"<str>"}]}
|
||||
{"designs":[{"suitable_for_print":<bool>,"image_prompt":"<str>"}]}
|
||||
@@ -346,6 +346,13 @@ class TemplateRouter:
|
||||
return self.header_map[key_s]
|
||||
if key_s in self.column_map:
|
||||
return self.column_map[key_s]
|
||||
# 兼容「SPU商品属性-袖型」↔「袖型」列名差异:不同模板对同一属性列命名不同(带/不带分组前缀)
|
||||
if key_s.startswith("SPU商品属性-"):
|
||||
bare = key_s[len("SPU商品属性-"):]
|
||||
if bare in self.column_map:
|
||||
return self.column_map[bare]
|
||||
if bare in self.header_map:
|
||||
return self.header_map[bare]
|
||||
if re.fullmatch(r"[A-Za-z]{1,3}", key_s):
|
||||
return column_index_from_string(key_s.upper())
|
||||
norm = _UNIT_SUFFIX.sub("", key_s).strip()
|
||||
|
||||
@@ -31,9 +31,7 @@ import yaml
|
||||
|
||||
from graph.agent import run_country
|
||||
|
||||
COUNTRIES = ["US", "GB", "JP", "AU", "MX", "DE", "BR", "SA", "PL", "ES", "IT", "CA"]
|
||||
# LLM 只适配 OpenAI 兼容协议:openai(真调用,可在下方配置自定义模型/URL/Key)/ mock(无 key 演示占位)
|
||||
PROVIDERS = ["openai", "mock"]
|
||||
COUNTRIES = ["US", "GB", "JP", "AU", "MX", "DE", "BR", "SA", "PL", "ES", "IT", "CA", "KR"]
|
||||
|
||||
|
||||
def resource_root() -> Path:
|
||||
@@ -389,6 +387,10 @@ def run_pinterest_pipeline(countries, provider, log_q, spu_tasks=None, spu_count
|
||||
custom_image_dir 非空 → 自定义图片模式:不搜索不采集,把该文件夹有效图片直接送多模态分析,
|
||||
沿用 Pinterest 后续所有步骤;数量硬校验(有效图片数 ≥ 选品清单总数)由 run_pinterest_ref 执行。
|
||||
"""
|
||||
if not spu_tasks:
|
||||
log_q.put(("log", "[UI] Pinterest/自定义模式必须通过「+添加选品」添加任务清单后才能运行\n"))
|
||||
log_q.put(("error", None))
|
||||
return
|
||||
config = load_config()
|
||||
config["seed_provider"] = provider
|
||||
apply_openai_cfg(config, oai)
|
||||
@@ -498,8 +500,10 @@ def _pack_cache(country: str, log_q=None) -> str:
|
||||
class App(tk.Tk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.title("POD 热点抓取 Agent")
|
||||
self.geometry("920x660")
|
||||
self.title("POD 智能设计 Agent")
|
||||
self.geometry("1280x840")
|
||||
self.minsize(1100, 720)
|
||||
self.configure(bg="#F2F4F8")
|
||||
self._q = queue.Queue()
|
||||
self._busy = False
|
||||
self._results = {}
|
||||
@@ -513,151 +517,249 @@ class App(tk.Tk):
|
||||
except Exception as e: # noqa: BLE001
|
||||
LOG_FILE = None
|
||||
print(f"[UI] 日志文件创建失败(不影响运行): {e}")
|
||||
self._setup_style()
|
||||
self._build_ui()
|
||||
self._load_cache()
|
||||
self.after(100, self._poll)
|
||||
|
||||
def _default_provider(self) -> str:
|
||||
"""默认模式:config.yaml llm_screen.provider(用户已配 key → openai 默认)。"""
|
||||
# ---------- 主题样式 ----------
|
||||
def _setup_style(self):
|
||||
style = ttk.Style(self)
|
||||
try:
|
||||
return "openai" if (load_config().get("llm_screen") or {}).get("provider") == "openai" else "mock"
|
||||
except Exception:
|
||||
return "mock"
|
||||
style.theme_use("clam")
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
# 主色板
|
||||
self._C_PRIMARY = "#2563EB" # 主蓝
|
||||
self._C_PRIMARY_DK = "#1D4ED8" # 主蓝深
|
||||
self._C_ACCENT = "#F59E0B" # 强调橙
|
||||
self._C_BG = "#F2F4F8" # 窗口背景
|
||||
self._C_CARD = "#FFFFFF" # 卡片背景
|
||||
self._C_BORDER = "#DCE1EA" # 边框
|
||||
self._C_TEXT = "#1F2937" # 主文字
|
||||
self._C_SUB = "#6B7280" # 次要文字
|
||||
self._C_OK = "#16A34A" # 成功绿
|
||||
self._C_WARN = "#B45309" # 警示
|
||||
self._FONT = ("Microsoft YaHei UI", 10)
|
||||
self._FONT_SM = ("Microsoft YaHei UI", 9)
|
||||
self._FONT_TITLE = ("Microsoft YaHei UI", 15, "bold")
|
||||
self._FONT_SUB = ("Microsoft YaHei UI", 9)
|
||||
|
||||
style.configure(".", font=self._FONT, background=self._C_BG,
|
||||
foreground=self._C_TEXT)
|
||||
style.configure("Card.TLabelframe", background=self._C_CARD,
|
||||
bordercolor=self._C_BORDER, relief="solid", borderwidth=1)
|
||||
style.configure("Card.TLabelframe.Label", background=self._C_CARD,
|
||||
foreground=self._C_PRIMARY_DK, font=("Microsoft YaHei UI", 10, "bold"))
|
||||
style.configure("Card.TFrame", background=self._C_CARD)
|
||||
style.configure("TLabel", background=self._C_BG, foreground=self._C_TEXT)
|
||||
style.configure("Card.TLabel", background=self._C_CARD, foreground=self._C_TEXT)
|
||||
style.configure("Card.TRadiobutton", background=self._C_CARD, foreground=self._C_TEXT)
|
||||
style.map("Card.TRadiobutton",
|
||||
background=[("active", self._C_CARD)],
|
||||
foreground=[("active", self._C_PRIMARY_DK)])
|
||||
style.configure("Sub.TLabel", background=self._C_BG, foreground=self._C_SUB,
|
||||
font=self._FONT_SM)
|
||||
style.configure("CardSub.TLabel", background=self._C_CARD, foreground=self._C_SUB,
|
||||
font=self._FONT_SM)
|
||||
style.configure("Accent.TLabel", background=self._C_BG, foreground=self._C_PRIMARY_DK,
|
||||
font=self._FONT_SM)
|
||||
style.configure("TButton", font=self._FONT, padding=(12, 6))
|
||||
style.configure("Primary.TButton", font=self._FONT, padding=(18, 8),
|
||||
background=self._C_PRIMARY, foreground="#FFFFFF", borderwidth=0)
|
||||
style.map("Primary.TButton",
|
||||
background=[("active", self._C_PRIMARY_DK), ("disabled", "#A5B4FC")],
|
||||
foreground=[("disabled", "#EEF2FF")])
|
||||
style.configure("AccentBtn.TButton", font=self._FONT, padding=(14, 7),
|
||||
background=self._C_ACCENT, foreground="#FFFFFF", borderwidth=0)
|
||||
style.map("AccentBtn.TButton",
|
||||
background=[("active", "#D97706"), ("disabled", "#FCD34D")],
|
||||
foreground=[("disabled", "#FFFBEB")])
|
||||
style.configure("TCombobox", padding=4)
|
||||
style.configure("TEntry", padding=4)
|
||||
style.configure("Treeview", font=self._FONT_SM, rowheight=26,
|
||||
background="#FFFFFF", fieldbackground="#FFFFFF",
|
||||
bordercolor=self._C_BORDER)
|
||||
style.configure("Treeview.Heading", font=("Microsoft YaHei UI", 9, "bold"),
|
||||
background="#EEF2F7", foreground=self._C_TEXT, padding=6)
|
||||
style.map("Treeview", background=[("selected", "#DBEAFE")],
|
||||
foreground=[("selected", "#1E3A8A")])
|
||||
style.configure("TNotebook", background=self._C_BG, borderwidth=0)
|
||||
style.configure("TNotebook.Tab", font=self._FONT, padding=(14, 7))
|
||||
style.map("TNotebook.Tab",
|
||||
background=[("selected", self._C_CARD)],
|
||||
foreground=[("selected", self._C_PRIMARY_DK)])
|
||||
|
||||
# ---------- UI 构建 ----------
|
||||
def _build_ui(self):
|
||||
top = ttk.Frame(self, padding=8)
|
||||
top.pack(fill="x")
|
||||
ttk.Label(top, text="国家:").pack(side="left")
|
||||
# —— 顶部标题栏 ——
|
||||
header = tk.Frame(self, bg=self._C_PRIMARY, height=62)
|
||||
header.pack(fill="x")
|
||||
header.pack_propagate(False)
|
||||
tk.Label(header, text="🎨 智能设计 Agent",
|
||||
bg=self._C_PRIMARY, fg="#FFFFFF",
|
||||
font=("Microsoft YaHei UI", 16, "bold")).pack(side="left", padx=16, pady=12)
|
||||
tk.Label(header, text="一键生成 T 恤印花设计 · 多国多站点",
|
||||
bg=self._C_PRIMARY, fg="#DBEAFE",
|
||||
font=self._FONT_SM).pack(side="left", padx=(4, 0), pady=12)
|
||||
|
||||
self.hotspot_time_var = tk.StringVar(value="")
|
||||
tk.Label(header, textvariable=self.hotspot_time_var,
|
||||
bg=self._C_PRIMARY, fg="#DBEAFE",
|
||||
font=self._FONT_SM).pack(side="right", padx=(0, 8), pady=12)
|
||||
|
||||
# —— 运行设置卡片:国家 / 流程 / 自定义图片 / 种子数量 ——
|
||||
cfg = ttk.LabelFrame(self, text="运行设置", style="Card.TLabelframe", padding=10)
|
||||
cfg.pack(fill="x", padx=12, pady=(10, 4))
|
||||
|
||||
ttk.Label(cfg, text="目标国家:", style="Card.TLabel").pack(side="left")
|
||||
self.country_var = tk.StringVar(value="US")
|
||||
self.country_combo = ttk.Combobox(top, textvariable=self.country_var,
|
||||
self.country_combo = ttk.Combobox(cfg, textvariable=self.country_var,
|
||||
values=COUNTRIES, state="readonly", width=6)
|
||||
self.country_combo.pack(side="left", padx=4)
|
||||
self.country_combo.pack(side="left", padx=(4, 14))
|
||||
self.country_combo.bind("<<ComboboxSelected>>", lambda e: self._on_country_selected())
|
||||
ttk.Label(top, text=" 模式:").pack(side="left", padx=(14, 0))
|
||||
self.provider_var = tk.StringVar(value=self._default_provider())
|
||||
ttk.Radiobutton(top, text="OpenAI(真 LLM+生图)", value="openai",
|
||||
variable=self.provider_var).pack(side="left", padx=2)
|
||||
ttk.Radiobutton(top, text="Mock 演示", value="mock",
|
||||
variable=self.provider_var).pack(side="left", padx=2)
|
||||
ttk.Label(top, text=" 流程:").pack(side="left", padx=(14, 0))
|
||||
self.flow_var = tk.StringVar(value="trends")
|
||||
ttk.Radiobutton(top, text="热点采集", value="trends",
|
||||
|
||||
ttk.Label(cfg, text="流程:", style="Card.TLabel").pack(side="left")
|
||||
self.flow_var = tk.StringVar(value="pinterest")
|
||||
ttk.Radiobutton(cfg, text="热点采集", value="trends", style="Card.TRadiobutton",
|
||||
variable=self.flow_var).pack(side="left", padx=2)
|
||||
ttk.Radiobutton(top, text="Pinterest 参考", value="pinterest",
|
||||
ttk.Radiobutton(cfg, text="Pinterest 参考", value="pinterest", style="Card.TRadiobutton",
|
||||
variable=self.flow_var).pack(side="left", padx=2)
|
||||
ttk.Radiobutton(top, text="自定义图片", value="custom",
|
||||
ttk.Radiobutton(cfg, text="自定义图片", value="custom", style="Card.TRadiobutton",
|
||||
variable=self.flow_var).pack(side="left", padx=2)
|
||||
ttk.Button(top, text="📁 选图片文件夹…", command=self._choose_custom_dir).pack(side="left", padx=(8, 0))
|
||||
ttk.Button(cfg, text="📁 选图片文件夹…", command=self._choose_custom_dir).pack(side="left", padx=(10, 0))
|
||||
self.custom_dir_var = tk.StringVar(value="")
|
||||
self.custom_dir_name_var = tk.StringVar(value="")
|
||||
ttk.Label(top, textvariable=self.custom_dir_name_var, anchor="w",
|
||||
foreground="#185FA5").pack(side="left", padx=(6, 0))
|
||||
ttk.Label(top, text=" 种子数量:").pack(side="left", padx=(14, 0))
|
||||
self.seed_var = tk.StringVar(value="24")
|
||||
ttk.Entry(top, textvariable=self.seed_var, width=4).pack(side="left")
|
||||
# 右上角:热点状态(缓存时间 / 采集时间)
|
||||
self.hotspot_time_var = tk.StringVar(value="")
|
||||
ttk.Label(top, textvariable=self.hotspot_time_var, anchor="e",
|
||||
foreground="#185FA5").pack(side="right")
|
||||
ttk.Label(cfg, textvariable=self.custom_dir_name_var, anchor="w",
|
||||
style="Accent.TLabel").pack(side="left", padx=(6, 14))
|
||||
|
||||
# —— 商品上传模板(必须上传后才能开始任务;template_export 从该模板解析并填充)——
|
||||
tpl = ttk.LabelFrame(self, text="商品上传模板(必须上传 .xlsx 后才能运行)", padding=4)
|
||||
tpl.pack(fill="x", padx=8, pady=(2, 0))
|
||||
ttk.Label(cfg, text="种子数量:", style="Card.TLabel").pack(side="left")
|
||||
self.seed_var = tk.StringVar(value="24")
|
||||
ttk.Entry(cfg, textvariable=self.seed_var, width=5).pack(side="left", padx=(4, 0))
|
||||
|
||||
# —— 商品上传模板卡片 ——
|
||||
tpl = ttk.LabelFrame(self, text="商品上传模板(必须上传 .xlsx 后才能运行)",
|
||||
style="Card.TLabelframe", padding=8)
|
||||
tpl.pack(fill="x", padx=12, pady=(4, 4))
|
||||
ttk.Button(tpl, text="📁 选择模板…", command=self._choose_template).pack(side="left")
|
||||
self.template_path_var = tk.StringVar(value="")
|
||||
self.template_name_var = tk.StringVar(value="(未选择)")
|
||||
ttk.Label(tpl, textvariable=self.template_name_var, anchor="w",
|
||||
foreground="#993C1D").pack(side="left", padx=(8, 0))
|
||||
style="CardSub.TLabel").pack(side="left", padx=(10, 0))
|
||||
|
||||
# —— 选品面板:国家→款号→颜色→添加任务(支持多款号 + 数量上限)——
|
||||
sel = ttk.LabelFrame(self, text="选品(选定国家自动加载款号;款号 → 颜色 → 添加任务)", padding=6)
|
||||
sel.pack(fill="x", padx=8, pady=(4, 0))
|
||||
# —— 选品卡片:款号 → 颜色 → 添加任务 ——
|
||||
sel = ttk.LabelFrame(self, text="选品(选定国家自动加载款号;款号 → 颜色 → +添加选品)",
|
||||
style="Card.TLabelframe", padding=10)
|
||||
sel.pack(fill="x", padx=12, pady=(4, 4))
|
||||
|
||||
# 左:款号列表
|
||||
lf1 = ttk.Frame(sel)
|
||||
lf1 = ttk.Frame(sel, style="Card.TFrame")
|
||||
lf1.pack(side="left", padx=4)
|
||||
ttk.Label(lf1, text="款号(选定后自动加载颜色与最低价):").pack(anchor="w")
|
||||
self.spu_list = tk.Listbox(lf1, selectmode="extended", height=5, width=14, exportselection=False)
|
||||
self.spu_list.pack(side="left")
|
||||
ttk.Label(lf1, text="款号(多选)", style="Card.TLabel").pack(anchor="w")
|
||||
self.spu_list = tk.Listbox(lf1, selectmode="extended", height=6, width=16,
|
||||
exportselection=False, bg="#FFFFFF", fg=self._C_TEXT,
|
||||
selectbackground="#DBEAFE", selectforeground="#1E3A8A",
|
||||
highlightthickness=1, highlightbackground=self._C_BORDER,
|
||||
highlightcolor=self._C_PRIMARY, font=self._FONT_SM,
|
||||
relief="solid", borderwidth=1)
|
||||
self.spu_list.pack(side="left", pady=(4, 0))
|
||||
self.spu_list.bind("<<ListboxSelect>>", self._on_spu_selected)
|
||||
self.min_price_var = tk.StringVar(value="")
|
||||
ttk.Label(lf1, textvariable=self.min_price_var, anchor="w", foreground="#993C1D").pack(fill="x", pady=(4, 0))
|
||||
ttk.Label(lf1, textvariable=self.min_price_var, anchor="w",
|
||||
style="CardSub.TLabel").pack(fill="x", pady=(4, 0))
|
||||
|
||||
# 中:颜色多选(点击即多选)+ 添加按钮
|
||||
lf2 = ttk.Frame(sel)
|
||||
lf2.pack(side="left", padx=(10, 4))
|
||||
ttk.Label(lf2, text="当前款号颜色(点击多选,显示色名/最低价):").pack(anchor="w")
|
||||
self.sku_list = tk.Listbox(lf2, selectmode="multiple", height=5, width=34, exportselection=False)
|
||||
self.sku_list.pack(side="left")
|
||||
b2 = ttk.Frame(lf2)
|
||||
b2.pack(side="left", padx=4)
|
||||
# 中:颜色多选 + 添加按钮
|
||||
lf2 = ttk.Frame(sel, style="Card.TFrame")
|
||||
lf2.pack(side="left", padx=(12, 4))
|
||||
ttk.Label(lf2, text="当前款号颜色(点击多选)", style="Card.TLabel").pack(anchor="w")
|
||||
self.sku_list = tk.Listbox(lf2, selectmode="multiple", height=6, width=38,
|
||||
exportselection=False, bg="#FFFFFF", fg=self._C_TEXT,
|
||||
selectbackground="#DBEAFE", selectforeground="#1E3A8A",
|
||||
highlightthickness=1, highlightbackground=self._C_BORDER,
|
||||
highlightcolor=self._C_PRIMARY, font=self._FONT_SM,
|
||||
relief="solid", borderwidth=1)
|
||||
self.sku_list.pack(side="left", pady=(4, 0))
|
||||
b2 = ttk.Frame(lf2, style="Card.TFrame")
|
||||
b2.pack(side="left", padx=6)
|
||||
ttk.Button(b2, text="全选", command=self._select_all_colors).pack(fill="x")
|
||||
ttk.Button(b2, text="清空", command=lambda: self.sku_list.selection_clear(0, "end")).pack(fill="x", pady=2)
|
||||
ttk.Button(b2, text="+添加选品", command=self._add_task).pack(fill="x", pady=(4, 0))
|
||||
ttk.Label(b2, text="该款SPU/设计数(1-N):", anchor="w").pack(fill="x", pady=(6, 0))
|
||||
ttk.Button(b2, text="+添加选品", style="AccentBtn.TButton",
|
||||
command=self._add_task).pack(fill="x", pady=(4, 0))
|
||||
ttk.Label(b2, text="该款设计数:", style="CardSub.TLabel").pack(fill="x", pady=(6, 0))
|
||||
self.count_var = tk.StringVar(value="10")
|
||||
ttk.Entry(b2, textvariable=self.count_var, width=6).pack(fill="x")
|
||||
|
||||
# 右:任务清单
|
||||
lf3 = ttk.Frame(sel)
|
||||
lf3 = ttk.Frame(sel, style="Card.TFrame")
|
||||
lf3.pack(side="left", padx=4)
|
||||
ttk.Label(lf3, text="选品任务清单:").pack(anchor="w")
|
||||
ttk.Label(lf3, text="选品任务清单", style="Card.TLabel").pack(anchor="w")
|
||||
self.task_stat_var = tk.StringVar(value="0 个任务")
|
||||
ttk.Label(lf3, textvariable=self.task_stat_var, anchor="w",
|
||||
foreground="#993C1D").pack(anchor="w")
|
||||
self.task_list = tk.Listbox(lf3, height=5, width=40, exportselection=False)
|
||||
self.task_list.pack(side="left")
|
||||
b3 = ttk.Frame(lf3)
|
||||
b3.pack(side="left", padx=4)
|
||||
style="Accent.TLabel").pack(anchor="w")
|
||||
self.task_list = tk.Listbox(lf3, height=6, width=44, exportselection=False,
|
||||
bg="#FFFFFF", fg=self._C_TEXT,
|
||||
selectbackground="#DBEAFE", selectforeground="#1E3A8A",
|
||||
highlightthickness=1, highlightbackground=self._C_BORDER,
|
||||
highlightcolor=self._C_PRIMARY, font=self._FONT_SM,
|
||||
relief="solid", borderwidth=1)
|
||||
self.task_list.pack(side="left", pady=(4, 0))
|
||||
b3 = ttk.Frame(lf3, style="Card.TFrame")
|
||||
b3.pack(side="left", padx=6)
|
||||
ttk.Button(b3, text="删选中", command=self._del_task).pack(fill="x")
|
||||
ttk.Button(b3, text="清空", command=self._clear_tasks).pack(fill="x", pady=2)
|
||||
|
||||
# 加价百分比(供后续定价使用)+ 货号前缀
|
||||
lf4 = ttk.Frame(sel)
|
||||
lf4.pack(side="left", padx=(12, 0))
|
||||
ttk.Label(lf4, text="加价%:").pack(anchor="w")
|
||||
# 右侧:加价 / 货号前缀
|
||||
lf4 = ttk.Frame(sel, style="Card.TFrame")
|
||||
lf4.pack(side="left", padx=(16, 0))
|
||||
ttk.Label(lf4, text="加价 %", style="Card.TLabel").pack(anchor="w")
|
||||
self.markup_var = tk.StringVar(value="0")
|
||||
ttk.Entry(lf4, textvariable=self.markup_var, width=7).pack(anchor="w", pady=(2, 0))
|
||||
ttk.Label(lf4, text="按 SKU 最低价加价", anchor="w", foreground="#5F5E5A").pack(anchor="w", pady=(4, 0))
|
||||
ttk.Entry(lf4, textvariable=self.markup_var, width=7).pack(anchor="w", pady=(4, 0))
|
||||
ttk.Label(lf4, text="按 SKU 最低价加价", style="CardSub.TLabel").pack(anchor="w", pady=(4, 0))
|
||||
|
||||
lf5 = ttk.Frame(sel)
|
||||
lf5.pack(side="left", padx=(12, 0))
|
||||
ttk.Label(lf5, text="货号前缀:").pack(anchor="w")
|
||||
lf5 = ttk.Frame(sel, style="Card.TFrame")
|
||||
lf5.pack(side="left", padx=(16, 0))
|
||||
ttk.Label(lf5, text="货号前缀", style="Card.TLabel").pack(anchor="w")
|
||||
self.code_prefix_var = tk.StringVar(value="DG")
|
||||
ttk.Entry(lf5, textvariable=self.code_prefix_var, width=8).pack(anchor="w", pady=(2, 0))
|
||||
ttk.Label(lf5, text="前缀+3位计数(000起)\nOSS: 国家/时间戳/货号_4位随机", anchor="w",
|
||||
foreground="#5F5E5A").pack(anchor="w", pady=(4, 0))
|
||||
ttk.Entry(lf5, textvariable=self.code_prefix_var, width=8).pack(anchor="w", pady=(4, 0))
|
||||
ttk.Label(lf5, text="前缀+3位计数(000起)", style="CardSub.TLabel").pack(anchor="w", pady=(4, 0))
|
||||
|
||||
self._sku_map = {}
|
||||
self._tasks: list = []
|
||||
self._reload_spus()
|
||||
|
||||
bar = ttk.Frame(self, padding=(8, 0))
|
||||
# —— 操作栏 ——
|
||||
bar = ttk.Frame(self, padding=(12, 6))
|
||||
bar.pack(fill="x")
|
||||
self.run_btn = ttk.Button(bar, text="▶ 运行", style="Primary.TButton", command=self._on_run)
|
||||
self.run_btn.pack(side="left")
|
||||
self.fetch_btn = ttk.Button(bar, text="📥 采集热点", command=self._on_fetch)
|
||||
self.fetch_btn.pack(side="left")
|
||||
self.run_btn = ttk.Button(bar, text="▶ 运行", command=self._on_run)
|
||||
self.run_btn.pack(side="left", padx=6)
|
||||
ttk.Button(bar, text="打开产物目录", command=self._open_output).pack(side="left", padx=8)
|
||||
ttk.Button(bar, text="打开日志目录", command=self._open_logs).pack(side="left")
|
||||
ttk.Button(bar, text="清空日志", command=self._clear_log).pack(side="left")
|
||||
self.fetch_btn.pack(side="left", padx=(10, 0))
|
||||
ttk.Button(bar, text="打开产物目录", command=self._open_output).pack(side="left", padx=(10, 0))
|
||||
ttk.Button(bar, text="打开日志目录", command=self._open_logs).pack(side="left", padx=(10, 0))
|
||||
ttk.Button(bar, text="清空日志", command=self._clear_log).pack(side="left", padx=(10, 0))
|
||||
|
||||
ttk.Label(self, text="运行日志:").pack(anchor="w", padx=8)
|
||||
self.log_text = tk.Text(self, height=8, state="disabled")
|
||||
self.log_text.pack(fill="x", padx=8)
|
||||
# —— 运行日志(深色终端风格)——
|
||||
log_card = ttk.LabelFrame(self, text="运行日志", style="Card.TLabelframe", padding=6)
|
||||
log_card.pack(fill="x", padx=12, pady=(4, 4))
|
||||
self.log_text = tk.Text(log_card, height=7, state="disabled", wrap="word",
|
||||
bg="#0F172A", fg="#E2E8F0", font=("Consolas", 9),
|
||||
relief="flat", padx=8, pady=6, insertbackground="#E2E8F0")
|
||||
self.log_text.pack(fill="both", expand=True)
|
||||
|
||||
ttk.Label(self, text="设计简报(双击查看完整提示词):").pack(anchor="w", padx=8)
|
||||
# —— 设计简报表格 ——
|
||||
tree_card = ttk.LabelFrame(self, text="设计简报(双击查看完整提示词)",
|
||||
style="Card.TLabelframe", padding=6)
|
||||
tree_card.pack(fill="both", expand=True, padx=12, pady=(4, 10))
|
||||
cols = ("country", "topic", "category", "risk", "score")
|
||||
self.tree = ttk.Treeview(self, columns=cols, show="headings", height=12)
|
||||
self.tree = ttk.Treeview(tree_card, columns=cols, show="headings", height=12)
|
||||
for col, title, w, anchor in zip(
|
||||
cols, ["国家", "热点词", "类别", "风险", "分数"],
|
||||
[52, 340, 100, 70, 64],
|
||||
[70, 420, 180, 90, 80],
|
||||
["center", "w", "w", "center", "center"],
|
||||
):
|
||||
self.tree.heading(col, text=title)
|
||||
self.tree.column(col, width=w, anchor=anchor)
|
||||
self.tree.pack(fill="both", expand=True, padx=8, pady=(2, 8))
|
||||
self.tree.pack(fill="both", expand=True)
|
||||
self.tree.bind("<Double-1>", self._show_detail)
|
||||
|
||||
def _log(self, s: str):
|
||||
@@ -707,12 +809,6 @@ class App(tk.Tk):
|
||||
if colors:
|
||||
self.sku_list.selection_set(0) # 默认选中第一个颜色
|
||||
|
||||
def _current_spu(self):
|
||||
sel = self.spu_list.curselection()
|
||||
if sel and sel[0] < len(self._spu_list):
|
||||
return self._spu_list[sel[0]]["code"]
|
||||
return ""
|
||||
|
||||
def _add_task(self):
|
||||
"""把当前选中的【款号】加入任务清单(可多选、可重复新增)。
|
||||
每个款号一条「集合」:skus=选中颜色集合(多色用逗号分隔),
|
||||
@@ -863,7 +959,7 @@ class App(tk.Tk):
|
||||
self.run_btn.config(state="disabled")
|
||||
threading.Thread(
|
||||
target=fetch_keywords,
|
||||
args=(self.country_var.get(), self.provider_var.get(), ms, self._q,
|
||||
args=(self.country_var.get(), "openai", ms, self._q,
|
||||
self._oai_cfg()),
|
||||
daemon=True,
|
||||
).start()
|
||||
@@ -1023,18 +1119,12 @@ class App(tk.Tk):
|
||||
messagebox.showerror("参数错误", "加价%不能为负数")
|
||||
return
|
||||
|
||||
# 任务清单优先;空则用当前选中款号+颜色(保留旧行为)
|
||||
# 任务清单必须通过「+添加选品」显式添加后才允许运行;
|
||||
# 不允许用当前选中款号+颜色兜底(否则未添加选品也能启动,会按数量扩展生成大量简报)。
|
||||
tasks = list(self._tasks)
|
||||
if not tasks:
|
||||
spu = self._current_spu()
|
||||
if not spu:
|
||||
messagebox.showwarning("提示", "请先添加选品(款号 → 颜色 → +添加选品)")
|
||||
return
|
||||
sel_colors = [self.sku_list.get(i).split(" ")[0] for i in self.sku_list.curselection()]
|
||||
if not sel_colors:
|
||||
messagebox.showwarning("提示", "请至少选择一个颜色")
|
||||
return
|
||||
tasks = [{"spu": spu, "skus": ",".join(sel_colors)}]
|
||||
|
||||
# ① 兜底校验:任务开始前检查所有款号颜色的 basemap 底图是否存在;
|
||||
# 存在缺失 → 直接报错提醒,不开始任何任务
|
||||
@@ -1063,7 +1153,7 @@ class App(tk.Tk):
|
||||
# —— 自定义图片模式硬校验:必须先选文件夹;有效图片数 ≥ 选品清单总数 ——
|
||||
if not custom_dir:
|
||||
self._busy = False
|
||||
self.run_btn.config(state="normal", text="运行")
|
||||
self.run_btn.config(state="normal", text="▶ 运行")
|
||||
self.fetch_btn.config(state="normal")
|
||||
messagebox.showwarning("自定义图片模式", "请先点击「📁 选图片文件夹…」选择上传的图片文件夹")
|
||||
return
|
||||
@@ -1076,7 +1166,7 @@ class App(tk.Tk):
|
||||
ok, valid_n, msg = False, 0, f"校验失败: {e}"
|
||||
if not ok:
|
||||
self._busy = False
|
||||
self.run_btn.config(state="normal", text="运行")
|
||||
self.run_btn.config(state="normal", text="▶ 运行")
|
||||
self.fetch_btn.config(state="normal")
|
||||
messagebox.showerror("自定义图片数量校验未通过", msg)
|
||||
self._log("[UI] 自定义图片数量校验未通过,任务未运行: " + msg + "\n")
|
||||
@@ -1084,7 +1174,7 @@ class App(tk.Tk):
|
||||
self._log(f"[UI] 自定义图片数量校验通过:有效图片 {valid_n} 张 ≥ 选品清单 {expanded}\n")
|
||||
threading.Thread(
|
||||
target=run_pinterest_pipeline,
|
||||
args=(countries, self.provider_var.get(), self._q,
|
||||
args=(countries, "openai", self._q,
|
||||
tasks, spu_count, self._oai_cfg(), markup,
|
||||
self.code_prefix_var.get().strip() or "DG",
|
||||
self.template_path_var.get().strip(),
|
||||
@@ -1094,7 +1184,7 @@ class App(tk.Tk):
|
||||
else:
|
||||
threading.Thread(
|
||||
target=run_pipeline,
|
||||
args=(countries, self.provider_var.get(), ms, self._q,
|
||||
args=(countries, "openai", ms, self._q,
|
||||
"", "", spu_count, tasks, self._oai_cfg(), markup,
|
||||
self.code_prefix_var.get().strip() or "DG",
|
||||
self.template_path_var.get().strip()),
|
||||
@@ -1176,7 +1266,7 @@ class App(tk.Tk):
|
||||
("国家", "country"), ("热点词", "topic"), ("类别", "design_category"),
|
||||
("风险", "risk_level"), ("风险原因", "risk_reasons"), ("概念", "concept"),
|
||||
("主体 motif", "motif"), ("艺术风格", "art_style"), ("配色", "color_palette"),
|
||||
("构图", "composition"), ("负向", "negative_prompt"),
|
||||
("构图", "composition"),
|
||||
("image_prompt", "image_prompt"), ("composite_prompt", "composite_prompt"),
|
||||
]:
|
||||
v = b.get(k)
|
||||
|
||||
Reference in New Issue
Block a user