All Products
Search
Document Center

Alibaba Cloud Model Studio:Pengeditan gambar - Wan2.5 hingga 2.7

Last Updated:Jul 01, 2026

Edit gambar menggunakan instruksi teks dengan model Wan. Mendukung input/output multi-gambar, fusi gambar, pelestarian subjek, dan deteksi objek.

Mulai

Hasilkan gambar yang telah diedit dari dua gambar input dan sebuah prompt teks dengan wan2.7-image-pro.

Prompt: Semprotkan grafiti dari gambar 2 ke mobil di gambar 1

Input image 1

Input image 2

Output image (wan2.7-image-pro)

umbrella

input2

1774509357_902b1408-2026-03-30-16-12-31

Sebelum melakukan panggilan, dapatkan Kunci API dan ekspor Kunci API sebagai variabel lingkungan. Untuk melakukan panggilan menggunakan SDK, instal SDK DashScope.

Panggilan sinkron

Penting

Pastikan versi SDK Python DashScope adalah 1.25.15 atau lebih baru, dan versi SDK Java DashScope adalah 2.22.13 atau lebih baru.

Python

Contoh permintaan

import os
import base64
import mimetypes
import urllib.request
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message

# Berikut ini adalah URL dasar untuk wilayah Singapura. URL dasar berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: api_key="sk-xxx"
# Kunci API berbeda-beda tergantung wilayah. Untuk mendapatkan Kunci API, kunjungi: https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

# --- Fungsi encoding Base64 ---
# Format encoding Base64 adalah data:{MIME_type};base64,{base64_data}
def encode_file(file_path):
    mime_type, _ = mimetypes.guess_type(file_path)
    if not mime_type or not mime_type.startswith("image/"):
        raise ValueError("Format gambar tidak didukung atau tidak dikenali")
    with open(file_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
    return f"data:{mime_type};base64,{encoded_string}"

"""
Metode input gambar:
Berikut ini tiga metode input gambar. Anda hanya perlu memilih salah satu.
1. Gunakan URL publik: Metode ini cocok untuk gambar yang dapat diakses publik.
2. Gunakan file lokal: Metode ini cocok untuk pengembangan dan pengujian lokal.
3. Gunakan encoding Base64: Metode ini cocok untuk gambar privat atau skenario yang memerlukan transmisi terenkripsi.
"""
# [Metode 1] Gunakan URL gambar publik
image_1 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp"
image_2 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp"

# [Metode 2] Gunakan file lokal (mendukung jalur absolut dan relatif)
# image_1 = "file:///path/to/your/car.png"
# image_2 = "file:///path/to/your/paint.png"

# [Metode 3] Gunakan gambar yang di-encode Base64
# image_1 = encode_file("/path/to/your/car.png")
# image_2 = encode_file("/path/to/your/paint.png")

message = Message(
    role="user",
    content=[
        {"text": "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"},
        {"image": image_1},
        {"image": image_2},
    ],
)
print("----panggilan sinkron, mohon tunggu sebentar----")
rsp = ImageGeneration.call(
    model="wan2.7-image-pro",
    api_key=api_key,
    messages=[message],
    watermark=False,
    n=1,
    size="2K",  # wan2.7-image-pro hanya mendukung resolusi 4K untuk skenario generasi teks-ke-gambar. Pengeditan gambar dan generasi multi-gambar mendukung resolusi maksimum 2K.
)

# Ekstrak URL gambar hasil dan simpan gambar ke file lokal.
if rsp.status_code == 200:
    for i, choice in enumerate(rsp.output.choices):
        for j, content in enumerate(choice["message"]["content"]):
            if content.get("type") == "image":
                image_url = content["image"]
                file_name = f"output_{i}_{j}.png"
                # URL hasil berlaku selama 24 jam. Harap unduh tepat waktu.
                urllib.request.urlretrieve(image_url, file_name)
                print(f"Gambar disimpan ke {file_name}")
else:
    print(f"Gagal: status_code={rsp.status_code}, message={rsp.message}")

Contoh respons

URL berlaku selama 24 jam. Unduh gambar segera.
{
    "status_code": 200,
    "request_id": "81d868c6-6ce1-92d8-a90d-d2ee71xxxxxx",
    "code": "",
    "message": "",
    "output": {
        "text": null,
        "finish_reason": null,
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                            "type": "image"
                        }
                    ]
                }
            }
        ],
        "audio": null,
        "finished": true
    },
    "usage": {
        "input_tokens": 18790,
        "output_tokens": 2,
        "characters": 0,
        "image_count": 1,
        "size": "2985*1405",
        "total_tokens": 18792
    }
}

Java

Contoh permintaan

import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Pengeditan Gambar wan2.7-image-pro - Contoh Panggilan Sinkron
 */
public class Main {

    static {
        // URL berikut adalah untuk wilayah Singapura. URL dasar berbeda-beda tergantung wilayah.
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: apiKey="sk-xxx"
    // Kunci API berbeda-beda tergantung wilayah. Untuk mendapatkan Kunci API, kunjungi https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    // --- Fungsi encoding Base64 ---
    // Format encoding Base64: data:{MIME_type};base64,{base64_data}
    public static String encodeFile(String filePath) throws IOException {
        byte[] fileContent = Files.readAllBytes(Paths.get(filePath));
        String base64String = Base64.getEncoder().encodeToString(fileContent);
        String mimeType = Files.probeContentType(Paths.get(filePath));
        return "data:" + mimeType + ";base64," + base64String;
    }

    public static void basicCall() throws ApiException, NoApiKeyException, UploadFileException, IOException {
        /*
         * Deskripsi metode input gambar:
         * Tiga metode input gambar disediakan di bawah ini. Pilih salah satu.
         * 1. Gunakan URL publik: Cocok untuk gambar yang dapat diakses publik.
         * 2. Gunakan file lokal: Cocok untuk pengembangan dan pengujian lokal.
         * 3. Gunakan encoding Base64: Cocok untuk gambar privat atau skenario yang memerlukan transmisi terenkripsi.
         */
        // Metode 1: Gunakan URL gambar publik.
        String image1 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp";
        String image2 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp";

        // Metode 2: Gunakan file lokal. Jalur absolut dan relatif didukung.
        // Format: file:// + jalur file
        // String image1 = "file:///path/to/your/car.png";
        // String image2 = "file:///path/to/your/paint.png";

        // Metode 3: Gunakan gambar yang di-encode Base64.
        // String image1 = encodeFile("/path/to/your/car.png");
        // String image2 = encodeFile("/path/to/your/paint.png");

        // Bangun pesan input multi-gambar.
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Arrays.asList(
                        // Input multi-gambar didukung. Anda dapat memberikan beberapa gambar referensi.
                        Collections.singletonMap("text", "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"),
                        Collections.singletonMap("image", image1),
                        Collections.singletonMap("image", image2)
                )).build();

        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.7-image-pro")
                .messages(Collections.singletonList(message))
                .n(1)
                .size("2K") // Untuk wan2.7-image-pro, hanya skenario generasi teks-ke-gambar yang mendukung resolusi 4K. Pengeditan gambar dan generasi kolase mendukung resolusi maksimum 2K.
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        ImageGenerationResult result = null;
        try {
            System.out.println("---panggilan sinkron untuk pengeditan gambar, mohon tunggu sebentar----");
            result = imageGeneration.call(param);
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
        // Ekstrak URL gambar hasil dan simpan ke file lokal.
        for (int i = 0; i < result.getOutput().getChoices().size(); i++) {
            List<Map<String, Object>> contents = result.getOutput().getChoices().get(i)
                    .getMessage().getContent();
            for (int j = 0; j < contents.size(); j++) {
                if ("image".equals(contents.get(j).get("type"))) {
                    String imageUrl = (String) contents.get(j).get("image");
                    String fileName = "output_" + i + "_" + j + ".png";
                    // URL hasil berlaku selama 24 jam. Unduh gambar tepat waktu.
                    try (InputStream in = new URL(imageUrl).openStream()) {
                        Files.copy(in, Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
                    }
                    System.out.println("Gambar disimpan ke " + fileName);
                }
            }
        }
    }

    public static void main(String[] args) throws ApiException, NoApiKeyException, UploadFileException, IOException {
        basicCall();
    }
}

Contoh respons

URL berlaku selama 24 jam. Simpan segera.
{
    "requestId": "1bf6173a-e8de-9f75-94d3-5e618f875xxx",
    "usage": {
        "input_tokens": 18790,
        "output_tokens": 2,
        "total_tokens": 18792,
        "image_count": 1,
        "size": "2985*1405"
    },
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                            "type": "image"
                        }
                    ]
                }
            }
        ],
        "finished": true
    },
    "status_code": 200,
    "code": "",
    "message": ""
}

curl

Contoh permintaan
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
    --header 'Content-Type: application/json' \
    --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
    --data '{
        "model": "wan2.7-image-pro",
        "input": {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp"},
                        {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp"},
                        {"text": "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"}
                    ]
                }
            ]
        },
        "parameters": {
            "size": "2K",
            "n": 1,
            "watermark": false
        }
    }'
    
Contoh respons
{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "content": [
                        {
                            "image": "https://dashscope-xxx.oss-xxx.aliyuncs.com/xxx.png?Expires=xxx",
                            "type": "image"
                        }
                    ],
                    "role": "assistant"
                }
            }
        ],
        "finished": true
    },
    "usage": {
        "image_count": 1,
        "input_tokens": 10867,
        "output_tokens": 2,
        "size": "1488*704",
        "total_tokens": 10869
    },
    "request_id": "71dfc3c6-f796-9972-97e4-bc4efc4faxxx"
}

Panggilan asinkron

Penting

Pastikan versi SDK Python DashScope adalah 1.25.15 atau lebih baru, dan versi SDK Java DashScope adalah 2.22.13 atau lebih baru.

