调用openai.Image.create_edit生成图片无修改问题求助
调用OpenAI Image.create_edit编辑图片无变化问题解决
调用openai.Image.create_edit函数时,用掩码编辑图片却始终得到和原图一致的结果,完全没有按照提示词生成新内容。以下是相关代码、素材及解决办法:
相关代码
OpenAI连接模块
import os import openai class OpenAIConnect: def OpenAIConnectToSource(): openai.organization = "###" openai.api_key = "#######"
图片编辑主逻辑
from PIL import Image, ImageDraw from Global.DaleAuth import OpenAIConnect import openai OpenAIConnect.OpenAIConnectToSource() # 连接OpenAI(传入组织和API密钥) class UploadFormV2: def UploadAndRetrieve(self, imageInsert = None): image = Image.open('otters2.png') ConvertImage("image",imageInsert) transparentimagtest = Image.open('mask.png') ConvertImage("transparent",transparentimagtest) response = openai.Image.create_edit( image=open("image.png",'rb'), mask= open("transparent.png",'rb'), prompt="baby sea otter wearing a hat", n=2, size="1024x1024" ) image_url = response['data'] print(image_url) return(image_url) # 调整图片尺寸和格式用于提交 def ConvertImage(imageName, imageData): image = imageData print(image.size) image = imageData image = image.resize((1024, 1024),Image.ANTIALIAS) image = image.convert('RGBA') image.save(imageName+'.png')
素材图片
- 提交的原图:

- 使用的掩码:

- 返回结果截图:

问题排查及解决办法
1. 修正代码参数传递错误
这是最关键的bug:你打开了otters2.png,但调用ConvertImage时传的是默认值为None的imageInsert,导致处理的是空对象,实际提交的image.png并非目标原图。同时类内方法调用需要用self.或者声明为静态方法。
修改后的UploadAndRetrieve方法:
def UploadAndRetrieve(self, imageInsert = None): image = Image.open('otters2.png') self.ConvertImage("image", image) # 传递正确的图片对象,用self调用类内方法 transparentimagtest = Image.open('mask.png') self.ConvertImage("transparent", transparentimagtest) response = openai.Image.create_edit( image=open("image.png",'rb'), mask= open("transparent.png",'rb'), prompt="baby sea otter wearing a hat", n=2, size="1024x1024" ) image_url = response['data'] print(image_url) return(image_url)
给ConvertImage加上静态方法装饰器:
@staticmethod # 调整图片尺寸和格式用于提交 def ConvertImage(imageName, imageData): image = imageData.resize((1024, 1024), Image.ANTIALIAS) image = image.convert('RGBA') image.save(imageName+'.png')
2. 修正掩码格式
OpenAI图片编辑接口要求掩码的透明区域(alpha通道为0)才会被编辑,非透明区域会保留原图内容。你的掩码用白色标记编辑范围,需要把白色区域转为透明:
修改ConvertImage函数,针对掩码做特殊处理:
@staticmethod def ConvertImage(imageName, imageData): image = imageData.resize((1024, 1024), Image.ANTIALIAS) image = image.convert("RGBA") # 如果是掩码图片,将白色区域转为透明 if imageName == "transparent": data = image.getdata() new_data = [] for item in data: # 识别白色像素(RGB值接近255),转为透明 if item[0] > 200 and item[1] > 200 and item[2] > 200: new_data.append((255, 255, 255, 0)) else: new_data.append(item) image.putdata(new_data) image.save(imageName + '.png')
3. 优化提示词
如果前两步修正后仍无效果,尝试让提示词更具体,比如:
prompt="A cute baby sea otter wearing a fluffy red knit hat, photorealistic, high detail"
内容的提问来源于stack exchange,提问作者h ca
相关产品推荐
相关产品推荐

