d18e705a99
- provider: 增加 need_contour/contour_color/contour_size/need_crop_background 参数 - service: 默认 scene=human,human/product 场景自动启用白色描边 + 裁剪背景 - adapter: 透传新参数到 provider - API: scene 默认值改为 human - 前端: removeBackground 默认 scene 改为 human
90 lines
2.4 KiB
Python
90 lines
2.4 KiB
Python
"""
|
|
火山引擎 MediaKit Service
|
|
=========================
|
|
|
|
通过 PlatformGateway 调用 MediaKit 第三方 API,自身负责:
|
|
- 参数校验
|
|
- 结果提取与格式化
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from dataclasses import dataclass, field
|
|
from typing import Any
|
|
|
|
from app.ai.adapters.constants import Method
|
|
from app.platform_gateway import PlatformGateway
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@dataclass
|
|
class RemoveBackgroundResult:
|
|
"""抠图结果"""
|
|
|
|
image_url: str = ""
|
|
raw: dict[str, Any] = field(default_factory=dict)
|
|
|
|
|
|
class VolcengineMediakitService:
|
|
"""火山引擎 MediaKit 服务封装"""
|
|
|
|
# 支持的场景
|
|
SUPPORTED_SCENES = {"general", "human", "product"}
|
|
|
|
def __init__(self, gateway: PlatformGateway):
|
|
self.gateway = gateway
|
|
|
|
async def remove_background(
|
|
self,
|
|
image_url: str,
|
|
scene: str = "human",
|
|
) -> RemoveBackgroundResult:
|
|
"""同步抠图
|
|
|
|
Args:
|
|
image_url: 原始图片 URL
|
|
scene: 场景类型,"general"(通用)、"human"(人物)或 "product"(商品)
|
|
|
|
Returns:
|
|
RemoveBackgroundResult: 包含抠图结果图片 URL
|
|
|
|
Raises:
|
|
ValueError: 参数校验失败
|
|
PlatformError: 平台调用失败
|
|
"""
|
|
if not image_url:
|
|
raise ValueError("image_url 不能为空")
|
|
|
|
if scene not in self.SUPPORTED_SCENES:
|
|
raise ValueError(f"不支持的场景: {scene},可选: {self.SUPPORTED_SCENES}")
|
|
|
|
# 人物/商品场景默认启用白色描边 + 裁剪背景
|
|
enable_contour = scene in ("human", "product")
|
|
payload = {
|
|
"image_url": image_url,
|
|
"scene": scene,
|
|
"need_contour": enable_contour,
|
|
"contour_color": "#FFFFFF",
|
|
"contour_size": 10,
|
|
"need_crop_background": enable_contour,
|
|
}
|
|
|
|
response = await self.gateway.call_sync(
|
|
platform="volcengine_mediakit",
|
|
method=Method.REMOVE_BACKGROUND,
|
|
payload=payload,
|
|
)
|
|
|
|
if not response.success:
|
|
raise RuntimeError(
|
|
response.error_message or "抠图失败"
|
|
)
|
|
|
|
result_image_url = (response.data or {}).get("image_url", "")
|
|
return RemoveBackgroundResult(
|
|
image_url=result_image_url,
|
|
raw=response.data or {},
|
|
)
|