Python

Contoh permintaan

import os
import base64
import mimetypes
import urllib.request
import dashscope
from dashscope.aigc.image_generation import ImageGeneration
from dashscope.api_entities.dashscope_response import Message
from http import HTTPStatus

# Berikut ini adalah URL dasar untuk wilayah Singapura. URL dasar berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: api_key="sk-xxx"
# Kunci API berbeda-beda tergantung wilayah. Untuk mendapatkan Kunci API, kunjungi https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

# --- Fungsi encoding Base64 ---
# Format encoding Base64 adalah data:{MIME_type};base64,{base64_data}
def encode_file(file_path):
    mime_type, _ = mimetypes.guess_type(file_path)
    if not mime_type or not mime_type.startswith("image/"):
        raise ValueError("Format gambar tidak didukung atau tidak dikenali.")
    with open(file_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode("utf-8")
    return f"data:{mime_type};base64,{encoded_string}"

"""
Metode input gambar:
Tiga metode input gambar disediakan di bawah ini. Pilih salah satu.
1. Gunakan URL publik - cocok untuk gambar yang dapat diakses publik.
2. Gunakan file lokal - cocok untuk pengembangan dan pengujian lokal.
3. Gunakan encoding Base64 - cocok untuk gambar privat atau skenario yang memerlukan transmisi terenkripsi.
"""
# [Metode 1] Gunakan URL gambar publik
image_1 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp"
image_2 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp"

# [Metode 2] Gunakan file lokal (mendukung jalur absolut dan relatif)
# image_1 = "file:///path/to/your/car.png"
# image_2 = "file:///path/to/your/paint.png"

# [Metode 3] Gunakan gambar yang di-encode Base64
# image_1 = encode_file("/path/to/your/car.png")
# image_2 = encode_file("/path/to/your/paint.png")

# Buat tugas asinkron.
def create_async_task():
    print("Membuat tugas asinkron...")
    message = Message(
        role="user",
        content=[
            {"text": "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1."},
            {"image": image_1},
            {"image": image_2},
        ],
    )
    response = ImageGeneration.async_call(
        model="wan2.7-image-pro",
        api_key=api_key,
        messages=[message],
        watermark=False,
        n=1,
        size="2K",  # wan2.7-image-pro hanya mendukung resolusi 4K untuk skenario generasi teks-ke-gambar. Pengeditan gambar dan generasi kolase mendukung resolusi maksimum 2K.
    )

    if response.status_code == 200:
        print("Tugas berhasil dibuat:", response)
        return response
    else:
        raise Exception(f"Gagal membuat tugas: {response.code} - {response.message}")

# Tunggu hingga tugas selesai.
def wait_for_completion(task_response):
    print("Menunggu penyelesaian tugas...")
    status = ImageGeneration.wait(task=task_response, api_key=api_key)

    if status.output.task_status == "SUCCEEDED":
        print("Tugas berhasil!")
        # Ekstrak URL gambar hasil dan simpan gambar ke file lokal.
        for i, choice in enumerate(status.output.choices):
            for j, content in enumerate(choice["message"]["content"]):
                if content.get("type") == "image":
                    image_url = content["image"]
                    file_name = f"output_{i}_{j}.png"
                    # URL hasil berlaku selama 24 jam. Unduh gambar tepat waktu.
                    urllib.request.urlretrieve(image_url, file_name)
                    print(f"Gambar disimpan ke {file_name}")
    else:
        raise Exception(f"Tugas gagal dengan status: {status.output.task_status}")

# Dapatkan informasi tentang tugas asinkron.
def fetch_task_status(task):
    print("Mengambil status tugas...")
    status = ImageGeneration.fetch(task=task, api_key=api_key)

    if status.status_code == HTTPStatus.OK:
        print("Status tugas:", status.output.task_status)
        print("Detail respons:", status)
    else:
        print(f"Gagal mengambil status: {status.code} - {status.message}")

# Batalkan tugas asinkron.
def cancel_task(task):
    print("Membatalkan tugas...")
    response = ImageGeneration.cancel(task=task, api_key=api_key)

    if response.status_code == HTTPStatus.OK:
        print("Tugas berhasil dibatalkan:", response.output.task_status)
    else:
        print(f"Gagal membatalkan tugas: {response.code} - {response.message}")

# Alur eksekusi utama.
if __name__ == "__main__":
    task = create_async_task()
    wait_for_completion(task)

Contoh respons

  1. Contoh respons saat membuat tugas

    {
        "status_code": 200,
        "request_id": "4fb3050f-de57-4a24-84ff-e37ee5xxxxxx",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": null,
            "audio": null,
            "task_id": "127ec645-118f-4884-955d-0eba8dxxxxxx",
            "task_status": "PENDING"
        },
        "usage": {
            "input_tokens": 0,
            "output_tokens": 0,
            "characters": 0
        }
    }
  2. Contoh respons saat menanyakan hasil tugas

    URL berlaku selama 24 jam. Unduh gambar segera.
    {
        "status_code": 200,
        "request_id": "3b99aae5-d26f-9059-8dd0-ee9ca4804xxx",
        "code": null,
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "audio": null,
            "task_id": "127ec645-118f-4884-955d-0eba8dxxxxxx",
            "task_status": "SUCCEEDED",
            "submit_time": "2026-03-31 22:58:47.646",
            "scheduled_time": "2026-03-31 22:58:47.683",
            "end_time": "2026-03-31 22:58:59.642",
            "finished": true
        },
        "usage": {
            "input_tokens": 18711,
            "output_tokens": 2,
            "characters": 0,
            "size": "2985*1405",
            "total_tokens": 18713,
            "image_count": 1
        }
    }

Java

Contoh permintaan

import com.alibaba.dashscope.aigc.imagegeneration.*;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Pengeditan Gambar wan2.7-image-pro - Contoh Pemanggilan Asinkron
 */
public class Main {

    static {
        // URL berikut adalah untuk wilayah Singapura. URL dasar berbeda-beda tergantung wilayah.
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: apiKey="sk-xxx"
    // Kunci API berbeda-beda tergantung wilayah. Untuk mendapatkan Kunci API, kunjungi: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    // --- Fungsi encoding Base64 ---
    // Format encoding Base64 adalah data:{MIME_type};base64,{base64_data}
    public static String encodeFile(String filePath) throws IOException {
        byte[] fileContent = Files.readAllBytes(Paths.get(filePath));
        String base64String = Base64.getEncoder().encodeToString(fileContent);
        String mimeType = Files.probeContentType(Paths.get(filePath));
        return "data:" + mimeType + ";base64," + base64String;
    }

    public static void asyncCall() throws ApiException, NoApiKeyException, UploadFileException, IOException {
        /*
         * Deskripsi metode input gambar:
         * Tiga metode input gambar disediakan di bawah ini. Anda dapat memilih salah satunya.
         * 1. Gunakan URL publik - Cocok untuk gambar yang dapat diakses publik.
         * 2. Gunakan file lokal - Cocok untuk pengembangan dan pengujian lokal.
         * 3. Gunakan encoding Base64 - Cocok untuk skenario yang melibatkan gambar privat atau memerlukan transmisi terenkripsi.
         */
        // [Metode 1] Gunakan URL gambar publik
        String image1 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp";
        String image2 = "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp";

        // [Metode 2] Gunakan file lokal (mendukung jalur absolut dan relatif)
        // Format yang diperlukan: file:// + jalur file
        // String image1 = "file:///path/to/your/car.png";
        // String image2 = "file:///path/to/your/paint.png";

        // [Metode 3] Gunakan gambar yang di-encode Base64
        // String image1 = encodeFile("/path/to/your/car.png");
        // String image2 = encodeFile("/path/to/your/paint.png");

        // Bangun pesan input multi-gambar
        ImageGenerationMessage message = ImageGenerationMessage.builder()
                .role("user")
                .content(Arrays.asList(
                        // Mendukung input multi-gambar. Anda dapat memberikan beberapa gambar referensi.
                        Collections.singletonMap("text", "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"),
                        Collections.singletonMap("image", image1),
                        Collections.singletonMap("image", image2)
                )).build();

        ImageGenerationParam param = ImageGenerationParam.builder()
                .apiKey(apiKey)
                .model("wan2.7-image-pro")
                .n(1)
                .size("2K") // Model wan2.7-image-pro hanya mendukung resolusi 4K untuk generasi teks-ke-gambar. Untuk pengeditan gambar dan generasi gambar komposit, resolusi maksimum yang didukung adalah 2K.
                .messages(Arrays.asList(message))
                .build();

        ImageGeneration imageGeneration = new ImageGeneration();
        ImageGenerationResult result = null;
        try {
            System.out.println("---panggilan asinkron untuk pengeditan gambar, membuat tugas----");
            result = imageGeneration.asyncCall(param);
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            throw new RuntimeException(e.getMessage());
        }
        System.out.println("Hasil pembuatan tugas:");
        System.out.println(JsonUtils.toJson(result));

        String taskId = result.getOutput().getTaskId();
        // Tunggu hingga tugas selesai
        waitTask(taskId);
    }

    public static void waitTask(String taskId) throws ApiException, NoApiKeyException, IOException {
        ImageGeneration imageGeneration = new ImageGeneration();
        System.out.println("\n---menunggu penyelesaian tugas----");
        ImageGenerationResult result = imageGeneration.wait(taskId, apiKey);
        // Ambil URL gambar hasil dan simpan ke file lokal
        for (int i = 0; i < result.getOutput().getChoices().size(); i++) {
            List<Map<String, Object>> contents = result.getOutput().getChoices().get(i)
                    .getMessage().getContent();
            for (int j = 0; j < contents.size(); j++) {
                if ("image".equals(contents.get(j).get("type"))) {
                    String imageUrl = (String) contents.get(j).get("image");
                    String fileName = "output_" + i + "_" + j + ".png";
                    // URL hasil berlaku selama 24 jam. Unduh gambar tepat waktu.
                    try (InputStream in = new URL(imageUrl).openStream()) {
                        Files.copy(in, Paths.get(fileName), StandardCopyOption.REPLACE_EXISTING);
                    }
                    System.out.println("Gambar disimpan ke " + fileName);
                }
            }
        }
    }

    public static void main(String[] args) throws ApiException, NoApiKeyException, UploadFileException, IOException {
        asyncCall();
    }
}

Contoh respons

  1. Contoh respons saat membuat tugas

    {
        "requestId": "ccf4b2f4-bf30-9e13-9461-3a28c6a7bxxx",
        "output": {
            "task_id": "8811b4a4-00ac-4aa2-a2fd-017d3b90cxxx",
            "task_status": "PENDING"
        },
        "status_code": 200,
        "code": "",
        "message": ""
    }
  2. Contoh respons saat menanyakan hasil tugas

    URL berlaku selama 24 jam. Simpan segera.
    {
        "requestId": "60a08540-f1c1-9e76-8cd3-d5949db8cxxx",
        "usage": {
            "input_tokens": 18711,
            "output_tokens": 2,
            "total_tokens": 18713,
            "image_count": 1,
            "size": "2985*1405"
        },
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "image": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/xxxxxx.png?Expires=xxxxxx",
                                "type": "image"
                            }
                        ]
                    }
                }
            ],
            "task_id": "8811b4a4-00ac-4aa2-a2fd-017d3b90cxxx",
            "task_status": "SUCCEEDED",
            "finished": true,
            "submit_time": "2026-03-31 19:57:58.840",
            "scheduled_time": "2026-03-31 19:57:58.877",
            "end_time": "2026-03-31 19:58:11.563"
        },
        "status_code": 200,
        "code": "",
        "message": ""
    }

curl

Langkah 1: Buat tugas untuk mendapatkan ID tugas

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/image-generation/generation' \
    --header 'Content-Type: application/json' \
    --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
    --header "X-DashScope-Async: enable" \
    --data '{
        "model": "wan2.7-image-pro",
        "input": {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp"},
                        {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp"},
                        {"text": "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"}
                    ]
                }
            ]
        },
        "parameters": {
            "size": "2K",
            "n": 1,
            "watermark": false
        }
    }'
    

Contoh respons

{
    "output": {
        "task_status": "PENDING",
        "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
    },
    "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

Langkah 2: Tanyakan hasil berdasarkan ID tugas

Gunakan task_id yang diperoleh pada langkah sebelumnya untuk mem-poll status tugas melalui API hingga task_status menjadi SUCCEEDED atau FAILED.

Ganti {task_id} dengan nilai task_id yang dikembalikan oleh panggilan API sebelumnya. task_id berlaku untuk kueri selama 24 jam.

curl -X GET https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/{task_id} \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

Contoh respons

URL gambar berlaku selama 24 jam. Unduh gambar segera.
{
    "request_id": "810fa5f5-334c-91f3-aaa4-ed89cf0caxxx",
    "output": {
        "task_id": "a81ee7cb-014c-473d-b842-76e98311cxxx",
        "task_status": "SUCCEEDED",
        "submit_time": "2026-03-26 17:16:01.663",
        "scheduled_time": "2026-03-26 17:16:01.716",
        "end_time": "2026-03-26 17:16:22.961",
        "finished": true,
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "image": "https://dashscope-xxx.oss-xxx.aliyuncs.com/xxx.png?Expires=xxx",
                            "type": "image"
                        }
                    ]
                }
            }
        ]
    },
    "usage": {
        "size": "2976*1408",
        "total_tokens": 11017,
        "image_count": 1,
        "output_tokens": 2,
        "input_tokens": 11015
    }
}

wan2.5-i2i-preview menggunakan titik akhir dan parameter API yang berbeda.

Klik untuk melihat contoh pemanggilan untuk wan2.5-i2i-preview

Panggilan sinkron

Penting

Pastikan versi SDK Python DashScope minimal 1.25.2 dan versi SDK Java DashScope minimal 2.22.2.

Versi SDK yang usang dapat memicu error "url error, please check url!". Instal atau upgrade SDK.

Python

Contoh ini mendukung tiga metode input gambar: URL publik, encoding Base64, dan jalur file lokal.

Contoh permintaan
import base64
import mimetypes
from http import HTTPStatus
from urllib.parse import urlparse, unquote
from pathlib import PurePosixPath

import dashscope
import requests
from dashscope import ImageSynthesis
import os

# URL berikut adalah untuk wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key="sk-xxx"
# Kunci API berbeda antara Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

# --- Input gambar: encoding Base64 ---
# Format Base64: data:{MIME_type};base64,{base64_data}
def encode_file(file_path):
    mime_type, _ = mimetypes.guess_type(file_path)
    if not mime_type or not mime_type.startswith("image/"):
        raise ValueError("Format gambar tidak didukung atau tidak dikenali")
    with open(file_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    return f"data:{mime_type};base64,{encoded_string}"

"""
Metode input gambar:
Pilih salah satu dari berikut:

1. URL Publik — terbaik untuk gambar yang dapat diakses publik
2. File Lokal — terbaik untuk pengembangan dan pengujian lokal
3. Encoding Base64 — terbaik untuk gambar privat atau transmisi aman
"""

# [Metode 1] URL gambar publik
image_url_1 = "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp"
image_url_2 = "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"

# [Metode 2] File lokal (mendukung jalur absolut dan relatif)
# Format: file:// + jalur file
# Contoh (jalur absolut):
# image_url_1 = "file://" + "/path/to/your/image_1.png"     # Linux/macOS
# image_url_2 = "file://" + "C:/path/to/your/image_2.png"  # Windows
# Contoh (jalur relatif):
# image_url_1 = "file://" + "./image_1.png"                 # Sesuaikan dengan jalur Anda
# image_url_2 = "file://" + "./image_2.png"                # Sesuaikan dengan jalur Anda

# [Metode 3] Gambar yang di-encode Base64
# image_url_1 = encode_file("./image_1.png")               # Sesuaikan dengan jalur Anda
# image_url_2 = encode_file("./image_2.png")              # Sesuaikan dengan jalur Anda

print('----panggilan sinkron, mohon tunggu sebentar----')
rsp = ImageSynthesis.call(api_key=api_key,
                          model="wan2.5-i2i-preview",
                          prompt="Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.",
                          images=[image_url_1, image_url_2],
                          negative_prompt="",
                          n=1,
                          # size="1280*1280",
                          prompt_extend=True,
                          watermark=False,
                          seed=12345)
print('response: %s' % rsp)
if rsp.status_code == HTTPStatus.OK:
    # Simpan gambar ke direktori saat ini
    for result in rsp.output.results:
        file_name = PurePosixPath(unquote(urlparse(result.url).path)).parts[-1]
        with open('./%s' % file_name, 'wb+') as f:
            f.write(requests.get(result.url).content)
else:
    print('sync_call Gagal, status_code: %s, code: %s, message: %s' %
          (rsp.status_code, rsp.code, rsp.message))
Contoh respons
URL gambar berlaku selama 24 jam. Unduh gambar segera.
{
    "status_code": 200,
    "request_id": "8ad45834-4321-44ed-adf5-xxxxxx",
    "code": null,
    "message": "",
    "output": {
        "task_id": "3aff9ebd-35fc-4339-98a3-xxxxxx",
        "task_status": "SUCCEEDED",
        "results": [
            {
                "url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                "orig_prompt": "Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.",
                "actual_prompt": "Tempatkan jam alarm biru dari gambar 1 di sebelah kanan vas bunga di atas meja makan pada gambar 2, dekat tepi taplak meja. Pastikan jam menghadap kamera dan sejajar dengan permukaan meja, dengan proyeksi bayangan alami."
            }
        ],
        "submit_time": "2025-10-23 16:18:16.009",
        "scheduled_time": "2025-10-23 16:18:16.040",
        "end_time": "2025-10-23 16:19:09.591",
        "task_metrics": {
            "TOTAL": 1,
            "FAILED": 0,
            "SUCCEEDED": 1
        }
    },
    "usage": {
        "image_count": 1
    }
}

Java

Contoh ini mendukung tiga metode input gambar: URL publik, encoding Base64, dan jalur file lokal.

Contoh permintaan
// Copyright (c) Alibaba, Inc. and its affiliates.

import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;

public class Image2Image {

    static {
        // URL berikut adalah untuk wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: apiKey="sk-xxx"
    // Kunci API berbeda antara Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    /**
     * Metode input gambar: pilih salah satu
     *
     * 1. URL Publik — terbaik untuk gambar yang dapat diakses publik
     * 2. File Lokal — terbaik untuk pengembangan dan pengujian lokal
     * 3. Encoding Base64 — terbaik untuk gambar privat atau transmisi aman
     */

    // [Metode 1] URL Publik
    static String imageUrl_1 = "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp";
    static String imageUrl_2 = "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp";

    // [Metode 2] Jalur file lokal (file://+jalur absolut atau file:///+jalur absolut)
    // static String imageUrl_1 = "file://" + "/your/path/to/image_1.png";    // Linux/macOS
    // static String imageUrl_2 = "file:///" + "C:/your/path/to/image_2.png";  // Windows

    // [Metode 3] Encoding Base64
    // static String imageUrl_1 = encodeFile("/your/path/to/image_1.png");
    // static String imageUrl_2 = encodeFile("/your/path/to/image_2.png");

    // Daftar gambar untuk diedit
    static List<String> imageUrls = new ArrayList<>();
    static {
        imageUrls.add(imageUrl_1);
        imageUrls.add(imageUrl_2);
    }

    public static void syncCall() {
        // Atur parameter
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("prompt_extend", true);
        parameters.put("watermark", false);
        parameters.put("seed", 12345);

        ImageSynthesisParam param =
                ImageSynthesisParam.builder()
                        .apiKey(apiKey)
                        .model("wan2.5-i2i-preview")
                        .prompt("Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.")
                        .images(imageUrls)
                        .n(1)
                         //.size("1280*1280")
                        .negativePrompt("")
                        .parameters(parameters)
                        .build();

        ImageSynthesis imageSynthesis = new ImageSynthesis();
        ImageSynthesisResult result = null;
        try {
            System.out.println("---panggilan sinkron, mohon tunggu sebentar----");
            result = imageSynthesis.call(param);
        } catch (ApiException | NoApiKeyException e){
            throw new RuntimeException(e.getMessage());
        }
        System.out.println(JsonUtils.toJson(result));
    }

    /**
     * Encode file sebagai string Base64
     * @param filePath Jalur file
     * @return String Base64 dalam format data:{MIME_type};base64,{base64_data}
     */
    public static String encodeFile(String filePath) {
        Path path = Paths.get(filePath);
        if (!Files.exists(path)) {
            throw new IllegalArgumentException("File tidak ditemukan: " + filePath);
        }
        // Deteksi jenis MIME
        String mimeType = null;
        try {
            mimeType = Files.probeContentType(path);
        } catch (IOException e) {
            throw new IllegalArgumentException("Tidak dapat mendeteksi jenis file: " + filePath);
        }
        if (mimeType == null || !mimeType.startsWith("image/")) {
            throw new IllegalArgumentException("Format gambar tidak didukung atau tidak dikenali");
        }
        // Baca file dan encode
        byte[] fileBytes = null;
        try{
            fileBytes = Files.readAllBytes(path);
        } catch (IOException e) {
            throw new IllegalArgumentException("Tidak dapat membaca file: " + filePath);
        }

        String encodedString = Base64.getEncoder().encodeToString(fileBytes);
        return "data:" + mimeType + ";base64," + encodedString;
    }

    public static void main(String[] args) {
        syncCall();
    }
}
Contoh respons
URL gambar berlaku selama 24 jam. Unduh gambar segera.
{
    "request_id": "d362685b-757f-4eac-bab5-xxxxxx",
    "output": {
        "task_id": "bfa7fc39-3d87-4fa7-b1e6-xxxxxx",
        "task_status": "SUCCEEDED",
        "results": [
            {
                "orig_prompt": "Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.",
                "actual_prompt": "Tempatkan jam alarm biru dari gambar 1 di sebelah kanan vas bunga di atas meja makan pada gambar 2, dekat tepi taplak meja. Pastikan jam menghadap kamera dan sejajar dengan vas.",
                "url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"
            }
        ],
        "task_metrics": {
            "TOTAL": 1,
            "SUCCEEDED": 1,
            "FAILED": 0
        }
    },
    "usage": {
        "image_count": 1
    }
}

Panggilan asinkron

Penting

Pastikan versi SDK Python DashScope minimal 1.25.2 dan versi SDK Java DashScope minimal 2.22.2.

Versi SDK yang usang dapat memicu error "url error, please check url!". Instal atau upgrade SDK.

Python

Contoh ini menggunakan URL publik untuk mengirimkan gambar.

Contoh permintaan

import os
from http import HTTPStatus
from urllib.parse import urlparse, unquote
from pathlib import PurePosixPath
import dashscope
import requests
from dashscope import ImageSynthesis

# URL berikut adalah untuk wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: api_key="sk-xxx"
# Kunci API berbeda antara Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
api_key = os.getenv("DASHSCOPE_API_KEY")

# URL gambar publik
image_url_1 = "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp"
image_url_2 = "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"


def async_call():
    print('----buat tugas----')
    task_info = create_async_task()
    print('----tunggu tugas----')
    wait_async_task(task_info)


# Buat tugas asinkron
def create_async_task():
    rsp = ImageSynthesis.async_call(api_key=api_key,
                                    model="wan2.5-i2i-preview",
                                    prompt="Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.",
                                    images=[image_url_1, image_url_2],
                                    negative_prompt="",
                                    n=1,
                                    # size="1280*1280",
                                    prompt_extend=True,
                                    watermark=False,
                                    seed=12345)
    print(rsp)
    if rsp.status_code == HTTPStatus.OK:
        print(rsp.output)
    else:
        print('Gagal, status_code: %s, code: %s, message: %s' %
              (rsp.status_code, rsp.code, rsp.message))
    return rsp


# Tunggu hingga tugas asinkron selesai
def wait_async_task(task):
    rsp = ImageSynthesis.wait(task=task, api_key=api_key)
    print(rsp)
    if rsp.status_code == HTTPStatus.OK:
        print(rsp.output)
        # Simpan file ke direktori saat ini
        for result in rsp.output.results:
            file_name = PurePosixPath(unquote(urlparse(result.url).path)).parts[-1]
            with open('./%s' % file_name, 'wb+') as f:
                f.write(requests.get(result.url).content)
    else:
        print('Gagal, status_code: %s, code: %s, message: %s' %
              (rsp.status_code, rsp.code, rsp.message))


# Ambil status tugas asinkron
def fetch_task_status(task):
    status = ImageSynthesis.fetch(task=task, api_key=api_key)
    print(status)
    if status.status_code == HTTPStatus.OK:
        print(status.output.task_status)
    else:
        print('Gagal, status_code: %s, code: %s, message: %s' %
              (status.status_code, status.code, status.message))


# Batalkan tugas asinkron. Hanya tugas dengan status PENDING yang dapat dibatalkan.
def cancel_task(task):
    rsp = ImageSynthesis.cancel(task=task, api_key=api_key)
    print(rsp)
    if rsp.status_code == HTTPStatus.OK:
        print(rsp.output.task_status)
    else:
        print('Gagal, status_code: %s, code: %s, message: %s' %
              (rsp.status_code, rsp.code, rsp.message))


if __name__ == '__main__':
    async_call()

Contoh respons

1. Respons saat membuat tugas

{
	"status_code": 200,
	"request_id": "31b04171-011c-96bd-ac00-f0383b669cc7",
	"code": "",
	"message": "",
	"output": {
		"task_id": "4f90cf14-a34e-4eae-xxxxxxxx",
		"task_status": "PENDING",
		"results": []
	},
	"usage": null
}

2. Respons saat menanyakan hasil tugas

URL gambar kedaluwarsa setelah 24 jam. Unduh gambar segera.
{
    "status_code": 200,
    "request_id": "8ad45834-4321-44ed-adf5-xxxxxx",
    "code": null,
    "message": "",
    "output": {
        "task_id": "3aff9ebd-35fc-4339-98a3-xxxxxx",
        "task_status": "SUCCEEDED",
        "results": [
            {
                "url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx",
                "orig_prompt": "Place the alarm clock from image 1 beside the vase on the dining table in image 2.",
                "actual_prompt": "Place the blue alarm clock from image 1 to the right of the vase on the dining table in image 2, near the edge of the tablecloth. Keep the clock facing the camera and parallel to the tabletop, with natural shadow projection."
            }
        ],
        "submit_time": "2025-10-23 16:18:16.009",
        "scheduled_time": "2025-10-23 16:18:16.040",
        "end_time": "2025-10-23 16:19:09.591",
        "task_metrics": {
            "TOTAL": 1,
            "FAILED": 0,
            "SUCCEEDED": 1
        }
    },
    "usage": {
        "image_count": 1
    }
}

Java

Contoh ini menggunakan URL publik untuk mengirimkan gambar secara default.

Contoh permintaan

// Copyright (c) Alibaba, Inc. and its affiliates.

import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesis;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisListResult;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisParam;
import com.alibaba.dashscope.aigc.imagesynthesis.ImageSynthesisResult;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.task.AsyncTaskListParam;
import com.alibaba.dashscope.utils.Constants;
import com.alibaba.dashscope.utils.JsonUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Image2Image {

    static {
        // URL berikut adalah untuk wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }

    // Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan: apiKey="sk-xxx"
    // Kunci API berbeda antara Singapura dan Beijing. Dapatkan Kunci API: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    static String apiKey = System.getenv("DASHSCOPE_API_KEY");

    // URL publik
    static String imageUrl_1 = "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp";
    static String imageUrl_2 = "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp";

    // Daftar gambar untuk diedit
    static List<String> imageUrls = new ArrayList<>();
    static {
        imageUrls.add(imageUrl_1);
        imageUrls.add(imageUrl_2);
    }

    public static void asyncCall() {
        // Atur parameter
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("prompt_extend", true);
        parameters.put("watermark", false);
        parameters.put("seed", 12345);

        ImageSynthesisParam param =
                ImageSynthesisParam.builder()
                        .apiKey(apiKey)
                        .model("wan2.5-i2i-preview")
                        .prompt("Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.")
                        .images(imageUrls)
                        .n(1)
                        //.size("1280*1280")
                        .negativePrompt("")
                        .parameters(parameters)
                        .build();
        ImageSynthesis imageSynthesis = new ImageSynthesis();
        ImageSynthesisResult result = null;
        try {
            System.out.println("---panggilan asinkron, mohon tunggu sebentar----");
            result = imageSynthesis.asyncCall(param);
        } catch (ApiException | NoApiKeyException e){
            throw new RuntimeException(e.getMessage());
        }

        System.out.println(JsonUtils.toJson(result));

        String taskId = result.getOutput().getTaskId();

        System.out.println("taskId=" + taskId);


        try {
            result = imageSynthesis.wait(taskId, apiKey);
        } catch (ApiException | NoApiKeyException e){
            throw new RuntimeException(e.getMessage());
        }
        System.out.println(JsonUtils.toJson(result));
        System.out.println(JsonUtils.toJson(result.getOutput()));
    }

    public static void listTask() throws ApiException, NoApiKeyException {
        ImageSynthesis is = new ImageSynthesis();
        AsyncTaskListParam param = AsyncTaskListParam.builder().build();
        param.setApiKey(apiKey);
        ImageSynthesisListResult result = is.list(param);
        System.out.println(result);
    }

    public void fetchTask(String taskId) throws ApiException, NoApiKeyException {
        ImageSynthesis is = new ImageSynthesis();
        // Jika DASHSCOPE_API_KEY diatur sebagai variabel lingkungan, apiKey dapat dikosongkan.
        ImageSynthesisResult result = is.fetch(taskId, apiKey);
        System.out.println(result.getOutput());
        System.out.println(result.getUsage());
    }


    public static void main(String[] args) {
        asyncCall();
    }
}

Contoh respons

1. Respons saat membuat tugas

{
	"request_id": "5dbf9dc5-4f4c-9605-85ea-542f97709ba8",
	"output": {
		"task_id": "7277e20e-aa01-4709-xxxxxxxx",
		"task_status": "PENDING"
	}
}

2. Respons saat menanyakan hasil tugas

URL gambar kedaluwarsa setelah 24 jam. Unduh gambar segera.
{
    "request_id": "d362685b-757f-4eac-bab5-xxxxxx",
    "output": {
        "task_id": "bfa7fc39-3d87-4fa7-b1e6-xxxxxx",
        "task_status": "SUCCEEDED",
        "results": [
            {
                "orig_prompt": "Letakkan jam weker dari gambar 1 di samping vas di atas meja makan di gambar 2.",
                "actual_prompt": "Letakkan jam weker biru dari gambar 1 di sebelah kanan vas di atas meja makan di gambar 2, di dekat tepi taplak meja. Pastikan jam menghadap kamera dan sejajar dengan vas.",
                "url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"
            }
        ],
        "task_metrics": {
            "TOTAL": 1,
            "SUCCEEDED": 1,
            "FAILED": 0
        }
    },
    "usage": {
        "image_count": 1
    }
}

curl

Ini adalah proses dua langkah: buat tugas, lalu ambil hasilnya.

Catatan
  • Untuk panggilan asinkron, atur parameter header X-DashScope-Async ke enable.

  • task_id untuk tugas asinkron berlaku selama 24 jam. Setelah kedaluwarsa, status tugas menjadi UNKNOWN.

Langkah 1: Kirim permintaan untuk membuat tugas

Permintaan ini mengembalikan ID tugas (task_id).

Contoh permintaan
 curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis' \
    -H 'X-DashScope-Async: enable' \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
    "model": "wan2.5-i2i-preview",
    "input": {
        "prompt": "Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2.",
        "images": [
            "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp",
            "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
        ]
    },
    "parameters": {
        "n": 1
    }
}'

Contoh respons

{
    "output": {
        "task_status": "PENDING",
        "task_id": "0385dc79-5ff8-4d82-bcb6-xxxxxx"
    },
    "request_id": "4909100c-7b5a-9f92-bfe5-xxxxxx"
}

Langkah 2: Tanyakan hasil berdasarkan ID tugas

Gunakan task_id yang diperoleh pada langkah sebelumnya untuk mem-poll status tugas melalui API hingga task_status menjadi SUCCEEDED atau FAILED.

Contoh permintaan

Ganti {task_id} dengan nilai task_id yang dikembalikan oleh panggilan API sebelumnya. task_id berlaku untuk kueri selama 24 jam.

curl -X GET https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/tasks/{task_id} \
--header "Authorization: Bearer $DASHSCOPE_API_KEY"

Contoh respons

URL gambar berlaku selama 24 jam. Unduh gambar segera.
{
    "request_id": "d1f2a1be-9c58-48af-b43f-xxxxxx",
    "output": {
        "task_id": "7f4836cd-1c47-41b3-b3a4-xxxxxx",
        "task_status": "SUCCEEDED",
        "submit_time": "2025-09-23 22:14:10.800",
        "scheduled_time": "2025-09-23 22:14:10.825",
        "end_time": "2025-09-23 22:15:23.456",
        "results": [
            {
                "orig_prompt": "Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2",
                "url": "https://dashscope-result-sh.oss-cn-shanghai.aliyuncs.com/xxx.png?Expires=xxx"
            }
        ],
        "task_metrics": {
            "TOTAL": 1,
            "FAILED": 0,
            "SUCCEEDED": 1
        }
    },
    "usage": {
        "image_count": 1
    }
}

Pemilihan model

  • wan2.7-image-pro dan wan2.7-image (direkomendasikan): Terbaik untuk pengeditan presisi atau menghasilkan beberapa gambar koheren.

    • Pengeditan lokal presisi: Pilih area spesifik untuk memindahkan, mengganti, atau menambah elemen. Ideal untuk retouching e-commerce dan penyesuaian desain.

    • Generasi multi-panel: Hasilkan beberapa gambar bergaya konsisten dalam satu panggilan. Ideal untuk storyboard komik dan seri produk.

  • wan2.6-image: Pengeditan bergaya dengan teks/gambar campuran atau beberapa referensi. Menghasilkan teks dalam gambar dan menerima hingga empat gambar referensi.

  • wan2.5-i2i-preview: Cocok untuk pengeditan gambar sederhana dan fusi multi-gambar.

Untuk spesifikasi input dan output setiap model, lihat Spesifikasi gambar input dan Resolusi gambar output.

Galeri demo

Set gambar-ke-gambar

Input image

Output image

East Asian male portrait, 20 years old, curly medium-length hair, artistic temperament

output

wan_image_reqid_57d7a71c-1932-4de8-8c32-be0f3fd5696f_n1-2026-03-31-19-32-44

output

Klik untuk melihat prompt

Kasus 1: Pemotretan

Pengaturan karakter dasar: Pria Asia Timur berusia 20 tahun dengan rambut keriting panjang sedang, temperamen artistik, fitur wajah tegas, dan mata halus. Mengenakan kaos putih sederhana atau kemeja biru muda, memancarkan aura muda dan alami.
1. Gaya Cendekiawan Era Republik
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, mengenakan jubah panjang cyan tua dan kacamata bulat berbingkai emas, memegang kipas lipat. Latar belakang adalah ruang belajar Shanghai lama dengan rak buku kayu, nuansa kuning hangat, tekstur film retro, pencahayaan samping lembut, dan debu yang menari dalam sorotan cahaya, menciptakan suasana budaya dan tenang. Format medium Hasselblad, lensa 85mm, resolusi tinggi, gradasi warna sinematik, gaya Wong Kar-wai.
Properti: Kipas lipat / Buku berjilid benang / Kacamata bingkai bulat
Skema warna: Kuning hangat / Cyan tua / Sepia
2. Gaya Pria Inggris
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, mengenakan setelan jas tiga potong tweed abu-abu tua dan jam tangan mekanik vintage, memegang segelas anggur merah dan memandanginya. Latar belakang adalah perpustakaan klasik atau klub pribadi dengan sofa kulit gelap, pencahayaan Rembrandt, dan suasana gelap, elegan, dan bangsawan. Pandangannya dingin, dengan detail kaya dan tekstur jelas, memancarkan temperamen aristokrat Inggris. Resolusi 8k, bidikan ala majalah mode.
Properti: Gelas anggur / Pipa / Jam tangan mekanik
Skema warna: Abu-abu tua / Burgundy / Emas tua
3. Gaya Retro Hong Kong 90-an
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, mengenakan jaket denim yang sudah dicuci atau kemeja bermotif bunga, dengan rambut agak berantakan dan tangan disilangkan. Latar belakang adalah jalan dengan papan neon di malam hari, dengan titik cahaya buram, butiran tinggi, dan warna kaya, menampilkan benturan warna merah dan biru. Gaya Wong Kar-wai, emosional, dengan efek kilat langsung, dan suasana nostalgia. [Bidikan tubuh penuh].
Skema warna: Merah neon / Biru tua / Hijau film
4. Gaya Zen Tiongkok Baru
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, dengan senyum tipis memperlihatkan gigi, mengenakan kemeja putih modifikasi dengan kerah tegak Tiongkok, memegang cabang bunga plum. Latar belakang adalah dinding kosong minimalis atau hutan bambu, dengan sinar matahari menciptakan bayangan bercak di dinding. Skema warna sejuk dan tenang, mewujudkan estetika Timur. Kulit tembus cahaya, butiran tinggi dan finish matte. Komposisi sederhana, dengan lapisan cahaya dan bayangan yang kaya. Fotografi kelas atas, suasana Zen.
Properti: Cabang bunga plum
Skema warna: Putih / Hijau tua / Abu-abu muda
5. Gaya Seniman Vintage
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, mengenakan kemeja putih bernoda cat dan celemek kulit coklat, memegang kuas atau palet. Latar belakang adalah studio bersih dengan cahaya terang dan cahaya serta bayangan berwarna-warni. Ekspresinya fokus, memandang cat di tangannya, bukan ke kamera. Rambutnya agak berantakan, dengan bakat artistik, skema warna impresionis, dan tekstur kuat.
Properti: Kuas / Palet / Buku sketsa
Skema warna: Cahaya hangat / Cat berwarna-warni / Coklat
6. Gaya Noir Klasik Hitam-Putih
Prompt:
[Deskripsi wajah dasar] Penampilan karakter berdasarkan gambar referensi 1, mengenakan sweter turtleneck hitam, memegang rokok, dan mengenakan topi fedora hitam. Latar belakang adalah tangga atau lorong dengan bayangan bersilangan. Fotografi hitam-putih kontras tinggi, pencahayaan keras, bayangan kuat, kesan misterius, dan gaya detektif hard-boiled. Kontur wajah tajam, dengan tekstur kulit sangat jelas. Still film klasik, nuansa abadi, close-up profil samping, fotografi artistik.
Properti: Tongkat / Fedora / Kacamata hitam
Skema warna: Hitam dan putih / Kontras tinggi

Kasus 2: Desain visual

Gambar 1: Gambar sampul visual utama fotografi produk kelas komersial, komposisi panorama tampak depan. Sepasang headphone over-ear nirkabel retro-futuristik melayang di atas bentuk plester geometris, menampilkan estetika simetris sempurna. Materialnya adalah logam emas sampanye dan cangkang putih krem. Latar belakang adalah cahaya dan bayangan dalam ruangan hangat yang sangat blur, dengan cahaya lembut menggaris siluet produk. Ruang putih dalam gambar menciptakan rasa pernapasan yang kuat, menunjukkan pengalaman pendengaran yang tenang. Resolusi ultra-tinggi 8k, nuansa minimalis dan premium.
Gambar 2: Bidikan makro 100mm pada detail material produk, fokus dekat pada sambungan lengan teleskopik headphone. Menunjukkan dengan jelas tekstur aluminium alloy emas sampanye yang disikat dan chamfer yang dipotong presisi CNC. Backlight tajam menciptakan highlight bintang di tepi logam. Latar belakang gelap untuk menekankan presisi industri logam. Kualitas gambar sangat tajam tanpa noise.
Gambar 3: Bidikan makro ekstrem pada material, fokus pada permukaan earcup kulit protein berwarna mocha. Pencahayaan samping mengungkap tekstur pori halus kulit, kerutan lembut dari tekanan, dan detail lubang ventilasi, menyampaikan kenyamanan ramah kulit dan elastisitas tertinggi. Cahaya dan bayangan kaya lapisan, dan skema warna hangat dan lembab. Fotografi makro resolusi ultra-tinggi.
Gambar 4: Tampilan ledakan artistik produk, menunjukkan unit suara internal, chip peredam bising, modul baterai, dan panel dekoratif kayu kenari eksternal serta rangka logam headphone retro-futuristik dalam keadaan tersuspensi dan dibongkar. Latar belakang adalah biru tech dalam, dan komponen internal memiliki tekstur teknologi holografik semi-transparan, menekankan kombinasi kerajinan presisi internal dan teknologi modern. Gaya poster komersial berteknologi tinggi.
Gambar 5: Bidikan humanis 35mm pada skenario pemakaian, close-up pada rahang dan leher model, menunjukkan kecocokan sempurna headphone emas sampanye. Cahaya matahari hangat alami dari samping-belakang menciptakan rim light, dengan tepi rambut bercahaya emas. Tekstur kulit model sehat dan alami, menciptakan nuansa gaya hidup mendengarkan musik yang santai dan imersif. Latar belakang adalah lingkungan rumah yang blur.
Gambar 6: Fotografi still life yang menghormati cahaya dan bayangan arsitektur. Headphone ditempatkan di atas meja beton abu-abu minimalis. Cahaya sore masuk melalui tirai, menciptakan bayangan keras bergaris yang memotong tubuh putih krem matte dan bingkai emas sampanye, menciptakan komposisi geometris cahaya dan gelap yang kuat. Ini menyoroti bentuk tiga dimensi tubuh dan kontras material. Benturan nada warna dingin dan hangat, komposisi minimalis.
Gambar 7: Komposisi flat-lay tampak atas yang menunjukkan pilihan warna. Tiga headphone dari seri dengan skema warna berbeda—perak-putih, hitam-emas, dan biru-tembaga—disusun berdampingan. Latar belakang adalah kain felt wol abu-abu bertekstur tinggi. Pencahayaan atas lembut menekankan keragaman desain CMF dan sentuhan halus material. Gambar bersih dan teratur, bergaya majalah desain.
Gambar 8: Fotografi still life potret keluarga gaya hidup merek. Headphone retro-futuristik ditempatkan di samping kotak kulit indah yang serasi. Di atas meja terdapat pemutar piringan hitam, piringan hitam yang berputar, dan secangkir kopi panas. Latar belakang diberi pencahayaan ambient hangat, didominasi nada kayu kenari tua, menyampaikan filosofi merek yang menggabungkan gaya hidup santai dengan kualitas suara high-fidelity. Pencahayaan naratif sinematik.

Pengeditan interaktif

Input image

Output image

image (20)-2026-03-31-19-17-37

image (21)-2026-03-31-19-17-37

Edit berdasarkan gambar 1. Ganti raspberry yang dipilih dalam kotak 1 dengan lemon, raspberry di kotak 2 dengan stroberi, dan raspberry di kotak 3 dengan blueberry. Hasil harus terintegrasi secara harmonis dengan gambar asli, tanpa kotak dan angka referensi, dan pertahankan konten lainnya tetap tidak berubah.

5eecdaf48460cde5f7fd58249809b192a118accde85283f275b8339e1c4c24831b75b38faadcd24bec177c308ebd5304463ca8e345548eb5f551b6ba01cd2c8d2d9b5606fa569ff7ba4077816ac9b801464f65aedbcf494f4fb4c8ed7016461c-combine

5eecdaf48460cde5f7fd58249809b192a118accde85283f275b8339e1c4c24831b75b38faadcd24bec177c308ebd530460436714d0283cee289325430893028097a53a8e5d630fb1c2d4c85d8cbb68a4387575c4b03700344fb4c8ed7016461c-2026-03-31-19-13-38

Tempatkan pola yang dipilih dari gambar 1 ke area yang dipilih di gambar 2.

Fusi multi-gambar

Input image

Output image

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304e9d05d028a65a9ac270ee730e44b8c75c6634a9b9a7a70240d438b02b2f2153dc68966b442378d1d4fb4c8ed7016461c-combine

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd53044b9a1d72dee2f8507ee704b9cef3832907ff1182f52507c9bc4737520762d46a722e658f57cda6524fb4c8ed7016461c-2025-12-29-19-11-31

Ambil potret anak laki-laki dari gambar 1 dan anjing dari gambar 2. Anak laki-laki itu memeluk anjing, dan keduanya sangat bahagia. Pencahayaan studio lembut, latar belakang bertekstur biru.

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304f060ec7a363e318af9bfaaa5e07be972cfc1ea4e21b47637fcdb2dfc53130c40a8efed5defc408a04fb4c8ed7016461c-combine

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304922cbdef3e3c42f83239de6d0f35a8b76f0e38934cc5170f7a908ec12140fb0af6590c72bcf1ba6f4fb4c8ed7016461c-2025-12-29-19-15-53

Ubah warna gaun dari gambar 1 menggunakan warna burung di gambar 2. Jadikan artistik, tetapi pertahankan gaya gaun dan model tetap tidak berubah.

Pelestarian fitur subjek

Input image

Output image

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304448a972b9f2ee7a7aadcc61495f4975a049f009e7721cbc833dc3a8005b1b026a54eaaec109d73484fb4c8ed7016461c-2025-12-29-20-00-21

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304cc1b4a509823c5fb5e60999898811f8b51d7419220a118c9ff82110bc9525725a9ad7338f75985794fb4c8ed7016461c-2025-12-29-20-00-21

Harap hasilkan satu set empat foto Polaroid dengan tema "Perubahan Musim". Setiap foto diambil di lokasi yang sama, di bawah pohon di taman, tetapi menunjukkan pemandangan musim semi, musim panas, musim gugur, dan musim dingin masing-masing. Pakaian orang tersebut juga harus sesuai musim: jaket ringan di musim semi, kemeja lengan pendek di musim panas, mantel trench di musim gugur, dan syal serta mantel tebal di musim dingin. Tempatkan set foto ini di atas meja makan.

Deteksi dan segmentasi

Input image

Output image

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304b025e74206dc2cec5c2e587c3fe6fb135293836c9479220355470da15476dc934b26018061e9db0b4fb4c8ed7016461c-2025-12-29-19-54-33

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd530451385eb561b49b0fe1f2169526b6a7e15bd78940def3c640c801511c349f6df35dceb72f4d3755f94fb4c8ed7016461c-2025-12-29-19-54-33

Deteksi laptop dan jam alarm dalam gambar, gambar Kotak pembatas, dan beri label "laptop" dan "clock".

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd530440256f9add4113787af5d4f3a55469b38ef2422f018076640eb7cb552584c02ee729fcb23fec3bca4fb4c8ed7016461c-2025-12-29-19-54-33

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304f0612d67f5c810ebef958385624ebd17323047aa5d00465d0e35257de5a2ea49d4b375d2e57693fa4fb4c8ed7016461c-2025-12-29-19-54-32

Segmentasi gelas kaca dalam gambar.

Ekstraksi elemen

Input image

Output image

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd53046b83761f1ab18c40e144f5db2b388e5f865ba9a5961d98b2710ce177c6a0f4baff63fe52259c44364fb4c8ed7016461c-2025-12-29-19-48-27

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd53048e2a0d1d2805d92ba8d45a3bd1368528dd76f517b21ad1f545eb4097610838497cbdb5196da94ff54fb4c8ed7016461c-2025-12-29-19-48-27

Ekstrak item pakaian dari foto yang diunggah dan susun dalam tampilan flat-lay pada latar belakang putih murni. Pertahankan detail realistis dan tekstur material. Gaya e-commerce fashion, cocok untuk tampilan pakaian.

Pengeditan teks

Input image

Output image

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd530490f493eca22f34f0197173ddfdef17a04b34cb94813178b9d4eee36d246d3530a3e2fc6258cca0694fb4c8ed7016461c-2025-12-29-19-28-35

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304fe77776567f4ef79cb621289a6fdaa981f3364fe4c7c56265403b5d9d5ac43eaf5931f62db14952f4fb4c8ed7016461c-2025-12-29-19-28-35

Hapus semua Watermark dari gambar.

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd530476e971380812b1b9dbeac68272a27057175499fe84f0781c7b6fa6535f438c67f3556acc8c7324394fb4c8ed7016461c-2025-12-29-19-28-35

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd53047be52c6f41edecdefa77f0d93335d1492f1821b47dff7a1b08f60e99bdafcc84c31e3658fc593c904fb4c8ed7016461c-2025-12-29-19-28-35

Tulis secara kasual "Time for Holiday?" di pasir dengan tangan.

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304fdb284f8d5c8ead814d11890da1a49411a6d9d41ad1bb2a4bf0b93d0bee5d792e8f5b419a3da9d534fb4c8ed7016461c-2025-12-29-19-28-34

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304df1c8787530497f4cc3bee0b84d3ba51d0353fceb8d0518ded6a25e8c0ddfec714f719154ac1c9354fb4c8ed7016461c-2025-12-29-19-28-34

Ubah 18 menjadi 29 dan JUNE menjadi SEPTEMBER.

Pengeditan kamera dan perspektif

Input image

Output image

image (2)-2025-12-29-19-42-44

image (3)-2025-12-29-19-42-44

Pertahankan fitur orang tersebut tetap tidak berubah dan hasilkan tampilan depan, samping, dan belakang.

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd5304a53988b2efdd2fb6b95cb3b1b02701e6ff2c4902170b1ee230a9b4e3726a891c93646d68b821de294fb4c8ed7016461c-2025-12-29-19-42-43

5eecdaf48460cde5544f9fac410016bc2fe4c1b4d23666c075b8339e1c4c24831b75b38faadcd24bec177c308ebd530428783dee341e41eb06234dfb75bd149d774f4850000123559a98bcd7ece97dc4a6c3cefa983ae8ac4fb4c8ed7016461c-2025-12-29-19-42-43

Rekam ulang foto ini dengan lensa fisheye.

Spesifikasi input

Spesifikasi gambar input

Spesifikasi

wan2.7-image-pro, wan2.7-image

wan2.6-image

wan2.5-i2i-preview

Jumlah gambar input

0 hingga 9 (0 bersesuaian dengan mode teks-ke-gambar)

Pengeditan gambar: 1 hingga 4 / Teks dan gambar campuran: 0 hingga 1

1 hingga 3

Format gambar

JPEG, JPG, PNG (saluran alpha tidak didukung), BMP, WEBP

JPEG, JPG, PNG (saluran alpha tidak didukung), BMP, WEBP

JPEG, JPG, PNG (saluran alpha tidak didukung), BMP, WEBP

Kisaran lebar dan tinggi gambar

[240, 8000] piksel

[240, 8000] piksel

[384, 5000] piksel

Ukuran file

≤ 20 MB

≤ 10 MB

≤ 10 MB

Rasio aspek

[1:8, 8:1]

Tanpa batas

[1:4, 4:1]

Urutan input gambar

Nomor gambar dalam prompt bersesuaian dengan posisi array: gambar pertama adalah "image 1", gambar kedua adalah "image 2". Anda juga dapat menggunakan penanda seperti "[image 1]" dan "[image 2]".

{
    "content": [
        {"text": "Instruksi pengeditan, misalnya: Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2"},
        {"image": "https://example.com/image1.png"},
        {"image": "https://example.com/image2.png"}
    ]
}

Input image

Output image

image (19)-转换自-png

Image 1

image (20)-转换自-png

Image 2

04e0fc39-7ad6-41e0-9df9-1f69ac3ce825-转换自-png

Prompt: Pindahkan gambar 1 ke gambar 2

36ed450d-bd54-4169-b13f-3d0f26d9d360-转换自-png

Prompt: Pindahkan gambar 2 ke gambar 1

Metode input gambar

Kirimkan gambar menggunakan salah satu metode berikut:

Metode 1: URL publik

  • Berikan URL gambar HTTP atau HTTPS yang dapat diakses publik.

  • Nilai contoh: https://xxxx/img.png.

  • Gunakan ketika gambar di-host di OSS atau layanan hosting gambar publik.

Metode 2: Encoding Base64

Konversi file gambar ke string yang di-encode Base64 dan format sebagai: data:{MIME_type};base64,{base64_data}.

  • Nilai contoh: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABDg...... (Ini adalah cuplikan karena keterbatasan panjang). Saat melakukan panggilan, kirimkan string lengkap.

  • {base64_data}: String yang di-encode Base64 dari file gambar.

  • {MIME_type}: Jenis media gambar, yang harus sesuai dengan format file.

    Format gambar

    Jenis MIME

    JPEG

    image/jpeg

    JPG

    image/jpeg

    PNG

    image/png

    BMP

    image/bmp

    WEBP

    image/webp

  • Gunakan untuk transmisi gambar lokal, privat, atau terenkripsi.

Contoh kode: Encoding Base64 untuk gambar

import os
import base64
import mimetypes

# Formatnya adalah data:{mime_type};base64,{base64_data}
def encode_file(file_path):
    mime_type, _ = mimetypes.guess_type(file_path)
    with open(file_path, "rb") as image_file:
        encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
    return f"data:{mime_type};base64,{encoded_string}"
        
        
# Panggil fungsi encoding. Ganti "/path/to/your/image.png" dengan jalur ke file gambar lokal Anda, jika tidak kode tidak akan berjalan.
image = encode_file("/path/to/your/image.png")

Metode 3: Jalur file lokal (hanya SDK)

  • SDK Python: Mendukung jalur absolut dan relatif. Aturan jalur file sebagai berikut:

    Sistem

    Input File Path

    Contoh (jalur absolut)

    Contoh (jalur relatif)

    Linux atau macOS

    file://{jalur absolut atau relatif file}

    file:///home/images/test.png

    file://./images/test.png

    Windows

    file://D:/images/test.png

    file://./images/test.png

  • SDK Java: Hanya mendukung jalur absolut. Aturan jalur file sebagai berikut:

    Sistem

    Jalur file input

    Contoh (jalur absolut)

    Linux atau macOS

    file://{jalur absolut file}

    file:///home/images/test.png

    Windows

    file:///{jalur absolut file}

    file:///D:/images/test.png

  • Gunakan untuk pengujian cepat dalam pengembangan lokal.

Fitur utama

1. Mengikuti instruksi (prompt)

Parameter: messages.content.text atau input.prompt (wajib), negative_prompt (opsional).

  • teks atau prompt (Prompt positif): Jelaskan konten, subjek, adegan, gaya, pencahayaan, dan komposisi untuk gambar output.

  • negative_prompt (Prompt negatif): Tentukan konten yang tidak diinginkan, seperti "blurry" atau "extra fingers".

Parameter

wan2.7-image-pro, wan2.7-image

wan2.6-image

wan2.5-i2i-preview

text

Wajib, hingga 5.000 karakter

Wajib, hingga 2.000 karakter

Tidak didukung

prompt

Tidak didukung

Tidak didukung

Wajib, hingga 2.000 karakter

negative_prompt

Tidak didukung

Didukung, hingga 500 karakter

Didukung, hingga 500 karakter

2. Aktifkan penulisan ulang prompt cerdas

Parameter: parameters.prompt_extend (bool, default true).

Memperluas prompt pendek untuk meningkatkan kualitas gambar dengan biaya peningkatan waktu respons.

Praktik terbaik:

  • Aktifkan: Ketika prompt ringkas atau luas.

  • Nonaktifkan: Untuk kontrol detail halus, deskripsi terperinci, atau skenario sensitif latensi. Atur prompt_extend ke false.

Parameter

wan2.7-image-pro, wan2.7-image

wan2.6-image

wan2.5-i2i-preview

prompt_extend

Tidak didukung

Didukung (hanya mode pengeditan gambar)

Didukung

3. Atur resolusi gambar output

Parameter: parameters.size (string), dalam format "lebar*tinggi".

Parameter

wan2.7-image-pro, wan2.7-image

wan2.6-image

wan2.5-i2i-preview

size

Metode 1: Tentukan resolusi gambar output (direkomendasikan)

Dalam mode pengeditan (dengan setidaknya satu gambar dikirimkan), tingkat resolusi output opsional adalah: 1K, 2K (default).

  • 1K: Total piksel output mendekati 1024*1024, dengan rasio aspek sesuai gambar input terakhir.

  • 2K: Total piksel output mendekati 2048*2048, dengan rasio aspek sesuai gambar input terakhir.

Metode 2: Tentukan nilai piksel lebar dan tinggi gambar yang dihasilkan

  • Total piksel antara 768*768 dan 2048*2048, dengan kisaran rasio aspek [1:8, 8:1].

Hanya wan2.7-image-pro dalam skenario teks-ke-gambar yang mendukung resolusi 4K.

Metode 1: Referensi rasio gambar input (direkomendasikan)

Dalam mode pengeditan (enable_interleave=false), tingkat resolusi output opsional adalah: 1K (default), 2K.

  • 1K: Total piksel output mendekati 1280*1280, dengan rasio aspek sesuai gambar input terakhir.

  • 2K: Total piksel output mendekati 2048*2048, dengan rasio aspek sesuai gambar input terakhir.

Metode 2: Tentukan nilai piksel lebar dan tinggi gambar yang dihasilkan

  • Total piksel antara 768*768 dan 2048*2048, dengan kisaran rasio aspek [1:4, 4:1].

Nilai piksel gambar output aktual akan menjadi kelipatan 16 terdekat dari nilai yang ditentukan.

Hanya mendukung menentukan nilai piksel lebar dan tinggi gambar yang dihasilkan

  • Total piksel antara 768*768 dan 1280*1280, dengan kisaran rasio aspek [1:4, 4:1].

  • Jika size tidak ditentukan, sistem akan default menghasilkan gambar dengan total piksel 1280*1280, dengan rasio aspek sesuai gambar input terakhir.

4. Pengeditan presisi interaktif

Gunakan parameters.bbox_list untuk memilih wilayah spesifik untuk diedit. Hanya didukung oleh wan2.7-image-pro dan wan2.7-image.

  • Panjang daftar: Harus sesuai jumlah gambar input. Gunakan daftar kosong [] untuk gambar yang tidak memerlukan pengeditan.

  • Format koordinat: [x1, y1, x2, y2] (x kiri atas, y kiri atas, x kanan bawah, y kanan bawah). Koordinat adalah nilai piksel absolut dengan titik asal (0, 0) di kiri atas, sumbu-x ke kanan, sumbu-y ke bawah.

  • Batas kuantitas: Maksimal 2 Kotak pembatas per gambar.

Contoh: 3 gambar input di mana gambar 1 memiliki dua Kotak pembatas dan gambar 2 tidak memiliki

[
  [[0, 0, 12, 12], [25, 25, 100, 100]],  # Gambar 1 (2 kotak)
  [],                                    # Gambar 2 (tanpa kotak)
  [[10, 10, 50, 50]]                    # Gambar 3 (1 kotak)
]

Klik untuk melihat contoh pemanggilan

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
    --header 'Content-Type: application/json' \
    --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
    --data '{
        "model": "wan2.7-image-pro",
        "input": {
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {"image": "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp"},
                        {"image": "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"},
                        {"text": "Tempatkan jam alarm dari gambar 1 ke Kotak pembatas gambar 2, dan padukan adegan dan pencahayaan secara alami."}
                    ]
                }
            ]
        },
        "parameters": {
            "bbox_list": [[],[[989, 515, 1138, 681]]],
            "size": "2K",
            "n": 1,
            "watermark": false
        }
    }'
    

