物体移除 API:用 GPT Image 2 去掉照片里的东西
每个物体一句指令就够了。这是请求代码、全尺寸结果,以及哪里还需要多看一眼。
本页内容
一句文字指令就能让 GPT-Image 2 的编辑接口删掉一个物体。2026 年 10 月 28 日我们跑了三次,从同一张公园照片里分别去掉一位牵着狗的女士、一个蓝色垃圾桶和一只红色风筝,每次只写一句话。三处空缺都和周围接上了,长椅、树和天际线都留在原位。
接口收一句提示词加一张原图,返回一张完整的新图。下面是跑通的 Python、三次结果的全尺寸图和检查方法。
指令式移除是怎么做的
你发一张照片、一句指令。句子里点明物体,说明空缺补什么,再列出哪些东西必须留着。模型重画这一块,返回一张完整的新图,不需要另外拼合。
调用和 OmniaKey 上其他编辑任务是同一种媒体任务。模型写 gpt-image-2,type 是 image,operation 是 edit。原图以 Base64 放进 input 的 image 字段,句子放进 input 的 prompt。parameters 里 size 写 WIDTHxHEIGHT,n 必须是 1,quality 可选 low、medium、high 或 auto。模型页上列着这两个操作。
控制力全在措辞上。「天空里那只小红风筝」和「那个红色的东西」是两件不同的活;补什么也得写清楚,「草地和铺路石」决定了空出来的位置最后长什么样。句子怎么排,见我们的 GPT Image 2 提示词指南;同样的指令方式在 GPT Image 2 上的做法见 FLUX Kontext 替代方案指南。
请求
一个 Python 文件做完全部事情:读图编码、建任务、轮询到结束、下载 PNG。
import base64
import json
import os
import time
import urllib.request
import uuid
API = "https://api.omniakey.com/v1/media/tasks"
KEY = os.environ["OMNIAKEY_API_KEY"]
def request(method, url, body=None, extra_headers=None):
headers = {"Authorization": f"Bearer {KEY}", "User-Agent": "omniakey-example/1"}
data = None
if body is not None:
headers["Content-Type"] = "application/json"
data = json.dumps(body).encode()
headers.update(extra_headers or {})
req = urllib.request.Request(url, data=data, headers=headers, method=method)
with urllib.request.urlopen(req, timeout=120) as resp:
return json.load(resp)
def edit_image(source_path, prompt, out_path, size="1024x1536", quality="medium"):
with open(source_path, "rb") as f:
image = base64.b64encode(f.read()).decode()
body = {
"model": "gpt-image-2",
"type": "image",
"operation": "edit",
"input": {"prompt": prompt, "image": {"data": image, "mime_type": "image/jpeg"}},
"parameters": {"size": size, "quality": quality},
}
task = request("POST", API, body, {"Idempotency-Key": str(uuid.uuid4())})["id"]
for _ in range(150):
time.sleep(4)
state = request("GET", f"{API}/{task}")
if state["status"] not in ("queued", "processing"):
break
if state["status"] != "succeeded":
raise RuntimeError(state.get("error") or state["status"])
asset_url = state["assets"][0]["url"] # signed link: valid for about an hour, so download now
req = urllib.request.Request(asset_url, headers={"User-Agent": "omniakey-example/1"})
with urllib.request.urlopen(req, timeout=120) as resp, open(out_path, "wb") as f:
f.write(resp.read())
return task
if __name__ == "__main__":
task = edit_image(
"park-base.jpg",
"Remove the blue trash bin completely. Fill its spot with grass and paving stones so it matches the surroundings. Keep everything else exactly the same. Photorealistic, no text, no logos.",
"park-no-bin.png",
size="1536x1024",
)
print("task", task)
这个函数在 2026 年 10 月 28 日用另一条提示词核对过:底图那张 1024 像素的 JPEG 上,把衣服换成一件黄色雨衣,返回的是 1024x1536 的 PNG。
- 建任务返回 HTTP 202 和一个任务 id(OmniaKey 图片接口文档,2026 年 10 月 28 日核对)。状态还是 queued 或 processing 就继续查同一个任务。succeeded 表示素材好了;失败的任务带错误码和错误信息,不计费。
- 素材的签名链接大约一小时后失效,文件本身保留 24 小时。任务成功就马上下载,下载用普通 GET,不带 API Key。
- 内联 Base64 算在 1 MiB 的请求上限里,手机原图先压一下再发。
- 加上
User-Agent头:2026 年 10 月 28 日,带 Python 默认 User-Agent 的请求被拒,返回 HTTP 403;加上这个头就正常了。 - size 要写明确的宽高,横图用 1536x1024。GPT Image 返回的永远是不透明 PNG,实际尺寸以下载到的文件为准。
费用方面,OpenAI 的价目页把 GPT Image 2 列在图像生成模型里,按百万 token 计。图像输入 $8.00、图像输出 $30.00,批量价减半(2026 年 10 月 28 日核对)。那一页没有单张价格表;它的图像生成指南里有一个单张图片的计算器。OmniaKey 的当前价格在 价格页。
同一张公园照片上的三次移除
四张图都来自同一个底片。晴天的城市公园小路,中间一张木长椅,左边一个蓝色金属垃圾桶。一位女士牵着一只棕色小狗朝镜头走来,高高的晴空里有一只红色小风筝。底图和三次结果都是 1536x1024、quality medium,2026 年 10 月 28 日通过 OmniaKey 用 GPT Image 2 生成。画面里的人和场景都是合成的。每个物体写一句,各跑一次。
| 去掉的物体 | 我们发的指令 | 返回的样子 |
|---|---|---|
| 女士和小狗 | "Remove the woman and the small brown dog completely. Fill the path and the grass naturally so they match the surroundings. Keep the bench, the blue bin, the trees, the kite and the sky exactly the same. Photorealistic, no text, no logos." | 人和狗都不见了;小路和草地补上了;长椅、垃圾桶、树、风筝和天空都在 |
| 蓝色垃圾桶 | "Remove the blue trash bin completely. Fill its spot with grass and paving stones so it matches the surroundings. Keep everything else exactly the same. Photorealistic, no text, no logos." | 垃圾桶不见了,原地补成草地和铺路石;女士和小狗还在 |
| 红色风筝 | "Remove the small red kite from the sky. Keep the sky natural and everything else exactly the same. Photorealistic, no text, no logos." | 风筝没了,天空自然,画面其余部分没变 |

