图像
图像编辑
使用参考图编辑背景、产品与风格,并掌握 Midjourney 操作。
阅读约 1 分钟2 个章节
编辑是一条指令:先说明要改变什么,再说明必须保留什么。参考图比大量形容词更准确地传达所需外观。
实操要点
按优先目标选择模型——速度、还原度、分辨率或控制能力——并保存每次结果的参数和版本。 nano-banana-*, gpt-image-2, wan2.7-image and midjourney — Image editing.
每次尝试只改一件事。好的输出应保留为参考图,它是下一轮迭代最可靠的起点。
将 finished 和 failed 视为终态。使用 polling 或 webhook,在服务器保存原始错误,并向用户展示安全的信息。
提示词与 API 示例
text
Replace the overcast sky with a clear blue one. Keep the building, thelighting on the facade and the framing exactly as they are.

Source: Google AI for Developers, used under CC BY 4.0; format and dimensions adapted.
text
Using the provided image of a living room, change only the blue sofa to be avintage, brown leather chesterfield sofa. Keep the rest of the room, includingthe pillows on the sofa and the lighting, unchanged.

Source: Google AI for Developers, used under CC BY 4.0; format and dimensions adapted.
text
Put the chair from image 1 into the room from image 2. Match the window lightand cast a soft shadow on the floor. Do not change the room's furniture orthe chair's upholstery.
text
The person from the reference, now standing on a train platform at night,three-quarter view, rain, sodium lighting. Keep their face, hair and jacketidentical to the reference.
text
Redraw image 1 in the visual style of image 2 — same palette, line weight andgrain. Keep the composition and subject of image 1 unchanged.
text
A ceramic mug in the masked area, same lighting and perspective as the rest ofthe frame
About these samples. Ready-made examples are copied to our own storage only when their source permits reuse. The exact prompt appears above each result, and the original source and license are linked below the media.
json
{"model": "z-image","input": {"prompt": "Replace the overcast sky with a clear blue one, keep the lighting on the building consistent","urls": ["https://example.com/facade.jpg"]}}
json
{"model": "wan2.7-image","input": {"prompt": "Put the chair from image 1 into the room from image 2, matching the window light","urls": ["https://example.com/chair.png", "https://example.com/room.jpg"],"size": "3:2"}}
sh
curl -X POST https://api.api-stock.com/api/v1/generation/create \-H "Authorization: Bearer sk-your-key" \-H "Content-Type: application/json" \-d '{"model": "midjourney","input": {"action": "imagine","prompt": "A weathered brass diving helmet on a workshop bench, volumetric dust","size": "1:1","version": "7","stylize": 300}}'
json
{"code": 200,"data": {"taskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","status": "not_started","createdAt": "2026-02-28T13:07:45.000Z"}}
json
{"code": 200,"data": {"taskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","status": "finished","files": [{"fileUrl": "https://storage.api-stock.com/generated/mj-grid-4c81.png","fileType": "image"}],"createdTime": "2026-02-28T13:07:45.000Z"}}
sh
curl -X POST https://api.api-stock.com/api/v1/generation/create \-H "Authorization: Bearer sk-your-key" \-H "Content-Type: application/json" \-d '{"model": "midjourney","input": {"action": "upscale","parentTaskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","index": 2}}'
ts
const BASE = "https://api.api-stock.com/api/v1";const KEY = process.env.API_STOCK_KEY!;async function submit(input: Record<string, unknown>): Promise<string> {const res = await fetch(`${BASE}/generation/create`, {method: "POST",headers: {Authorization: `Bearer ${KEY}`,"Content-Type": "application/json",},body: JSON.stringify({ model: "midjourney", input }),});const body = await res.json();if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);return body.data.taskId;}async function wait(taskId: string) {for (;;) {await new Promise((r) => setTimeout(r, 5_000));const res = await fetch(`${BASE}/task/status/${taskId}`, {headers: { Authorization: `Bearer ${KEY}` },});const body = await res.json().catch(() => null);if (!res.ok) {const message = body?.error?.message ?? `${res.status} ${res.statusText}`;throw new Error(message);}const { data } = body;if (data.status === "finished") return data;if (data.status === "failed") throw new Error(data.errorMessage);}}const gridId = await submit({action: "imagine",prompt:"A weathered brass diving helmet on a workshop bench, volumetric dust",size: "1:1",version: "7",stylize: 300,});await wait(gridId);const upscaleId = await submit({action: "upscale",parentTaskId: gridId,index: 2,});const upscaled = await wait(upscaleId);console.log(upscaled.files[0].fileUrl); // → https://storage.api-stock.com/...
json
{"model": "midjourney","input": {"action": "pan","parentTaskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","index": 2,"direction": "left"}}
json
{"model": "midjourney","input": {"action": "zoom","parentTaskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","index": 2,"zoomRatio": 1.5}}
json
{"model": "midjourney","input": {"action": "modal","parentTaskId": "019ca8c4-3e17-7b55-9f10-cc2b6de0a8f4","index": 2,"prompt": "Replace the bench with a slab of sea-worn granite","maskUrl": "https://example.com/mask.png"}}
json
{"model": "midjourney","input": {"action": "describe","imageUrls": ["https://example.com/reference.jpg"]}}
json
{"model": "midjourney","input": {"action": "blend","imageUrls": ["https://example.com/texture-a.jpg","https://example.com/texture-b.jpg","https://example.com/texture-c.jpg"],"dimensions": "LANDSCAPE"}}
json
{"code": 400,"error": {"message": "action \"variation\" requires index or customId","type": "BadRequest","code": "invalid_input"}}
用你自己的密钥跑一遍
本指南中的所有模型都已上架 API Stock 目录——一个 API 密钥、一个预付余额,无需在各家供应商分别注册。