Cara menentukan koordinat wilayah pengeditan

Metode 1: Gambar Kotak pembatas dengan OpenCV

Gambar Kotak pembatas dengan menyeret mouse pada gambar untuk pemilihan yang presisi dan intuitif:

# Instal dependensi: pip install opencv-python
import cv2
import urllib.request

# Unduh gambar contoh (ganti dengan URL gambar Anda sendiri atau jalur lokal)
image_url = "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
urllib.request.urlretrieve(image_url, "example.webp")

# Baca gambar dan buka jendela interaktif
img = cv2.imread("example.webp")
# Seret mouse di jendela pop-up untuk menggambar kotak. Tekan Enter untuk mengonfirmasi, tekan Esc untuk membatalkan
x, y, w, h = cv2.selectROI("Draw bounding box (Enter=confirm, Esc=cancel)", img)
cv2.destroyAllWindows()

# Konversi (x, y, w, h) yang dikembalikan oleh OpenCV ke format [x1, y1, x2, y2] yang diperlukan oleh bbox_list
# Sistem koordinat: titik asal di pojok kiri atas, sumbu-x mengarah ke kanan, sumbu-y mengarah ke bawah, satuan dalam piksel
bbox = [x, y, x + w, y + h]
print(f"Koordinat Kotak pembatas: {bbox}")  # Kirimkan koordinat ini ke parameters.bbox_list

