Qwen Image Layered
Playground
Try it on WaveSpeedAI!Qwen-Image Layered is a unified image-layer decomposition model for prompt-guided compositing. Provide points, boxes, or rough masks to isolate subjects and regions, and the model splits a single image into multiple RGBA layers with clean alpha, soft edges, and correct occlusion order. Ready-to-use REST inference API with fast response, no cold starts, and affordable pricing.
Features
qwen-image/layered is a layered image decomposition model that splits a single image into multiple clean RGBA layers, enabling flexible compositing, background separation, and layer-based creative editing. It supports an optional prompt for better semantic separation and explicit control over the number of output layers.
🌟 Why it stands out
- Controllable layer count: choose exactly how many RGBA layers you want via num_layers.
- Clean RGBA outputs: each layer includes transparency for easy compositing and editing.
- Prompt-guided separation: optionally describe the scene to improve layer grouping in complex images.
- Workflow-friendly: ideal for design iteration, asset cleanup, and creative pipelines.
⚙️ Capabilities
- Image-to-multi-layer RGBA decomposition
- Transparent background handling per layer (RGBA output)
- Optional prompt conditioning for semantic grouping
- Works best on images with clear subjects, strong contrast, and limited heavy occlusion
⚙️ Parameters
| Parameter | Description |
|---|---|
| image* | Input image file or public URL. |
| prompt | Optional caption to guide layer separation (e.g., “a person in front of a building”). |
| num_layers | Number of RGBA layers to generate (e.g., 4). |
💰 Pricing
Reference table:
| num_layers | Total Price |
|---|---|
| 2 | $0.050 |
| 3 | $0.075 |
| 4 | $0.100 |
| 5 | $0.125 |
| 8 | $0.200 |
How to use
- Upload the source image (or provide a public URL).
- Set num_layers to the number of layers you want.
- Optional: add a prompt to improve semantic separation.
- Run the model.
- Download the RGBA layers and composite/edit them in your workflow.
💡 Best Use Cases
- Layer-based editing and compositing workflows
- Background separation and subject isolation
- Poster / banner / creative layout design
- Rapid asset preparation for marketing and social creatives
📝 Notes
- Best results: clear subjects, good lighting, minimal motion blur, and strong foreground/background separation.
- Higher num_layers can help break complex scenes into smaller components, but may also create finer splits that require selection/merging in post.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"image": "https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg",
"num_layers": 4
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/qwen-image/layered" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| image | string | Yes | - | The image to decompose into layers. | |
| prompt | string | No | - | A text description of the image content. | |
| num_layers | integer | No | 4 | 2 ~ 8 | The number of layers to generate (1-8). |
| enable_sync_mode | boolean | No | false | - | If set to `true`, the request attempts to wait for the generated result and return outputs in the same response. If the result is not ready within the sync wait window, the API can return a timeout body while the task continues processing. This option is only available via the API and is supported only by some models. |
| enable_base64_output | boolean | No | false | - | If set to `true`, the prediction's `output` strings are returned as **naked base64** (no `data:<mime>;base64,` prefix). When `false` (default), outputs are returned as URLs pointing to our CDN. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |