feat: image edit route

This commit is contained in:
martsforever
2025-12-19 23:19:43 +08:00
parent a875f7b281
commit d258105be2
2 changed files with 110 additions and 1 deletions
+108
View File
@@ -0,0 +1,108 @@
import asyncio
import base64
import json
import mimetypes
import os
import sys
import uuid
from http import HTTPStatus
from pathlib import PurePosixPath, Path
import requests
from fastapi import FastAPI
from pydantic import BaseModel, Field
from urllib.parse import urlparse, unquote
from app.config.env import env
from app.utils.path_join import path_join
class ImageGenerateSchema(BaseModel):
image_url: str = Field(..., description="图片地址")
prompt: str = Field(..., description="图片描述")
image_size: str = Field(default="1920*1080", description="图片尺寸")
def add_image_edit_route(app: FastAPI):
@app.post('/image-generate')
async def image_generate(body: ImageGenerateSchema):
return await asyncio.to_thread(sync_generate_image, body)
def sync_generate_image(param: ImageGenerateSchema):
"""
同步生成图片方法
"""
# 计算图片的本地访问路径
image_url_1 = env.file_save_path + param.image_url[len(env.file_public_path):]
if sys.platform == "win32":
image_url_1 = path_join('D:/', image_url_1)
print("image_url_1", image_url_1)
# 图片文件名
filename_with_ext = os.path.basename(param.image_url)
# 新图片的ID
file_id = str(uuid.uuid4())
# 新图片所在目录
Path(path_join(env.file_save_path, file_id)).mkdir(parents=True, exist_ok=True)
# 新图片的public访问路径
new_file_public_path = path_join(env.file_public_path, file_id, filename_with_ext)
# 新图片在服务器上的保存路径
new_file_save_path = path_join(env.file_save_path, file_id, filename_with_ext)
# 获取图像的 Base64 编码
# 调用编码函数,请将 "/path/to/your/image.png" 替换为您的本地图片文件路径,否则无法运行
image = encode_file(image_url_1)
request_payload = {
"prompt": param.prompt,
"image": image,
"sequential_image_generation": "disabled",
"stream": False,
"optimize_prompt_optionsnew": "fast",
"response_format": "url",
"size": "2560x1440",
"watermark": False,
"model": "doubao-seedream-4-5-251128"
}
response = requests.post(
url="https://ark.cn-beijing.volces.com/api/v3/images/generations",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {env.llm_key_huoshan}",
},
data=json.dumps(request_payload),
)
response.raise_for_status()
json_data = response.json()
print("json_data")
print(json_data)
if response.status_code == 200:
url = json_data["data"][0]["url"]
file_content = requests.get(url).content
with open(new_file_save_path, 'wb+') as f:
f.write(file_content)
return {"path": new_file_public_path}
else:
print(f"HTTP返回码:{response.status_code}")
print("请参考文档:https://help.aliyun.com/zh/model-studio/error-code")
raise response
# ---用于 Base64 编码 ---
# 格式为 data:{mime_type};base64,{base64_data}
def encode_file(file_path):
mime_type, _ = mimetypes.guess_type(file_path)
if not mime_type or not mime_type.startswith("image/"):
raise ValueError("不支持或无法识别的图像格式")
try:
with open(file_path, "rb") as image_file:
encoded_string = base64.b64encode(
image_file.read()).decode('utf-8')
return f"data:{mime_type};base64,{encoded_string}"
except IOError as e:
raise IOError(f"读取文件时出错: {file_path}, 错误: {str(e)}")
+2 -1
View File
@@ -9,6 +9,7 @@ from app.controller.add_api_route import add_api_route
from app.controller.add_approve_route import add_approve_route
from app.controller.add_file_route import add_file_route
from app.controller.add_hotel_route import add_hotel_route
from app.controller.add_image_edit_route import add_image_edit_route
from app.controller.add_knowledge_route import add_knowledge_route
from app.controller.add_langgraph_approve_route import add_langgraph_approve_route
from app.controller.add_langgraph_chat_route import add_langgraph_chat_route
@@ -85,7 +86,7 @@ add_general_route(app)
add_websocket_route(app)
add_websocket_voice_recognise_route(app)
add_websocket_voice_generate_route(app)
add_image_edit_route(app)
@app.get("/get_env")
async def test():