Metode 2: Model pemahaman visual

Gunakan qwen3.6-plus untuk secara otomatis mengidentifikasi koordinat wilayah target dengan mendeskripsikan target dalam bahasa alami:

# Instal dependensi: pip install dashscope pillow
import os
import json
from dashscope import MultiModalConversation
import dashscope
from PIL import Image
import urllib.request

# URL berikut adalah untuk wilayah Singapura. Ganti WorkspaceId dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"


def get_bbox_list(image, prompt):
    """
    Identifikasi wilayah target dalam gambar menggunakan qwen3.6-plus dan kembalikan koordinat piksel absolut.

    Args:
        image: URL gambar atau jalur lokal (format jalur lokal: "file:///absolute/path.png")
        prompt: Deskripsi bahasa alami, misalnya, "coffee cup", "all fruits on the plate", "the fruit in the center of the plate"

    Returns:
        [[x1, y1, x2, y2], ...] Koordinat piksel absolut yang dapat langsung dikirimkan ke bbox_list
    """
    # Gabungkan deskripsi pengguna dengan instruksi format pengembalian
    full_prompt = (
        prompt + "\n"
        "Berdasarkan deskripsi di atas, kembalikan koordinat wilayah yang sesuai.\n"
        "Kembalikan maksimal 2 wilayah, prioritaskan target yang paling sesuai.\n"
        "Ikuti secara ketat format daftar JSON 2D: [[x1, y1, x2, y2], ...]\n"
        "Setiap set koordinat: [x kiri atas, y kiri atas, x kanan bawah, y kanan bawah]\n"
        "Gunakan koordinat piksel absolut dari gambar asli, dengan (0,0) di pojok kiri atas, sumbu-x mengarah ke kanan, sumbu-y mengarah ke bawah.\n"
        "Jika hanya ada satu wilayah, Anda tetap harus menggunakan daftar 2D: [[x1, y1, x2, y2]]\n"
        "Hanya kembalikan daftar JSON, jangan kembalikan konten lainnya."
    )

    messages = [
        {'role': 'user',
         'content': [
             {'image': image},
             {'text': full_prompt}
         ]}
    ]

    response = MultiModalConversation.call(
        api_key=os.getenv('DASHSCOPE_API_KEY'),
        model='qwen3.6-plus',
        messages=messages,
    )

    text = response.output.choices[0].message.content[0]["text"]
    text = text.replace("```json", "").replace("```", "").strip()
    coords = json.loads(text)

    # Tangani kasus di mana model mengembalikan daftar 1D [x1,y1,x2,y2]
    if coords and not isinstance(coords[0], list):
        coords = [coords]

    # Dapatkan dimensi gambar untuk konversi koordinat
    if image.startswith("file://"):
        local_path = image[len("file://"):]
        img = Image.open(local_path)
    else:
        tmp_path = "temp_bbox_image"
        urllib.request.urlretrieve(image, tmp_path)
        img = Image.open(tmp_path)
    width, height = img.size

    # Konversi koordinat ternormalisasi model [0, 999] ke koordinat piksel absolut
    bbox_list = []
    for box in coords:
        bbox_list.append([
            int(box[0] / 1000 * width),
            int(box[1] / 1000 * height),
            int(box[2] / 1000 * width),
            int(box[3] / 1000 * height)
        ])

    return bbox_list


