本页是
gpt-image-2 通过 POST /v1/images/edits 上传原图 + 蒙版(mask)+ 提示词实现局部重绘的实操指南。接口参数与在线调试请见 图片编辑 API 参考。核心原理:Alpha 通道决定编辑区域
一次局部编辑请求由三部分组成:一个直观例子
假设原图尺寸是 1024×1024:Mask 不是硬裁剪
GPT Image 的蒙版不是 Photoshop 那种绝对像素级的硬限制。官方说明其本质仍是基于提示词的引导式编辑:模型会参考蒙版,但不保证严格按每一个像素边界执行。 因此可能出现:- 蒙版外的阴影略微变化
- 物体边缘向外扩展
- 光照和反射发生联动
- 背景细节被轻微重绘
- 蒙版边界附近出现过渡
提高局部编辑稳定性
提示词不要只写「换成红色衣服」,建议写成:- 蒙版比目标物体边缘稍微扩大一些
- 不要只遮住物体中心,要覆盖物体边缘、阴影和反射
- 明确写出哪些内容必须保持不变
- 编辑区域过小时,适当扩大蒙版
- 要求绝对不变时,最后自行做一次像素合成(见下文)
要不要用 Mask?与纯提示词编辑的取舍
一个常见疑问:现在的 AI 不是已经”指哪打哪”了吗,为什么还要费劲做蒙版? 确实,gpt-image-2 不传 mask、只靠一句”把左边桌上的杯子换成花”,多数时候就能改对地方——指令遵循能力已经很强,日常随手改图完全够用。但 mask 解决的是提示词说不清、或者说清了也不保险的问题:
学术研究也支持这个分工:mask-free(纯文字驱动)的编辑方法难以精确控制空间位置和形状——比如 prompt-to-prompt 类方法无法在画面中空间移动一个物体,编辑区域覆盖不准时还会”该改的没改、不该改的改了”;而 mask-based 方法以牺牲一点便利为代价,换来明确的空间控制精度。
文件要求速查
多图编辑时的角色分配:
Python 调用示例
cURL 调用示例
图片编辑接口必须使用multipart/form-data,不能把原图和蒙版作为普通 JSON 字段提交:
image[] 字段名。
Node.js 调用示例
蒙版从哪来?五种常见制作方式
很多人觉得做蒙版麻烦——“还得跟原图一模一样的尺寸”。其实有一个关键认知:蒙版几乎从不’另画一张’,而是从原图上派生出来的。无论用代码、修图软件还是网页画布,流程都是「打开原图 → 在原图上标记区域 → 导出」,尺寸一致是自动满足的,不需要手动对齐。方法一:程序直接生成透明蒙版
把矩形区域设为透明(允许编辑):(255, 255, 255, 255)= 不透明,保留区(0, 0, 0, 0)= 透明,编辑区
方法二:修图软件手动擦除
任何支持透明 PNG 的修图软件(Photoshop、GIMP、Krita、Photopea 等)都能做蒙版,本质就一步:把要编辑的区域”擦”成透明。以 Photoshop 为例:- 打开原图副本(直接在原图上操作,尺寸天然一致)
- 如果图层是「背景」,先双击解锁为普通图层(背景图层不支持透明)
- 用套索 / 快速选择 / 对象选择工具框选要修改的区域
- 按 Delete 删除选区内容 → 露出透明棋盘格
- 「导出为 PNG」(勾选透明度),得到的就是合格的 Alpha 蒙版
图层 → 透明 → 添加 Alpha 通道,选区后 Delete,导出 PNG。
方法三:网页涂抹画布
各类 AI 修图产品里”用笔刷涂一下要改的地方”的交互,就是在浏览器里动态生成 Alpha 蒙版,核心只有一个 Canvas API 属性。实现原理见下文 涂抹式修图的实现原理。方法四:AI 自动分割一键出蒙版
手动涂抹也嫌麻烦?可以让分割模型代劳。Meta 开源的 SAM(Segment Anything Model) 系列是目前的主流方案:- 点选出蒙版:在物体上点一下,模型输出该物体的像素级精确轮廓(连头发丝边缘都能贴合)
- 文字出蒙版:2025 年 11 月开源的 SAM 3 支持概念级文字提示,如「所有黄色出租车」「穿红色球衣的球员」,一次返回所有匹配实例的蒙版(模型与代码见
github.com/facebookresearch,介绍见ai.meta.com) - 抠主体 / 抠背景:
rembg这类开源工具一行命令分离主体与背景,背景区域直接可以当”只改背景”的蒙版用
方法五:把黑白蒙版转换成 Alpha 蒙版
如果你已有一张「黑色 = 编辑,白色 = 保留」的黑白蒙版:上传前先校验蒙版
很多invalid_image_file 都是因为文件扩展名是 .png,实际却只有 RGB 没有 Alpha。上传前跑一遍:
蒙版形状与涂抹式修图的实现原理
蒙版可以是任意不规则形状
蒙版本质是一张逐像素的位图,不是几何图形——每个像素独立记录一个 Alpha 值。所以:- 矩形、圆形只是最简单的示例
- 沿人物轮廓的剪影、头发丝边缘、随手涂鸦的一团、不连通的多块区域,全部合法
- 实践中大多数蒙版都是不规则的:跟着目标物体的轮廓走,再略微外扩
涂抹式修图是怎么实现的
各类修图 App 里”笔刷涂哪改哪”的交互,前端实现出奇地简单:两层画布叠加,笔刷把上层”擦”成透明。destination-out(新笔迹从已有像素中”挖掉”内容):
- 坐标换算:画布在页面上通常被 CSS 缩小显示,笔迹坐标要按
原始宽 / 显示宽的比例换算回去,否则蒙版错位 - 撤销:每笔开始前
ctx.getImageData()存快照,撤销时putImageData()恢复 - 蒙版膨胀(dilate):用户涂抹往往只盖住物体中心,提交前程序性外扩几个像素(专业工具里的「Expand Mask」按钮就是这个),Python 端可用
PIL.ImageFilter.MaxFilter或 OpenCVcv2.dilate实现 - 半透明预览:给用户看的涂抹高亮(如红色半透明)画在另一个预览层上,导出的蒙版层保持纯粹的”不透明 / 透明”二值
进阶:点选 / 文字自动出蒙版
涂抹式再往前一步,就是把”人手涂”换成”模型算”:多参考图 + 蒙版
典型场景:换装(第一张是人物原图,后面是款式 / 材质参考图,蒙版标记衣服区域):严格保持蒙版外不变(像素级后处理)
由于模型可能轻微修改蒙版外内容,对像素精度要求高的场景(商品图、证件版式、固定 UI 截图),可以在生成后把蒙版外区域强制替换回原图:常见错误排查
invalid_image_file / Invalid image file or mode
invalid_image_file / Invalid image file or mode
常见原因:
- 蒙版不是有效 PNG,或文件内容损坏
- 扩展名是 PNG,实际编码不是 PNG
- 图片模式异常(CMYK、调色板模式、缺 Alpha)
- 上传时 MIME 类型错误
- 文件流在请求前已被读取完毕或关闭
原图和蒙版尺寸不一致
原图和蒙版尺寸不一致
哪怕只差 1 像素也会报错。修正:
黑白蒙版没有 Alpha 通道
黑白蒙版没有 Alpha 通道
RGB / L / P 模式都不行,必须是 RGBA。用上文「方法二」把黑白蒙版转换成 Alpha 蒙版。请求透明背景报错
请求透明背景报错
蒙版本身可以包含透明通道(这正是标记编辑区的方式),但
gpt-image-2 不支持输出透明背景:background 请使用 "opaque" 或 "auto",传 "transparent" 会报错。response_format=url 拿不到图
response_format=url 拿不到图
GPT Image 系列固定返回 Base64 数据,
response_format 只适用于旧的 DALL·E 2 行为。正确读取方式:Content-Type isn't multipart/form-data
Content-Type isn't multipart/form-data
通常是手动设置了
Content-Type 头导致 boundary 丢失,或中间层把 multipart 请求解析成 JSON 后再转发。让 HTTP 客户端自动生成 multipart 头即可。尺寸参数
gpt-image-2 支持灵活尺寸,需同时满足:
1024x1024、1536x1024、1024x1536、2048x2048、2048x1152、3840x2160、2160x3840、auto。方形图片通常生成更快。
生产环境请求模板
相关页面
图片编辑 API 参考
完整参数说明与在线调试 Playground
GPT-Image-2 概览
模型能力、定价与版本说明
官方参考资料(请复制到浏览器访问):
- 模型说明:
developers.openai.com/api/docs/models/gpt-image-2 - 图像编辑 API Reference:
developers.openai.com/api/reference/python/resources/images/methods/edit/ - 图像生成指南:
developers.openai.com/api/docs/guides/image-generation