GPT-Image 2 经 OmniaKey API 于 2026 年 10 月 28 日生成,尺寸 1536x1024,质量 medium。
第二格少了女士和小狗,小路和草地从他们身后接上,长椅、垃圾桶、树、风筝和天际线都没动。第三格去掉垃圾桶,原地补成草地和铺路石,女士和小狗仍留在画面里。第四格把风筝从天空拿掉,其余部分保持原样。
每次移除之后要检查什么
交付前把每一格按原始像素看。
- 补丁的边缘和周围一圈。新草地、铺路石或路面纹理总要和旧的相接,模型又会重画整张图,把这条缝和物体周围一圈跟原图对比,发虚、重复或糊成一片的地方最先出现在这里。
- 和物体挨着的东西。牵引绳、影子、倒影都要跟着一起重画。
- 保留清单逐项对照。第一次保留了长椅、垃圾桶、树、风筝和天空,第二次保留了女士和小狗;提示词里点了名,就要在结果里找到它。
补得合格再上线:按原始像素看边缘接得上,保留清单上的每一项都还在。补丁发糊就把材质写进同一句里重跑,比如「草地和铺路石」。
我们没有测什么
我们没有测蒙版输入、拥挤场景和很小的物体。照片里有人群、成排的栅栏或很细的带子,比如牵引绳,就准备跑第二次,并把那条边放大看。
一句指令的模板
把[要删的物体,带上能区分它的细节]整块去掉。空出来的地方补上[材质],和周围接得上。[必须保留的东西]保持原样。写实照片,不要文字,不要 logo。
- 物体要写具体。「天空里那只小红风筝」比「风筝」好,画面里有好几个时也能指对。
- 空缺写材质。「草地和铺路石」给了模型对齐周围的依据;只写「去掉它」,补成什么样就由模型自己定。
- 保留清单。点名必须留下的东西:长椅、蓝色垃圾桶、树、风筝、天空。
- 风格收尾。「写实照片,不要文字,不要 logo」让照片还是照片。
给人换衣服是同一个写法,把衣服写成要换掉的那个物体;具体步骤见 虚拟试穿指南。
常见问题
用 API 能把照片里的人去掉吗?
能,但要检查结果。第一次运行里,女士和小狗一步就离开了画面,身后的小路和草地也补好了。
接口接受蒙版吗?
OmniaKey 的文档描述的是一张原图加一句提示词(2026 年 10 月 28 日核对)。文档里没有蒙版字段,我们也没有试过蒙版。物体和位置用文字点名,而不是画出区域。
结果链接能用多久?
签名链接大约一小时(OmniaKey 文档,2026 年 10 月 28 日核对),文件本身保留 24 小时。任务成功就马上下载。
该请求多大尺寸?
size 写明确的宽高,横图用 1536x1024 这类值,实际尺寸从下载到的 PNG 里读。GPT Image 返回的永远是不透明文件,裁剪放在下载之后做。
一句指令能去掉两个物体吗?
第一次运行里,一句话就把女士和她身边的狗一起删掉了。别的组合我们还没有试过。
参数看 GPT-Image 2 模型页,下一次移除之前先看 当前价格。
