feat(接口5): 发际线PNG生成(真实实现,替换Mock)
复用接口2 预览管线:gender 必填 → 该性别全部发际线叠加图(同接口2预览) +
最佳(order=1)发际线曲线的面部中间点坐标。无生发(不调 ComfyUI)。
- hairline/service.py: generate_hairline_pngs——N张发际线叠图 +
best_center(面部中轴眉心x × order1曲线在该处的y)
- app.py: /hairline/generate 真实实现,新增 gender 必填(非法→1004),
返回 hairline_images[].image_base64 + best_hairline_center_point;
无人脸→1001;重活线程池
- 接口文档/OpenAPI: 接口5 新增 gender 入参 + 输出改 base64(网关改url)
- 测试: test_api 接口5(gender必填/N张/center点),44全绿
实测(5090): female 5张叠图 + center{x,y},~2.5s(无Flux)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -136,6 +136,26 @@ def test_growb_success(client, monkeypatch):
|
||||
assert "best_hairline_image_url" not in d
|
||||
|
||||
|
||||
HLGEN = "/api/v1/hairline/generate"
|
||||
|
||||
|
||||
def test_hairline_gen_missing_gender_1004(client):
|
||||
files = {"image_file": ("frontal.jpg", open(fixture("frontal.jpg"), "rb"), "application/octet-stream")}
|
||||
assert client.post(HLGEN, headers=H, files=files).json()["code"] == 1004
|
||||
|
||||
|
||||
def test_hairline_gen_female(client):
|
||||
files = {"image_file": ("frontal.jpg", open(fixture("frontal.jpg"), "rb"), "application/octet-stream")}
|
||||
body = client.post(HLGEN, headers=H, files=files, data={"gender": "female"}).json()
|
||||
assert body["code"] == 0, body
|
||||
d = body["data"]
|
||||
assert [x["order"] for x in d["hairline_images"]] == [1, 2, 3, 4, 5]
|
||||
assert base64.b64decode(d["hairline_images"][0]["image_base64"])[:8] == b"\x89PNG\r\n\x1a\n"
|
||||
c = d["best_hairline_center_point"]
|
||||
assert 0 <= c["x"] <= 682 and 0 <= c["y"] <= 811 # 落在原图范围内
|
||||
assert "image_url" not in d["hairline_images"][0]
|
||||
|
||||
|
||||
def test_success_structure(client):
|
||||
r = _post(client, "frontal.jpg")
|
||||
body = r.json()
|
||||
|
||||
Reference in New Issue
Block a user