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  ,说这是老接口,可能可以定制,后续再发定制接口的效果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