# === Contoh penggunaan ===
image_url = "https://img.alicdn.com/imgextra/i3/O1CN01ewUWhg1eS3VqJ3wap_!!6000000003869-49-tps-2048-2048.webp"

# Pilih target berdasarkan nama
bbox = get_bbox_list(image_url, "coffee cup")           # [[x1, y1, x2, y2]]

# Pilih target berdasarkan deskripsi posisi
bbox = get_bbox_list(image_url, "the fruit in the center of the plate")  # [[x1, y1, x2, y2]]

# Deskripsikan wilayah
bbox = get_bbox_list(image_url, "lavender potted plant")

# Hasil dapat digunakan sebagai elemen dalam array bbox_list
# Catatan: Maksimal 2 Kotak pembatas per gambar

Penagihan dan batas laju

  • Kuota gratis dan harga: Daftar model dan harga.

  • Untuk batas laju, lihat Wanxiang.

  • Penagihan:

    • Biaya dikenakan per gambar yang berhasil dihasilkan. Anda hanya dikenai biaya ketika API mengembalikan task_status SUCCEEDED.

    • Panggilan model yang gagal atau error pemrosesan tidak dikenai biaya apa pun atau mengonsumsi kuota gratis.

Referensi API

Setiap model menggunakan titik akhir dan struktur permintaan yang berbeda:

