局部重绘
描述
本接口用于云端处理AI局部内容生成的请求,具体效果请看以下文档详情。
图片样例
| 输入图片 | 输出图片 |
|---|---|
![]() | ![]() |
图片要求
图片格式:JPG,PNG
调用信息
任务提交接口:https://openapi.meitu.com/api/v1/sdk/sync/push
任务名称(task):/v1/InPainting/468520
任务类型(task_type):formula权限
请求参数
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | params | string | 推理参数 |
| 必选 | init_images | object[] | 图片参数,需传两张图片,第一张原图,第二张mask图(选择需要涂抹的位置) |
| 必选 | task | string | 固定: /v1/InPainting/468520 |
| 必选 | task_type | string | 固定: formula |
| 可选 | sync_timeout | int | 默认30,-1 表示不等待,同步超时时间,接口超时后使用status 返回9,使用(https://meituhub.cn/docs?id=179&f_id=11) 接口查询 |
| 可选 | rsp_media_type | string | “jpg”:融合结果图像直接以 base64 编码方式返回 “url”:融合结果图像直接以 url 方式返回 ,默认 URL 返回 |
init_images 图片参数,结构说明如下
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | url | string | 图片地址 |
| 可选 | profile | object | 多媒体参数 |
profile 参数,结构说明如下
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 可选 | media_extra | object | 多媒体附加参数 |
| 可选 | media_profiles | object | 多媒体描述 |
media_profiles 参数,结构说明如下
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 可选 | media_data_type | string | "url":多媒体文件以 url 形式传输, "jpg":多媒体文件以 base64 编码传输 |
params 中参数说明(需要转义成 string)
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 是 | parameter | String | 消除参数 |
| parameter 中参数说明 |
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 可选 | rsp_media_type | String | “jpg”:融合结果图像直接以 base64 编码方式返回,“url”:融合结果图像直接以 url 形式返回 |
| 可选 | prompt_pos | String | 正向提示词 |
| 可选 | seed | int | 随机种子[-1,2147483647],若不传,则seed值随机生成 |
| 可选 | return_format_type | String | 返回图片格式,默认为’png’。可选[‘jpeg’, ‘jpg’, ‘png’, ‘webp’], 传入其它字符返回’png’格式。 |
输入值示例
{
"params": "{\"parameter\":{\"rsp_media_type\":\"url\",\"prompt_pos\":\"lipstick lying on satin fabric\"}}",
"init_images": [
{
"profile": {
"media_profiles": {
"media_data_type": "url"
},
"version": "v1"
},
"url": "原图Image URL or Base64"
},
{
"profile": {
"media_profiles": {
"media_data_type": "url"
},
"version": "v1"
},
"url": "Mask URL or Base64"
}
],
"task": "/v1/InPainting/468520",
"task_type": "formula"
}返回值说明
成功返回值说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| media_info_list | List | 每个项包含一个多媒体信息(例如:图片数据以及对应信息),同上 |
| parameter | Object | 返回信息类型标识 |
media_info_list 中单个元素的字段说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| media_data | String | 经过 base64 编码的多媒体文件数据 |
| media_profiles | Object | 多媒体文件的相关属性信息描述 |
parameter 中字段说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| rsp_media_type | String | 'jpg',表示 media_data 是经过 base64 压缩过的图片 |
media_profiles 中字段说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| media_data_type | String | 'jpg',表示 media_data 是经过 base64 压缩过的图片 |
失败返回值说明
| 字段 | 类型 | 说明 |
|---|---|---|
| ErrorCode | Int | 错误代码 |
| ErrorMsg | String | 错误信息 |
| Data | String | 具体信息返回值示例 |
返回值示例
请求成功返回示例
Response Status:200
content-type 为 application/json; charset=utf-8
{
"parameter": {
"rsp_media_type": "jpg",
}
"media_info_list": [{
"media_data": "...",
"media_profiles": {
"media_data_type": "jpg"
}
}]
}请求失败返回示例
Response Status:400
content-type 为 application/json; charset=utf-8
{
"ErrorCode": 20003,
"ErrorMsg": "detect no face",
"Data": null
}当前 API 特有的错误代码与信息
| ErrorCode状态代码 | 错误信息 | 说明 |
|---|---|---|
| 20001 | PROCESS_ERROR | 处理错误 |
| 20003 | DETECT_NOT_FACE | 人脸缺失 |
| 20004 | MORE_THAN_ONE_FACE | 人脸数大于1 |
| 20007 | MISSING_LANDMARK_ARGUMENTS | 未传入人脸点 |
| 20008 | UNSUITABLE_IMAGE | 照片不符合规范 |
| 20009 | UNSUPPORT_TYPE | 不支持的type |
| 20010 | DETECT_NOT_FACE | 检测不到第二张图片的人脸 |
| 20011 | UNSUITABLE_VERTICAL_IMAGE | 垂直高度不满足 |
| 20012 | UNSUITABLE_HORIZONTAL_IMAGE | 水平宽度不满足 |
| 20013 | RESOLUTION_TOO_LARGE_ERROR | 分辨率过大 |
| 20014 | NOT_FOUND | 查找不到图片 |
| 20015 | PICTURE_OVERRUN_ERROR | 图片超限 |
| 20020 | DETECT_FACE_OUTOFIMAGE | 五官缺失 |
| 20021 | DETECT_FACE_PITCHANGLE_BIG | 非正脸 点头 俯仰角过大 |
| 20022 | DETECT_FACE_YAWANGLE_BIG | 非正脸 摇头 旋转角过大 |
| 20023 | DETECT_FACE_LOWAREA | 脸部占比小像素低 |
| 21001 | LOAD_MODEL_ERROR | 加载模型失败 |
| 21002 | HAIR_MASK_LOSS | 头发mask缺失 |
| 21003 | FACE_NUM_ERROR | 人脸个数错误 |
| 21004 | AR_PARSE_FAULT | ar中plist解析错误 |
| 21005 | AR_EEEOR_COUNT | ar人脸错误 |
| 21006 | AR_FACE_OUT | ar超过人脸范围 |
| 21007 | JSON_ERROR | json内容错误 |
| 21008 | BACKGROUND_IMAGE_LOSS | 背景图片缺失 |
| 21009 | BODY_MASK_LOSS | bodymask缺失 |
| 21010 | FACE_ANGLE_ERROR | 人脸角度错误 |
| 21011 | SKIN_MASK_LOSS | skinmask缺失 |
| 21012 | BODY_INFO_LOSS | 骨骼点或者外轮廓点缺失 |
| 21013 | RECT_OUT_IMAGE | 超过图片范围 |
| 30001 | GEN_ERROR | 生成错误 |
通用的错误代码与信息
详见 API 错误码
调用方法
import requests
import json
import requests
from sign_sdk import sign
key = ""
secret = ""
def fetchResult(taskId):
url = "https://openapi.meitu.com/api/v1/sdk/status?task_id="+taskId
#key = "your api key"
#secret = "your api secret"
method = "GET"
headers = {
"Content-Type": "application/json",
sign.HeaderHost: "openapi.meitu.com"
}
body = ""
try:
signer = sign.Signer(key, secret)
signed_request = signer.sign(url,method,headers,body)
session = requests.Session()
response = session.send(signed_request,verify=False)
if response.status_code==200:
r=json.loads(response.content)
if r["data"]["result"]["status"]=="10":
# 任务成功
print(r["data"]["result"]["url"])
elif r["data"]["result"]["status"]=="2" or r["data"]["result"]["status"]=="20":
# 任务失败
print(r["data"]["result"])
else:
# 任务进行中
fetchResult(taskId)
else:
print(response.text)
except Exception as ex:
print(ex)
url = "http://openapi.meitu.com/api/v1/sdk/sync/push"
method = "POST"
headers = {
"Content-Type": "application/json",
sign.HeaderHost: "openapi.meitu.com",
}
param = {
"parameter": {
"rsp_media_type": "url",
"prompt_pos": "lipstick lying on satin fabric"
}
}
imageUrl="https://obs-open-platform.obs.cn-north-4.myhuaweicloud.com/public/resources/img"
imagePositionMask="https://obs-open-platform.obs.cn-north-4.myhuaweicloud.com/public/resources/pos"
#
body = json.dumps({
# 注意params 是string类型,需要json.dumps 转换一次数据结构
"params": json.dumps(param),
"init_images": [
# 输入原图
{
"url": imageUrl,
"profiles": {
"version": "v1"
}
},
# 输入Mask图片
{
"url": imagePositionMask,
"profiles": {
"version": "v1"
}
}],
"task": "/v1/InPainting/468520", #调用信息中的task
"task_type": "formula" #调用信息中的task type
})
signer = sign.Signer(key, secret)
print(body)
signed_request = signer.sign(url, method, headers, body)
session = requests.Session()
response = session.send(signed_request,verify=False)
print(response.status_code)
print(response.text)
taskResult= json.loads(response.content)
taskId=taskResult["data"]["result"]["id"]
fetchResult(taskId,None)

