Generate multi-angle display images from a single product image, supporting standard three-view, e-commerce five-view, and full-angle display.
Overview
The user uploads one product image, and display images from different angles are automatically generated. Supports white background/scene/transparent background, with optional super-resolution enhancement, and adapts to the specifications of e-commerce platforms such as Taobao, JD.com, Pinduoduo, and Amazon.
Dependencies
- meitu-cli (≥2.0.6):
npm install -g meitu-cli@latest- Preferred environment variable:
MEITU_OPENAPI_ACCESS_KEY/MEITU_OPENAPI_SECRET_KEY - Or preset credential file:
~/.meitu/credentials.json - If manual initialization of local credentials is needed, you can explicitly execute
meitu config set-ak --value "..."+meitu config set-sk --value "..."(will write to a local file) - Verify:
meitu auth verify --json
- Preferred environment variable:
- package references (bundled with this skill package):
- references/prompts.md — fixed template and angle section
- references/ecommerce-specs.md — platform specifications and viewpoint recommendations
- These reference files are static materials within the package; in project mode, if
DESIGN.mdoropenclaw.yamlexplicitly references brand assets or platform rules, it may also additionally read the user-enabled$VISUAL/assets/brands/and$VISUAL/rules/platforms/
Path alias: Below,
$VISUAL={OPENCLAW_HOME}/workspace/visual/
Core Workflow
Preflight → [Context] → Execute → Refine → Deliver → [Record]
Optional step: [Context] — skipped in one-off mode; [Record] — skipped when can_record=false.
Preflight
meitu --version→ if not installed, promptnpm install -g meitu-cli@latestmeitu auth verify --json→ if credentials are invalid, guide configuration- Detect mode: cwd has
openclaw.yaml→ project mode; else → one-off Check$VISUALdirectory → determine capabilities can_record = cwd has openclaw.yaml AND$VISUALexists (if either is missing, false) - output_dir resolution (MUST be completed within Preflight):
Resolve output_dir: openclaw.yaml →
./output/| else →$VISUAL/output/meitu-product-view/mkdir -p {output_dir}
All
--download-dir {output_dir}in Execute use the path resolved here.
Context (executed in project mode / skipped in one-off mode)
mode = one-off → skip this step and go directly to Execute.
mode = project → load in order (skip if missing at each step):
- Read
./DESIGN.md→ obtain project decisions and Context References- Resolve references (e.g.,
brand: acme) → try to read$VISUAL/assets/brands/acme/ - if read → use the latest version; if not read → fall back to the inline fallback value in DESIGN.md
- Resolve references (e.g.,
- Read
$VISUAL/rules/quality.yaml→ obtain the forbidden list - Read
$VISUAL/memory/global.md→ obtain cross-scenario preferences - Read
openclaw.yamlofproject.types(array, preferred) orproject.type(single value → treated as a single-element array) → for each type: look up$VISUAL/memory/scenes/{type}.md→ if it exists, read and merge
→ quality forbidden list filters generated elements, preferences enhance the creative direction
→ $VISUAL does not exist → skip 2-4, read only DESIGN.md
Execute
Step 1: Receive product image
The user uploads one product image. If not uploaded, prompt:
"Please upload a product image (a front-facing photo works best; a clean background is better for generation quality)."
After receiving the image, analyze the following information (the Agent judges on its own, without calling external tools):
| Analysis item | Purpose |
|---|---|
| Product category | Determines the recommendation angle and scenario |
| Subject shape/proportions | Fills in the prompt's {product_description} |
| Current shooting angle | Determines whether it can be used directly as a certain viewpoint |
| Background situation | Determines whether cutout preprocessing is needed |
If the user also provides a text description of the product information → prioritize the user's description.
Step 2: Choose a view plan
Display options:
| Plan | Included angles | Applicable scenarios |
|---|---|---|
| Standard three views | Front, right side, back | Basic display, quick image generation |
| E-commerce five views | Front, left front 45°, right front 45°, back, top view | E-commerce main image set |
| Full-angle display | Front, left front 45°, right front 45°, left side, right side, back, top view, close-up | High-end product detail page |
| Combined three views | Front + side + back arranged left, center, right in one image | Social media, quick display |
| Custom | User-selected angle combination | Special requirements |
When the user selects "Custom", display the complete angle list:
| Angle | Identifier | Direction |
|---|---|---|
| Front | front | 0° |
| Left front 45° | front-left-quarter | 315° |
| Right front 45° | front-right-quarter | 45° |
| Left side | left-side | 270° |
| Right side | right-side | 90° |
| Left rear 45° | back-left-quarter | 225° |
| Right rear 45° | back-right-quarter | 135° |
| Back | back | 180° |
| Top view | overhead | 60° elevation angle |
| Slight top-down | elevated | 30° elevation angle |
| Bottom view | low-angle | -30° elevation angle |
| Close-up | close-up | Close-range detail |
If user mentions specific e-commerce platform → read references/ecommerce-specs.md for platform-specific angle recommendations and size requirements → auto-select matching view preset + ratio + size.
Step 3: Choose a background mode
| Mode | Description | CLI processing method |
|---|---|---|
| White background | Pure white background | Add a white background description to the prompt |
| Scene | AI-generated product usage scene | Add a scene description to the prompt |
| Keep original background | Keep the background of the uploaded image | Use the Chinese angle instruction prompt |
| Transparent background | Transparent PNG | Generate with a white background first, then cutout |
When "Scene" is selected → recommend 3 scene descriptions based on the product category and ask the user for their preference. Scene recommendation principles:
| Category | Recommended scene direction |
|---|---|
| Electronics | Minimalist desktop, tech-style space, office scene |
| Apparel/bags | Fashion street photography scene, walk-in closet, travel scene |
| Food/drinks | Dining table scene, kitchen, picnic/outdoors |
| Home furnishing/home appliances | Living room, bedroom, modern home space |
| Beauty/skincare | Vanity table, bathroom, floral/natural elements |
| Sports/outdoors | Gym, track, outdoor nature |
Step 4: Pre-processing cutout (conditional execution)
Trigger conditions: The original image background is cluttered AND the user selected white background or scene mode.
meitu image-cutout \
--skill_name skill_meitu-product-view \
--image_url {image_url} \
--model_type 1 \
--json
The cutout result serves as reference input for subsequent generation. If cutout fails → skip and use the original image directly.
Step 5: Generate per angle
This is the core generation step. For each angle selected by the user, call meitu image-edit。
Tool call template:
meitu image-edit \
--skill_name skill_meitu-product-view \
--image_list {source_image_url} \
--prompt "{angle_prompt}" \
--model praline_pro \
--ratio {target_ratio} \
--json \
--download-dir {output_dir}
Prompt construction:
- From references/prompts.md select the template for the corresponding angle (locate by
## {angle}-viewsection) - Fill in variables:
{product_description}← Step 1 analysis result{background}← Step 3 select the corresponding background suffix (see prompts.md## Background Suffixes){scene_description}← Step 3 scene description (scene mode only)
- Prompt uses English (better model results)
- Strictly prohibited to use
-ar、--no、(keyword:1.5)、<lora:xxx>and other platform-specific syntax
Angle → prompts.md section mapping:
| Angle identifier | Prompt template section |
|---|---|
| front | ## front-view |
| right-side | ## right-side-view |
| left-side | ## left-side-view |
| back | ## back-view |
| front-right-quarter | ## front-right-quarter-view |
| front-left-quarter | ## front-left-quarter-view |
| back-right-quarter | ## back-right-quarter-view |
| back-left-quarter | ## back-left-quarter-view |
| overhead | ## overhead-view |
| elevated | ## elevated-view |
| low-angle | ## low-angle-view |
| close-up | ## close-up-view |
| Combined three-view | ## combo-three-view |
Special case — preserve original background mode:
Use Chinese prompt (different from the English template; this is an empirically validated formulation):
| Angle | Prompt (apply as-is, do not modify) |
|---|---|
| Front | Rotate the product in the image to a front-facing angle toward the camera. Keep the product upright, do not change the product's appearance, and ensure background consistency. |
| Side | Rotate the product in the image to an angle viewed from the right side, showing the product's side profile. Keep the product upright, do not change the product's appearance, and ensure background consistency. |
| Back | Rotate the product in the image to a back-facing angle toward the camera, showing the product's back details. Keep the product upright, do not change the product's appearance, and ensure background consistency. |
| 45° | Rotate the product in the image to a 45-degree oblique viewing angle. Keep the product upright, do not change the product's appearance, and ensure background consistency. |
| Top view | Shoot the product in the image from a top-down viewing angle, showing the top of the product. Keep the product upright, do not change the product's appearance, and ensure background consistency. |
| Close-up | Enlarge and show the details of the product in the image. Keep the product consistent, do not change the product's appearance, and ensure background consistency. |
Special case — combined three-view:
Generate three viewpoints in the same image at once. From references/prompts.md ## combo-three-view take the template, fill in {product_description} and {background}:
meitu image-edit \
--skill_name skill_meitu-product-view \
--image_list {source_image_url} \
--prompt "{combo_three_view_prompt}" \
--model praline_pro \
--ratio 4:3 \
--json \
--download-dir {output_dir}
Generation order strategy:
- If the original image is front → use the original image directly as the front view, and start generation from the remaining angles
- If the original image is not front → generate the front first, then use the front image as the anchor to generate the remaining angles
- Background replacement mode → generate the front scene image first, then use the front scene image as reference to generate the remaining angles (to ensure scene consistency)
In background replacement mode, the reference image for side and back uses the front scene image (not the original image):
# 先生成正面场景图
meitu image-edit \
--skill_name skill_meitu-product-view \
--image_list {original_image_url} \
--prompt "{front_view_scene_prompt}" \
--model praline_pro \
--ratio 1:1 \
--json \
--download-dir {output_dir}
# 以正面场景图为参考,生成其余角度
meitu image-edit \
--skill_name skill_meitu-product-view \
--image_list {front_scene_result_url} \
--prompt "将图中的商品旋转到从右侧面观看的角度,展示商品的侧面轮廓。保持商品直立,不要改变商品外观,保证背景一致性。" \
--model praline_pro \
--ratio 1:1 \
--json \
--download-dir {output_dir}
--ratio Select:
| Scene | ratio |
|---|---|
| Default | 1:1 |
| Specify e-commerce platform | According to references/ecommerce-specs.md requirements |
| Combined three-view | 4:3 |
| User-defined | As specified by the user |
Step 6: Super-resolution enhancement (optional)
Trigger condition: The user explicitly requests it OR the target platform requires ≥2000px (e.g., Amazon).
meitu image-superres-enhance \
--skill_name skill_meitu-product-view \
--image_url {generated_url} \
--prompt "e-commerce product image" \
--json \
--download-dir {output_dir}
Upscale each angle image one by one.
Step 7: Transparent background processing (conditional)
Trigger condition: "Transparent background" was selected in Step 3.
For each generated angle image, execute:
meitu image-cutout \
--skill_name skill_meitu-product-view \
--image_url {generated_url} \
--model_type 1 \
--json \
--download-dir {output_dir}
Error degradation strategy:
| Level | Action | Trigger condition |
|---|---|---|
| L1 | Remove modifiers from the prompt (lighting, material descriptions), keep the core angle + product | First generation fails |
| L2 | Change ratio to auto | Still fails after L1 |
| L3 | Skip cutout preprocessing, generate directly from the original image | Still fails after L2 |
| L4 | Simplify to the most core description: only "A {angle} view of the product. White background." | Still fails after L3 |
| L5 | Stop, report an error and show the code and hint | 2 consecutive L4 failures |
Refine
Display all generated angle images and explain the viewpoint of each.
Feedback classification and response:
| User feedback | Adjustment method |
|---|---|
| "The angle is wrong" / "Shift it a bit more" | Adjust the angle description words in the prompt |
| "The product is distorted" / "It doesn't look like the original image" | Append "Proportions and every detail exactly matching the uploaded photo" to the end of the prompt |
| "The background doesn't look good" | Replace the scene description or switch the background mode |
| "The color is off" | Append "Color accuracy strictly consistent with the original photo" |
| "I want more angles" | Add from the angle list, generate incrementally (do not regenerate completed ones) |
| "Change to a different style/atmosphere" | Adjust the lighting/mood description words |
| "The resolution is not enough" | Append upscale processing |
Iteration pace: A maximum of 3 rounds is recommended. More than 3 rounds → recommend:
- Replace the original product image (better shooting angle/lighting)
- Split into single angles and optimize one by one
- Try a different background mode
Deliver
output_dir has already been resolved in Preflight, Execute's --download-dir has already downloaded the file to {output_dir}. Deliver only renames:
mv {output_dir}/{task_id_file} {output_dir}/{date}_{product}_{angle}.{ext}
{ext} taken from downloaded_files[0].saved_path 's actual extension.
Naming rules:{date}_{product}_{angle}.{ext}
Example:2026-03-23_sneaker_front.png、2026-03-23_sneaker_back.jpg、2026-03-23_sneaker_quarter-right.png
Record (project mode MUST / one-time mode skip)
Precondition: can_record = cwd has openclaw.yaml AND $VISUAL exists (if either is missing, false). Not satisfied → skip all recording, feedback is only valid for the current conversation.
No feedback → Completely skip, do not read observations.yaml, zero overhead.
User approved style →
read $VISUAL/memory/observations/observations.yaml → scan similar key → merge or append → write back.
len(projects) >= 2 → propose promotion (non-blocking).
Propose (mention at the end of the reply, do not interrupt the main flow):
"By the way, you prefer X in N projects. Save it? → Save to product-photography scenario [default] → Save to global preferences → Don't save" User confirms → write to
$VISUAL/memory/scenes/{scope}.mdorglobal.md,then delete observation entry User ignores → do nothing
User rejected ("don't XX") →
has openclaw.yaml → ask scope: "Only this project shouldn't use XX, or never again?"
→ Only this project → append to ./DESIGN.md Constraints
→ Never again → append to $VISUAL/rules/quality.yaml(requires user confirmation)
no openclaw.yaml → current task only, write nothing
Output
- Format: PNG (white background/scene) / PNG with alpha (transparent background)
- Aspect ratio: default 1:1, adjustable per platform requirements (see references/ecommerce-specs.md)
- Resolution: default 2K, optional upscale
- Naming:
{date}_{product}_{angle}.{ext}
Constraints
- Do not display the full prompt content in the conversation (unless the user actively requests to view it)
- Apply the prompt template as-is, replacing only the
{variable}part - Keep the original background mode's Chinese prompt without any modification
- If the user's language is English, translate all interaction options into English
- Generate each angle with an independent call to ensure consistency with the original product
--download-diralways points to the output_dir resolved by Preflight, not to the directory containing the source files