diff --git a/backend/__pycache__/config.cpython-314.pyc b/backend/__pycache__/config.cpython-314.pyc index 91481c3..f477bbb 100644 Binary files a/backend/__pycache__/config.cpython-314.pyc and b/backend/__pycache__/config.cpython-314.pyc differ diff --git a/backend/app.py b/backend/app.py index d558cf0..91d209b 100644 --- a/backend/app.py +++ b/backend/app.py @@ -2,6 +2,7 @@ from flask import Flask, request, jsonify, send_from_directory from flask_cors import CORS import json import os +import time import requests import base64 from io import BytesIO @@ -15,29 +16,40 @@ CORS(app) # 启用CORS,允许跨域请求 # 加载发型数据 def load_hairstyles_from_file(): """ - 从hair_res.txt文件加载发型数据 + 从hairId2url.txt文件加载发型数据 + 解析文件中的发型ID和URL对应关系 """ hairstyles = [] try: - # 读取hair_res.txt文件 - with open('../hair_res.txt', 'r', encoding='utf-8') as f: + # 读取hairId2url.txt文件 + with open('../hairId2url.txt', 'r', encoding='utf-8') as f: lines = f.readlines() - # 解析文件内容,提取图片URL - for i, line in enumerate(lines): + # 解析文件内容,提取发型ID和URL + for line in lines: line = line.strip() - # 查找以https开头的行,这些是图片URL - if line.startswith('https://'): - # 生成发型ID和名称 - hairstyle_id = f'hair_{i:03d}' - hairstyle_name = f'发型{i}' - - # 添加到发型列表 - hairstyles.append({ - 'id': hairstyle_id, - 'name': hairstyle_name, - 'image_url': line - }) + + # 查找包含 -> 分隔符的行,这些是发型ID和URL的映射 + if '->' in line and '.jpg' in line: + # 分割行获取文件名和URL + parts = line.split('->') + if len(parts) == 2: + filename = parts[0].strip() + url = parts[1].strip() + + # 提取发型ID(去掉.jpg后缀) + if filename.endswith('.jpg'): + hair_id = filename[:-4] + + # 生成发型名称 + hairstyle_name = f'发型{hair_id[-4:]}' + + # 添加到发型列表 + hairstyles.append({ + 'id': hair_id, + 'name': hairstyle_name, + 'image_url': url + }) except Exception as e: print(f'加载发型数据失败: {str(e)}') @@ -129,30 +141,89 @@ def allowed_file(filename): def call_remote_api(image_data, hairstyle_id): """ 调用远程API处理图片 - 注意:这里是模拟实现,实际项目中需要根据远程API的要求进行调整 + 根据test_hair.py的实现方式 """ try: - # 构建请求数据 - # 注意:这里需要根据远程API的实际要求调整请求格式 - files = {'image': ('upload.jpg', BytesIO(image_data), 'image/jpeg')} - data = {'hairstyle_id': hairstyle_id} + # 将图片数据转换为base64格式 + encoded_string = base64.b64encode(image_data).decode('utf-8') + img64_str = f"data:image/jpeg;base64,{encoded_string}" + + # 构建请求数据(参考test_hair.py的格式) + data = { + "hair_id": hairstyle_id, + "task_id": f"task_{int(time.time())}", # 生成唯一的任务ID + "user_img_path": img64_str, + "is_hr": "false", + "output_format": "base64" + } + + # 打印传入的参数(只打印部分信息,避免日志过长) + print("=== 调用远程API参数 ===") + print(f"hair_id: {hairstyle_id}") + print(f"task_id: {data['task_id']}") + print(f"is_hr: {data['is_hr']}") + print(f"output_format: {data['output_format']}") + print(f"user_img_path 长度: {len(img64_str)}") + print(f"user_img_path 前缀: {img64_str[:50]}...") # 只打印前缀 + print("====================") + + # 设置请求头(参考test_hair.py) + headers = {'Content-Type': 'application/json'} # 发送请求到远程API - # 注意:实际项目中需要替换为真实的远程API地址 - # response = requests.post( - # app.config['REMOTE_API_URL'], - # files=files, - # data=data, - # timeout=app.config['API_TIMEOUT'] - # ) + print(f"发送请求到: {app.config['REMOTE_API_URL']}") + response = requests.post( + app.config['REMOTE_API_URL'], + headers=headers, + json=data, + timeout=app.config['API_TIMEOUT'] + ) - # 模拟远程API返回结果 - # 这里简单返回原始图片数据作为模拟结果 - # 实际项目中应该使用远程API的返回结果 - return image_data + # 打印响应状态 + print(f"响应状态码: {response.status_code}") + print(f"响应内容长度: {len(response.text)}") + # 只打印响应内容的前100个字符,避免base64数据过长 + response_text = response.text + if len(response_text) > 100: + print(f"响应内容: {response_text[:100]}...") + else: + print(f"响应内容: {response_text}") + + # 解析响应数据 + response_data = response.json() + + # 检查响应状态 + if response.status_code != 200: + raise Exception(f"远程API返回错误: {response_data.get('msg', '未知错误')}") + + # 参考test_hair.py的处理方式,直接检查是否有'data'字段 + # 不再依赖'state'字段,因为远程API可能使用不同的成功标识 + result_base64 = response_data.get('data', '') + + # 检查是否有数据返回,即使有msg字段也不视为错误 + # 因为远程API可能在成功时同时返回msg: "success"和data字段 + if not result_base64: + # 如果没有'data'字段,检查是否有其他错误信息 + error_msg = response_data.get('msg', '未知错误') + raise Exception(f"远程API返回错误: {error_msg}") + + # 如果有数据返回,即使msg字段有值也视为成功 + # 打印成功信息 + success_msg = response_data.get('msg', '成功') + print(f"远程API调用成功: {success_msg}") + + # 移除可能的前缀 + if result_base64.startswith("data:image"): + result_base64 = result_base64.split(",", 1)[1] + + # 解码base64数据为图片 + result_image = base64.b64decode(result_base64) + + print("远程API调用成功,返回处理后的图片") + return result_image except Exception as e: + print(f'调用远程API失败: {str(e)}') # 如果远程API调用失败,返回原始图片 - # 实际项目中应该根据需要进行错误处理 return image_data @app.route('/') diff --git a/backend/config.py b/backend/config.py index 21121f4..69b22b5 100644 --- a/backend/config.py +++ b/backend/config.py @@ -4,11 +4,10 @@ class Config: APP_NAME = "Hair Change Color" # 远程发型更换API地址 - # 注意:这里需要根据实际的远程API地址进行修改 - REMOTE_API_URL = "https://api.example.com/change-hair" + REMOTE_API_URL = "http://xiangsilian.com:18801/api/swapHair/v1" # 远程API请求超时时间(秒) - API_TIMEOUT = 30 + API_TIMEOUT = 120 # 延长超时时间,因为发型更换可能需要60秒 # 文件上传配置 MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB diff --git a/frontend/js/main.js b/frontend/js/main.js index 39c6c3a..32b474a 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -177,7 +177,15 @@ async function handleConfirmHairstyle() { } try { + // 显示加载状态,并提示用户可能需要等待的时间 + elements.loading.innerHTML = ` +
+正在处理发型更换,请稍候...
+此过程可能需要10-60秒
+ `; showLoading(); + + // 发起发型更换请求 const response = await changeHair(uploadedImage, selectedHairstyle); if (response.success) { @@ -187,6 +195,7 @@ async function handleConfirmHairstyle() { alert(response.message || '处理失败,请重试'); } } catch (error) { + console.error('处理失败:', error); alert('处理失败,请重试'); } finally { hideLoading(); diff --git a/hairId2url.txt b/hairId2url.txt new file mode 100644 index 0000000..3e008ca --- /dev/null +++ b/hairId2url.txt @@ -0,0 +1,64 @@ +图片文件名 -> OSS URL 映射 +生成时间: 2026-01-18 21:55:09 +-------------------------------------------------------------------------------- + +1953267161121464322.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267161121464322.jpg +1953267288284372994.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267288284372994.jpg +1953270523594317826.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270523594317826.jpg +1953270724765720577.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270724765720577.jpg +1953271922151432194.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953271922151432194.jpg +1953272913265467394.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953272913265467394.jpg +1953288800932503554.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953288800932503554.jpg +1954536242109784066.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536242109784066.jpg +1954536297776586754.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536297776586754.jpg +1954536402516746241.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536402516746241.jpg +1954536893304840194.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536893304840194.jpg +1954536956919848962.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536956919848962.jpg +1954537022875279362.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537022875279362.jpg +1954537085882114050.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537085882114050.jpg +1954537191729569793.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537191729569793.jpg +1954537709436706817.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537709436706817.jpg +1954537743532204034.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537743532204034.jpg +1954537961069780994.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537961069780994.jpg +1954538119216013313.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538119216013313.jpg +1954538156499181569.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538156499181569.jpg +1954538259330932738.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538259330932738.jpg +1954538335306555393.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538335306555393.jpg +1980312945301954561.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980312945301954561.jpg +1980313052302843905.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313052302843905.jpg +1980313166576656385.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313166576656385.jpg +1980313210109337601.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313210109337601.jpg +1980313433502162946.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313433502162946.jpg +1980313576506957825.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313576506957825.jpg +1980313740403580930.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313740403580930.jpg +1980313819915001858.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313819915001858.jpg +1980314032369082369.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314032369082369.jpg +1980314209322573825.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314209322573825.jpg +1980314290419441665.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314290419441665.jpg +1980314381058351106.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314381058351106.jpg +1980314477720281090.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314477720281090.jpg +1980314710101499906.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314710101499906.jpg +1980314764421931009.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314764421931009.jpg +1980314868713299969.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314868713299969.jpg +1980315179934851074.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315179934851074.jpg +1980315238260842497.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315238260842497.jpg +1980361636742209537.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980361636742209537.jpg +1980367742952579074.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367742952579074.jpg +1980367781510815746.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367781510815746.jpg +1980367800787836929.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367800787836929.jpg +1980367852847538177.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367852847538177.jpg +1980367968627105793.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367968627105793.jpg +1980368109866098690.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368109866098690.jpg +1980368205752082434.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368205752082434.jpg +1980368368847593473.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368368847593473.jpg +1980368465631158274.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368465631158274.jpg +1980368588293578754.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368588293578754.jpg +1980413320612847618.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980413320612847618.jpg +1980415346071609345.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415346071609345.jpg +1980415897056354306.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415897056354306.jpg +1981177324700549122.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177324700549122.jpg +1981177378714796034.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177378714796034.jpg +1981177477423546370.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177477423546370.jpg +1981177594750812162.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177594750812162.jpg +1981177742742634497.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177742742634497.jpg +1981177931859607554.jpg -> https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177931859607554.jpg diff --git a/hair_res.txt b/hair_res.txt deleted file mode 100644 index af6b4fb..0000000 --- a/hair_res.txt +++ /dev/null @@ -1,245 +0,0 @@ -OSS 图片下载地址列表 -生成时间: 2026-01-18 19:43:03 -有效期: 7天 ----------------------------------------------------------------------------------------------------- - -1. 1953267183426772993.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953267183426772993.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=J30TNCKCN%2Fga2cHnxxl2sXf3HAQ%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267183426772993.jpg - -2. 1953267306382794754.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953267306382794754.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=iwhuJi4QJNcXeTGSAbTXMAIICUs%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953267306382794754.jpg - -3. 1953270535736827906.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953270535736827906.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=tAGbcGZOZ1nwhb9iLxLgtYcRn0U%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270535736827906.jpg - -4. 1953270765379166210.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953270765379166210.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7Owy2MKtfo3J8z%2Bd6HV4bWlSFwc%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953270765379166210.jpg - -5. 1953271979655340033.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953271979655340033.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=9z9jlCoNvhssT0%2FE8TUhbyktXmk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953271979655340033.jpg - -6. 1953273003010990081.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953273003010990081.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=qbuFkWtdcvoBrKZBSQMQ%2FeDmwf4%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953273003010990081.jpg - -7. 1953288832876322818.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1953288832876322818.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=BA21g5N1j6gFI7tAC8JVAbRPUzs%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1953288832876322818.jpg - -8. 1954536274779217921.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536274779217921.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=JCV%2Fg7TFB7BEew9HF9Y%2Fzqb%2Bjqw%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536274779217921.jpg - -9. 1954536378869260289.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536378869260289.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=qMc35r6evXIFcFY9att6DLc1EGA%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536378869260289.jpg - -10. 1954536462671454210.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536462671454210.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=n5xCbJpM5rEsZK7BUwy8GwY9ttk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536462671454210.jpg - -11. 1954536908916039681.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536908916039681.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=vTCweNOaT1XPe91pNenaBcYCJd4%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536908916039681.jpg - -12. 1954536989530562562.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954536989530562562.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=wXztzfZl%2B5TrvqZ9%2BrlVeDL%2F3VI%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954536989530562562.jpg - -13. 1954537056534568962.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537056534568962.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=k1t6Ah%2BUnYx7JyoBxPoB7dVHMBo%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537056534568962.jpg - -14. 1954537118522187778.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537118522187778.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=lZq6QdHis005jUprFxNLOFEJWOc%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537118522187778.jpg - -15. 1954537220443774978.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537220443774978.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=b%2F%2BXRbP7VaIbgiNWc3sArWZl9OQ%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537220443774978.jpg - -16. 1954537722342580225.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537722342580225.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sV4pQvEz2aJK%2BVAzgk5gJD%2BvRDw%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537722342580225.jpg - -17. 1954537836041773058.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954537836041773058.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=rrrWyVsRXJzLm72gpzt7OglHGSk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954537836041773058.jpg - -18. 1954538018150064130.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538018150064130.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=EtojY0%2BajUSRIIPHBgW7B3HO%2BMs%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538018150064130.jpg - -19. 1954538127558483970.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538127558483970.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=FUcuPhab2Hy45Li8t%2FyrHSAxyeI%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538127558483970.jpg - -20. 1954538206658863106.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538206658863106.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=4ZzTGliU0xlyGRr2FOgCaa1lvDM%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538206658863106.jpg - -21. 1954538312665702402.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538312665702402.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=8XtLzjFoU%2F4UVM1vWW2Tb3JiHw4%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538312665702402.jpg - -22. 1954538399596847105.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1954538399596847105.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=cP6hECwOodfmvvDFJ7cRdPJ2pYo%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1954538399596847105.jpg - -23. 1980312959671640066.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980312959671640066.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=wyZoqiybARkhX0VzLaxNCATR8l0%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980312959671640066.jpg - -24. 1980313137564655617.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313137564655617.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sCunXHIhDpwfzorRS%2FMELL5S51w%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313137564655617.jpg - -25. 1980313176303247362.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313176303247362.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=75xDKKqm6LMEx78V12pJd6K8V30%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313176303247362.jpg - -26. 1980313387905884161.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313387905884161.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=LtVwta24J10UN9NCgApt%2FhNL0ac%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313387905884161.jpg - -27. 1980313509876244482.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313509876244482.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=CVbR16xL4IMcv77Bo1fYfFcynSE%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313509876244482.jpg - -28. 1980313698993217538.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313698993217538.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=LVB21yqsCl%2FoniUuxHKkfYpsfK0%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313698993217538.jpg - -29. 1980313788407390209.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313788407390209.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Y8nL5%2Ba1X0cSnDV2vxAoV55Yj%2FM%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313788407390209.jpg - -30. 1980313965625122818.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980313965625122818.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Cr3kp3pVEMU4JkJXVmb47H9Pf5A%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980313965625122818.jpg - -31. 1980314095635963906.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314095635963906.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Naaq3DWK09vfFhiZocB7vB4vc5U%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314095635963906.jpg - -32. 1980314270513274881.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314270513274881.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=pQz2WLnrvgfXGHH5gMNp0XDvgkU%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314270513274881.jpg - -33. 1980314359856144386.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314359856144386.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=usf%2FpFGpN19DnJbiuSPMz70ytYE%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314359856144386.jpg - -34. 1980314448372736001.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314448372736001.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=XbnCavqYxxdrlwqNoGUvqt7BK3M%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314448372736001.jpg - -35. 1980314530165858305.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314530165858305.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=IF8pHMgpj5ehMrKwJ9f%2FSqg3Sy4%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314530165858305.jpg - -36. 1980314735825166337.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314735825166337.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=x3vi49fohgoiSOVu2F4fDFKOgtA%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314735825166337.jpg - -37. 1980314825046401025.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314825046401025.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=IDYtf4CqcQv80hkeAkun2IgpFZI%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314825046401025.jpg - -38. 1980314913021927426.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980314913021927426.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=k0Vj6KBMo5oQZdRE1B%2FfAvKxWIc%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980314913021927426.jpg - -39. 1980315190596771842.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980315190596771842.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=O4JoBUGCr7tdaP0TKHTfsXslomY%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315190596771842.jpg - -40. 1980315251485483009.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980315251485483009.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=AlASa41wpcIckobaL78w6bFqi94%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980315251485483009.jpg - -41. 1980361645583802369.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980361645583802369.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=t09flD8Er%2Fz7E7JdrSJHP1UHDCk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980361645583802369.jpg - -42. 1980367759775932418.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367759775932418.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=2CZztgTQcXsofVDjpkmUgtbTinA%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367759775932418.jpg - -43. 1980367786975993857.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367786975993857.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=goyLdGIttHQFCOE1s74HWG7IhEQ%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367786975993857.jpg - -44. 1980367822954733569.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367822954733569.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=01BmPdUDD5DmWrgKHHEzVN3x6no%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367822954733569.jpg - -45. 1980367945432604674.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980367945432604674.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7xcWvSmpGTDl%2FfWBdoEEVAi%2F%2F%2Fw%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980367945432604674.jpg - -46. 1980368060729827329.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368060729827329.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=Iq0vyIpE5SlUDKrnDptmw1Zxfqw%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368060729827329.jpg - -47. 1980368182154928129.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368182154928129.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=23QZbeAHpSpWl1GByEPqhZRt1Uc%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368182154928129.jpg - -48. 1980368318314618881.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368318314618881.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=2rLl6YDVxzNA5b7OTNoR5TJjiBQ%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368318314618881.jpg - -49. 1980368442726064130.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368442726064130.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=OIRFLuemfFMp874fESBXFU6CXHo%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368442726064130.jpg - -50. 1980368569217884162.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368569217884162.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=SOURnVC0Xg0OHDw5JtgmhMb5b6I%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368569217884162.jpg - -51. 1980368701497843714.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980368701497843714.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=0Kyv6mvAqCW4SW6Dsh1mkYGwyQk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980368701497843714.jpg - -52. 1980413331509649409.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980413331509649409.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=aF%2F%2BT54NeSsVPs%2B8%2FlFjQcQLH04%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980413331509649409.jpg - -53. 1980415354346971137.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980415354346971137.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=FVbFJ6Iob2oKWj0R3FhVlyV1eKc%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415354346971137.jpg - -54. 1980415913099567106.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1980415913099567106.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=xDxM7XKPshiaoch4Tf6rhNIciO0%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1980415913099567106.jpg - -55. 1981177348821991426.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177348821991426.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=j1kSUgMSRd4mHom2wXplTwk%2F%2Bdk%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177348821991426.jpg - -56. 1981177450269622273.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177450269622273.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=7UUYMWTEZsTFgceH6geSHc60Uz8%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177450269622273.jpg - -57. 1981177567613665282.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177567613665282.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=sw07uihKbWggf8pn2%2Bppnx1pwIo%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177567613665282.jpg - -58. 1981177689399476226.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177689399476226.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=kwm9YVWio8Q8%2FFLOnqCyNy3FvwQ%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177689399476226.jpg - -59. 1981177812825260034.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177812825260034.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=gFs3LlHWc9eF%2Bm8DT6%2F8cSXDLoI%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177812825260034.jpg - -60. 1981177943427497985.jpg - http://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images%2F1981177943427497985.jpg?OSSAccessKeyId=LTAI5t7nY99pt7fN9J56A5vN&Expires=1769341383&Signature=hAyOiP9nLt9y7S3sYSPl8aH%2Flpw%3D - https://xiangsilian.oss-cn-beijing.aliyuncs.com/hair_images/1981177943427497985.jpg - diff --git a/test/test_hair.py b/test/test_hair.py new file mode 100644 index 0000000..154944f --- /dev/null +++ b/test/test_hair.py @@ -0,0 +1,126 @@ +import threading +import requests +import json +import base64 +import time +import random + +url = 'http://xiangsilian.com:18801/api/swapHair/v1' + +headers = {'Content-Type': 'application/json'} +data = { + "hair_id": "1907651680352395265", + "task_id": "345564352345", + "user_img_path": "https://cdn.meidaojia.com/ZoeFiles/testuser_8.JPG", + "is_hr": "false", + "output_format": "base64" +} + + + +def image_to_base64(file_path, mime_type=None): + """ + 将图片文件转换为带Base64前缀的Data URI字符串 + + 参数: + file_path (str): 图片文件路径 + mime_type (str): 可选,指定MIME类型。如果为None,则根据文件扩展名自动判断 + + 返回: + str: 带Base64前缀的Data URI字符串 + """ + # 如果没有指定MIME类型,根据文件扩展名推断 + if mime_type is None: + extension = file_path.split('.')[-1].lower() + mime_types = { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'gif': 'image/gif', + 'webp': 'image/webp', + 'bmp': 'image/bmp' + } + mime_type = mime_types.get(extension, 'application/octet-stream') + + # 读取文件内容并编码为Base64 + with open(file_path, 'rb') as image_file: + encoded_string = base64.b64encode(image_file.read()).decode('utf-8') + + # 组合成Data URI格式 + return f"data:{mime_type};base64,{encoded_string}" + +img64_str = image_to_base64("wertwert.jpg") +data['user_img_path'] = img64_str + +responses = [] + +lock = threading.Lock() + + +send_index = 0 + +def send_request(start_time): + try: + sleep_time = start_time + time.sleep(sleep_time) + global send_index + send_data = data + response = requests.post(url, headers=headers, json=send_data) + with lock: # 加锁,防止多线程同时修改 responses + responses.append(response) + except Exception as e: + with lock: + responses.append({"error": str(e)}) + +threads = [] +num_requests = 1 + +time_start = time.time() + +start_time = 0 +for _ in range(num_requests): + start_time = 0 + t = threading.Thread(target=send_request, args=(start_time,)) + t.start() + threads.append(t) + + +for t in threads: + t.join() + +end_time = time.time() + +total_time = (end_time - time_start) +qps = num_requests/total_time +print(f"num_requests:{num_requests} total_time:{total_time} qps:{qps}") + + + +import base64 +import os + +def save_base64_image(base64_str, filename): + """ + 将 Base64 编码的图片字符串保存为本地 JPG 文件。 + + :param base64_str: Base64 编码的图片字符串(可能包含 data:image/jpeg;base64, 前缀) + :param filename: 保存的文件名(例如 'image.jpg') + """ + # 如果包含 data URL 前缀,去掉它 + if base64_str.startswith("data:image"): + base64_str = base64_str.split(",", 1)[1] + + try: + image_data = base64.b64decode(base64_str) + with open(filename, "wb") as f: + f.write(image_data) + print(f"图片已保存为 {filename}") + except Exception as e: + print(f"保存图片失败: {e}") + +# 打印所有响应 +for i, resp in enumerate(responses, 1): + print(f"请求 {i} 结果: {resp.status_code, resp.text[:128]}") + json_obj = json.loads(resp.text) + data_string = json_obj['data'] + save_base64_image(data_string, f"response_{i}.jpg") \ No newline at end of file diff --git a/test/wertwert.jpg b/test/wertwert.jpg new file mode 100644 index 0000000..18128ee Binary files /dev/null and b/test/wertwert.jpg differ