Model

Titik akhir (Contoh untuk wilayah Singapura)

wan2.7-image, wan2.7-image-pro, wan2.6-image

API Sinkron: POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

API Asinkron: POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/image-generation/generation

Ganti WorkspaceId dengan ID Ruang Kerja aktual Anda.

wan2.5-i2i-preview

API Asinkron: POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/image2image/image-synthesis

Ganti WorkspaceId dengan ID Ruang Kerja aktual Anda.

  • wan2.7 / wan2.6: Gunakan format messages. Dalam array messages[].content, kirimkan gambar dalam parameter image dan prompt dalam parameter text.

  • wan2.5: Kirimkan gambar dalam array input.images dan prompt dalam parameter input.prompt.

wan2.7-image-pro, wan2.7-image, wan2.6-image

wan2.5-i2i-preview

"input": {
    "messages": [
        {
            "role": "user",
            "content": [
                {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/pjeqdf/car.webp"},
                {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251229/xsunlm/paint.webp"},
                {"text": "Semprotkan grafiti dari gambar 2 ke mobil di gambar 1"}
            ]
        }
    ]
}
"input": {
    "prompt": "Tempatkan jam alarm dari gambar 1 di samping vas bunga di atas meja makan pada gambar 2",
    "images": [
        "https://img.alicdn.com/imgextra/i3/O1CN0157XGE51l6iL9441yX_!!6000000004770-49-tps-1104-1472.webp",
        "https://img.alicdn.com/imgextra/i3/O1CN01SfG4J41UYn9WNt4X1_!!6000000002530-49-tps-1696-960.webp"
    ]
}

Untuk parameter input dan output, lihat Wan2.7 - generasi dan pengeditan gambar, Wan2.6 - generasi dan pengeditan gambar, Wanxiang – Pengeditan Gambar Umum 2.5