美图秀秀 ai 开放平台 测试用例
摘要:美图API提供线稿生成服务,支持通过POST请求将JPG/PNG格式图片转换为线稿效果。调用需申请api_key和secret_key,请求参数包括base64编码的图片数据。返回结果可能是base64编码图片或URL链接。附带的Python示例代码展示了完整的调用流程:将本地图片转为base64→发送API请求→处理返回结果(支持URL下载或base64解码保存)。注意点包括图片大小检查、
https://ai.meitu.com/doc?id=198&type=api&lang=zh 这个是美图相片提取轮廓的,接口
以下是美图的官方说明
线稿
- 线稿
- 描述
- 图片要求
- 更新日志
- 调用URL
- 调用方法
- 权限
- 请求参数
- 输入值示例
- 返回值说明
- 成功返回值说明
- 失败返回值说明
- 返回值示例
- 请求成功返回示例
- 请求失败返回示例
- 当前 API 特有的错误代码与信息
- 通用的错误代码与信息
- 调用示例
描述
本接口用于云端生成线稿算法效果的请求,具体效果请看以下文档详情。
图片要求
图片格式:JPG,PNG
更新日志
- 1、新增线稿算法服务相关描述
调用URL
https://openapi.mtlab.meitu.com/v2/csketch?api_key=XXX&api_secret=XXX
调用方法
POST
request 的头的类型应包含:Content-Type:application/json
权限
使用前需提前申请 api_key 和 secret_key,具体申请步骤,请联系文档提供方。
请求参数
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | media_info_list | List | 每个项包含一个多媒体信息(例如:图片数据以及对应信息) |
| 必选 | parameter | Object | 处理需要的参数信息 |
| 可选 | extra | Object | 网关处理额外信息 |
media_info_list 中单个元素的参数说明
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | media_data | String | 多媒体文件经过 base64 编码,url 不经过编码 |
| 可选 | media_extra | Object | 包含对多媒体文件的描述,例如图片中的人脸点,五官属性等 |
| 必选 | media_profiles | Object | 多媒体文件的相关属性信息描述 |
media_profiles 中参数说明
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 可选 | media_data_type | String | 'jpg',表示 media_data 是经过 base64 压缩过的图片,默认'jpg' 'url',表示 media_data 是图片 url 地址 |
输入值示例
{
"parameter": {
},
"media_info_list": [
{
"media_data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAx...",
"media_extra": { },
"media_profiles": {
"media_data_type": "jpg"
}
}
],
"extra": { }
}
返回值说明
成功返回值说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| media_info_list | List | 每个项包含一个多媒体信息(例如:图片数据以及对应信息),同上 |
| parameter | Object | 返回信息类型标识 |
parameter 中字段说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| rsp_media_type | String | 'jpg',表示 media_data 是经过 base64 压缩过的图片 |
media_info_list 中单个元素的字段说明
| 字段 | 类型 | 参数说明 |
|---|---|---|
| media_data | String | 经过 base64 编码的多媒体文件数据 |
| media_profiles | Object | 多媒体文件的相关属性信息描述 |
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":"base64"
},
"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 | 处理错误 |
通用的错误代码与信息
详见 API 错误码
调用示例
curl -vX POST "https://openapi.mtlab.meitu.com/v2/csketch?api_key=xxx&api_secret=xxx" -d @p.json --header "Content-Type: application/json"
我写的python测试案例
import requests
import base64
import json
import os
from PIL import Image
import io
class MeituSketchAPI:
def __init__(self, api_key, api_secret):
self.api_url = f"https://openapi.mtlab.meitu.com/v2/csketch?api_key={api_key}&api_secret={api_secret}"
self.headers = {
'Content-Type': 'application/json'
}
def image_to_base64(self, image_path):
"""将图片转换为base64编码"""
try:
with open(image_path, 'rb') as image_file:
image_data = image_file.read()
# 检查图片大小
file_size = len(image_data) / 1024 # KB
print(f"输入图片大小: {file_size:.1f}KB")
base64_data = base64.b64encode(image_data).decode('utf-8')
return base64_data
except Exception as e:
print(f"图片处理错误: {str(e)}")
return None
def download_image_from_url(self, image_url, output_path):
"""从URL下载图片"""
try:
print(f"正在从URL下载图片: {image_url}")
response = requests.get(image_url, timeout=30)
response.raise_for_status() # 检查请求是否成功
# 获取图片大小
file_size = len(response.content) / 1024 # KB
print(f"下载的线稿图片大小: {file_size:.1f}KB")
# 保存图片
with open(output_path, 'wb') as f:
f.write(response.content)
# 验证图片是否可以正常打开
try:
img = Image.open(output_path)
print(f"线稿图片下载成功! 格式: {img.format}, 尺寸: {img.size}")
return True
except Exception as img_error:
print(f"警告: 下载的文件可能不是有效图片: {img_error}")
return False
except requests.exceptions.RequestException as e:
print(f"下载图片失败: {e}")
return False
except Exception as e:
print(f"保存下载的图片失败: {e}")
return False
def save_sketch_result(self, result_data, output_path):
"""
处理API返回的结果并保存图片
"""
try:
# 检查并提取关键数据
if ('media_info_list' not in result_data or
not result_data['media_info_list'] or
'media_data' not in result_data['media_info_list'][0]):
print("错误:响应数据中缺少media_data")
return False
media_data = result_data['media_info_list'][0]['media_data']
parameter = result_data.get('parameter', {})
rsp_media_type = parameter.get('rsp_media_type', '')
print(f"调试信息: rsp_media_type = '{rsp_media_type}'")
print(f"调试信息: media_data 类型: {type(media_data)}")
print(f"调试信息: media_data 内容: {media_data}")
# 方案一:如果media_data是URL链接
if isinstance(media_data, str) and media_data.startswith('http'):
print("检测到URL链接,开始下载图片...")
return self.download_image_from_url(media_data, output_path)
# 方案二:如果media_data是Base64编码的图片数据
elif isinstance(media_data, str) and len(media_data) > 100:
print("尝试解码Base64图片数据...")
try:
image_binary = base64.b64decode(media_data)
with open(output_path, 'wb') as f:
f.write(image_binary)
# 验证图片
img = Image.open(output_path)
print(f"Base64图片保存成功! 格式: {img.format}, 尺寸: {img.size}")
return True
except Exception as e:
print(f"Base64解码失败: {e}")
return False
else:
print(f"无法识别的media_data格式: {media_data[:100]}...")
return False
except Exception as e:
print(f"保存结果时发生未知错误: {str(e)}")
return False
def generate_sketch(self, image_path, output_path="sketch_result.jpg"):
"""生成线稿"""
base64_image = self.image_to_base64(image_path)
if not base64_image:
return False
request_data = {
"parameter": {},
"media_info_list": [
{
"media_data": base64_image,
"media_extra": {},
"media_profiles": {
"media_data_type": "jpg"
}
}
],
"extra": {}
}
try:
print("正在调用美图线稿API...")
response = requests.post(
self.api_url,
headers=self.headers,
json=request_data,
timeout=30
)
if response.status_code == 200:
print("API调用成功!")
result_data = response.json()
# 保存完整的响应数据用于调试
with open('api_response_debug.json', 'w', encoding='utf-8') as f:
json.dump(result_data, f, indent=2, ensure_ascii=False)
print("完整API响应已保存至: api_response_debug.json")
# 保存线稿结果
return self.save_sketch_result(result_data, output_path)
else:
print(f"API调用失败! 状态码: {response.status_code}")
try:
error_data = response.json()
print(f"错误信息: {error_data}")
except:
print(f"响应内容: {response.text}")
return False
except requests.exceptions.Timeout:
print("请求超时,请稍后重试")
return False
except Exception as e:
print(f"请求异常: {str(e)}")
return False
def main():
# 配置信息 - 需要替换为你的实际API密钥
API_KEY = "你的API_KEY"
API_SECRET = "你的API_SECRET"
sketch_api = MeituSketchAPI(API_KEY, API_SECRET)
input_image = "test_image.jpg" # 替换为你的测试图片路径
output_image = "sketch_result.jpg"
if not os.path.exists(input_image):
print(f"错误: 输入图片不存在 - {input_image}")
return
print("开始线稿提取测试...")
success = sketch_api.generate_sketch(input_image, output_image)
if success:
print("\n🎉 测试完成! 线稿图片已生成。")
print(f"📁 输出文件: {output_image}")
else:
print("\n❌ 测试失败!")
if __name__ == "__main__":
main()
提取结果,显示不是特别好,这个接口也不是他们主推的接口
美图 客服加了我wx ,说这是老接口,可能可以定制,后续再发定制接口的效果
更多推荐



所有评论(0)