Pārlūkot izejas kodu

Initial commit: AI设计

mia 3 mēneši atpakaļ
revīzija
19e7f0189e

BIN
__pycache__/conf.cpython-310.pyc


BIN
__pycache__/llm.cpython-310.pyc


BIN
__pycache__/logger_setup.cpython-310.pyc


BIN
__pycache__/prompt.cpython-310.pyc


BIN
__pycache__/qwen_edit.cpython-310.pyc


BIN
__pycache__/upload_tos.cpython-310.pyc


BIN
__pycache__/utils.cpython-310.pyc


+ 96 - 0
git_fix.bat

@@ -0,0 +1,96 @@
+@echo off
+chcp 65001 >nul
+echo ========================================
+echo Git 推送修复脚本
+echo ========================================
+echo.
+
+echo [1/6] 检查远程仓库配置...
+git remote -v
+
+echo.
+echo [2/6] 如果需要更新远程URL,请输入新的URL,否则按回车跳过
+set /p NEW_URL="新URL (留空跳过): "
+if not "%NEW_URL%"=="" (
+    echo 更新远程仓库URL...
+    git remote set-url origin %NEW_URL%
+    echo 已更新为: %NEW_URL%
+)
+
+echo.
+echo [3/6] 检查当前分支...
+git branch
+
+echo.
+echo [4/6] 检查是否有未提交的更改...
+git status --short
+if %errorlevel% equ 0 (
+    echo 有未提交的更改,正在添加...
+    git add .
+    echo 创建提交...
+    git commit -m "Update: 更新代码 - %date% %time%"
+) else (
+    echo 检查是否有未暂存的文件...
+    git diff --quiet
+    if %errorlevel% neq 0 (
+        echo 有未暂存的文件,正在添加...
+        git add .
+        git commit -m "Update: 更新代码 - %date% %time%"
+    ) else (
+        git diff --cached --quiet
+        if %errorlevel% neq 0 (
+            echo 有已暂存但未提交的文件,创建提交...
+            git commit -m "Update: 更新代码 - %date% %time%"
+        ) else (
+            echo 没有需要提交的更改
+        )
+    )
+)
+
+echo.
+echo [5/6] 检查提交历史...
+git log --oneline -3
+
+echo.
+echo [6/6] 准备推送...
+REM 获取当前分支名称
+for /f "tokens=*" %%b in ('git branch --show-current 2^>nul') do set CURRENT_BRANCH=%%b
+if "%CURRENT_BRANCH%"=="" (
+    for /f "tokens=*" %%b in ('git branch 2^>nul ^| findstr /C:"*"') do set CURRENT_BRANCH=%%b
+    set CURRENT_BRANCH=%CURRENT_BRANCH:* =%
+)
+
+echo 当前分支: %CURRENT_BRANCH%
+
+if "%CURRENT_BRANCH%"=="" (
+    echo 警告: 无法确定当前分支,尝试使用 master
+    set CURRENT_BRANCH=master
+)
+
+echo.
+echo 尝试推送到远程仓库...
+echo 如果失败,请尝试: git push -u origin %CURRENT_BRANCH%
+git push -u origin %CURRENT_BRANCH%
+
+if %errorlevel% neq 0 (
+    echo.
+    echo 推送失败,尝试其他方法...
+    echo.
+    echo 选项1: 如果远程使用 main 分支
+    echo   git branch -M main
+    echo   git push -u origin main
+    echo.
+    echo 选项2: 如果远程仓库是空的,强制推送
+    echo   git push -u origin %CURRENT_BRANCH% --force
+    echo.
+    echo 选项3: 先拉取远程内容
+    echo   git pull origin %CURRENT_BRANCH% --allow-unrelated-histories
+    echo   git push -u origin %CURRENT_BRANCH%
+)
+
+echo.
+echo ========================================
+echo 完成!
+echo ========================================
+pause
+

+ 184 - 0
git_push.py

@@ -0,0 +1,184 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Git 推送自动化脚本
+自动执行 Git 初始化、提交和推送操作
+"""
+
+import subprocess
+import sys
+import os
+
+def run_command(cmd, description):
+    """执行命令并显示结果"""
+    print(f"\n{'='*50}")
+    print(f"执行: {description}")
+    print(f"命令: {cmd}")
+    print(f"{'='*50}")
+    
+    try:
+        result = subprocess.run(
+            cmd,
+            shell=True,
+            capture_output=True,
+            text=True,
+            encoding='utf-8',
+            errors='ignore'
+        )
+        
+        if result.stdout:
+            print(result.stdout)
+        if result.stderr:
+            print(result.stderr, file=sys.stderr)
+        
+        return result.returncode == 0, result.stdout, result.stderr
+    except Exception as e:
+        print(f"错误: {e}")
+        return False, "", str(e)
+
+def main():
+    print("="*50)
+    print("Git 推送自动化脚本")
+    print("="*50)
+    
+    # 切换到项目目录
+    os.chdir(r"D:\线稿图")
+    print(f"当前目录: {os.getcwd()}")
+    
+    # 1. 检查 Git 仓库
+    print("\n[1/7] 检查 Git 仓库...")
+    if not os.path.exists(".git"):
+        print("Git 仓库不存在,正在初始化...")
+        success, _, _ = run_command("git init", "初始化 Git 仓库")
+        if not success:
+            print("❌ Git 初始化失败")
+            return
+    else:
+        print("✅ Git 仓库已存在")
+    
+    # 2. 检查远程仓库配置
+    print("\n[2/7] 检查远程仓库配置...")
+    success, output, _ = run_command("git remote -v", "查看远程仓库")
+    if "origin" not in output:
+        print("添加远程仓库...")
+        run_command(
+            "git remote add origin http://git.gloria.com.cn:10080/AI/AI_design_agent.git",
+            "添加远程仓库"
+        )
+    else:
+        print("✅ 远程仓库已配置")
+        # 更新远程 URL(如果需要)
+        run_command(
+            "git remote set-url origin http://git.gloria.com.cn:10080/AI/AI_design_agent.git",
+            "更新远程仓库 URL"
+        )
+    
+    # 3. 检查当前分支
+    print("\n[3/7] 检查当前分支...")
+    success, branch_output, _ = run_command("git branch", "查看分支")
+    current_branch = None
+    
+    # 尝试获取当前分支
+    success, branch_output, _ = run_command("git branch --show-current", "获取当前分支")
+    if success and branch_output.strip():
+        current_branch = branch_output.strip()
+    else:
+        # 备用方法
+        success, branch_output, _ = run_command("git branch", "查看所有分支")
+        for line in branch_output.split('\n'):
+            if '*' in line:
+                current_branch = line.replace('*', '').strip()
+                break
+    
+    if not current_branch:
+        # 如果没有分支,创建 master 分支
+        print("没有分支,创建 master 分支...")
+        run_command("git checkout -b master", "创建并切换到 master 分支")
+        current_branch = "master"
+    
+    print(f"当前分支: {current_branch}")
+    
+    # 4. 添加所有文件
+    print("\n[4/7] 添加所有文件到暂存区...")
+    run_command("git add .", "添加所有文件")
+    
+    # 5. 检查是否有未提交的更改
+    print("\n[5/7] 检查未提交的更改...")
+    success, status_output, _ = run_command("git status --short", "检查状态")
+    
+    has_changes = bool(status_output.strip())
+    
+    # 检查是否有已暂存但未提交的文件
+    success, diff_output, _ = run_command("git diff --cached --quiet", "检查已暂存文件")
+    has_staged = not success  # diff --quiet 返回非0表示有差异
+    
+    if has_changes or has_staged:
+        print("有未提交的更改,创建提交...")
+        commit_message = "Update: 更新代码"
+        success, _, _ = run_command(
+            f'git commit -m "{commit_message}"',
+            "创建提交"
+        )
+        if success:
+            print("✅ 提交成功")
+        else:
+            print("⚠️ 提交可能失败或没有需要提交的内容")
+    else:
+        print("没有需要提交的更改")
+    
+    # 6. 检查提交历史
+    print("\n[6/7] 检查提交历史...")
+    run_command("git log --oneline -3", "查看最近3次提交")
+    
+    # 7. 推送到远程
+    print("\n[7/7] 推送到远程仓库...")
+    print(f"尝试推送到: origin/{current_branch}")
+    
+    # 先尝试推送
+    success, output, error = run_command(
+        f"git push -u origin {current_branch}",
+        f"推送到远程 {current_branch} 分支"
+    )
+    
+    if not success:
+        print("\n⚠️ 推送失败,尝试其他方法...")
+        
+        # 尝试 main 分支
+        if current_branch != "main":
+            print("尝试推送到 main 分支...")
+            run_command("git branch -M main", "重命名分支为 main")
+            success, _, _ = run_command(
+                "git push -u origin main",
+                "推送到远程 main 分支"
+            )
+            if success:
+                print("✅ 推送到 main 分支成功")
+                return
+        
+        # 如果还是失败,提示用户
+        print("\n❌ 推送失败,可能的原因:")
+        print("1. 远程仓库需要认证")
+        print("2. 远程仓库已有内容,需要先拉取")
+        print("3. 网络连接问题")
+        print("\n建议手动执行:")
+        print(f"  git pull origin {current_branch} --allow-unrelated-histories")
+        print(f"  git push -u origin {current_branch}")
+    else:
+        print("✅ 推送成功!")
+    
+    print("\n" + "="*50)
+    print("完成!")
+    print("="*50)
+
+if __name__ == "__main__":
+    try:
+        main()
+    except KeyboardInterrupt:
+        print("\n\n操作已取消")
+        sys.exit(1)
+    except Exception as e:
+        print(f"\n❌ 发生错误: {e}")
+        import traceback
+        traceback.print_exc()
+        sys.exit(1)
+

+ 83 - 0
git_setup.bat

@@ -0,0 +1,83 @@
+@echo off
+chcp 65001 >nul
+echo ========================================
+echo Git 仓库初始化脚本
+echo ========================================
+echo.
+
+echo [1/5] 检查 Git 仓库状态...
+if exist .git (
+    echo Git 仓库已存在
+) else (
+    echo 初始化 Git 仓库...
+    git init
+)
+
+echo.
+echo [2/5] 检查当前分支...
+git branch
+
+echo.
+echo [3/5] 添加所有文件到暂存区...
+git add .
+
+echo.
+echo [4/5] 检查是否有未提交的更改...
+git status --short
+if %errorlevel% neq 0 (
+    echo 创建初始提交...
+    git commit -m "Initial commit: 线稿图生成项目"
+) else (
+    echo 检查是否有未提交的文件...
+    git diff --cached --quiet
+    if %errorlevel% neq 0 (
+        echo 创建提交...
+        git commit -m "Update: 更新代码"
+    ) else (
+        echo 没有需要提交的更改
+    )
+)
+
+echo.
+echo [5/5] 检查远程仓库配置...
+git remote -v
+
+echo.
+echo ========================================
+echo 准备推送...
+echo ========================================
+echo.
+
+REM 检查当前分支名称
+for /f "tokens=2" %%b in ('git branch --show-current 2^>nul') do set CURRENT_BRANCH=%%b
+if "%CURRENT_BRANCH%"=="" (
+    for /f "tokens=*" %%b in ('git branch 2^>nul ^| findstr /C:"*"') do set CURRENT_BRANCH=%%b
+    set CURRENT_BRANCH=%CURRENT_BRANCH:* =%
+)
+
+echo 当前分支: %CURRENT_BRANCH%
+
+if "%CURRENT_BRANCH%"=="" (
+    echo 错误: 无法确定当前分支,请手动检查
+    pause
+    exit /b 1
+)
+
+echo.
+echo 尝试推送到远程仓库...
+if "%CURRENT_BRANCH%"=="main" (
+    git push -u origin main
+) else if "%CURRENT_BRANCH%"=="master" (
+    git push -u origin master
+) else (
+    echo 当前分支是: %CURRENT_BRANCH%
+    echo 尝试推送到该分支...
+    git push -u origin %CURRENT_BRANCH%
+)
+
+echo.
+echo ========================================
+echo 完成!
+echo ========================================
+pause
+

+ 2163 - 0
logs/fal_api.log

@@ -0,0 +1,2163 @@
+[2025-11-18 09:21:56,794] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_092156_678.png
+[2025-11-18 09:21:56,795] INFO: 文件将保存为: design_image/cropped_20251118_092156_678.png
+[2025-11-18 09:21:57,302] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_092156_678.png
+[2025-11-18 09:21:57,304] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_092156_678.png
+[2025-11-18 09:32:17,686] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093217_552.png
+[2025-11-18 09:32:17,686] INFO: 文件将保存为: design_image/cropped_20251118_093217_552.png
+[2025-11-18 09:32:18,190] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093217_552.png
+[2025-11-18 09:32:18,191] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093217_552.png
+[2025-11-18 09:33:36,300] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093336_181.png
+[2025-11-18 09:33:36,301] INFO: 文件将保存为: design_image/cropped_20251118_093336_181.png
+[2025-11-18 09:33:36,853] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093336_181.png
+[2025-11-18 09:33:36,854] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093336_181.png
+[2025-11-18 09:35:21,352] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093521_237.png
+[2025-11-18 09:35:21,352] INFO: 文件将保存为: design_image/cropped_20251118_093521_237.png
+[2025-11-18 09:35:21,925] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093521_237.png
+[2025-11-18 09:35:21,927] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093521_237.png
+[2025-11-18 09:36:08,570] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093608_455.png
+[2025-11-18 09:36:08,571] INFO: 文件将保存为: design_image/cropped_20251118_093608_455.png
+[2025-11-18 09:36:09,102] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093608_455.png
+[2025-11-18 09:36:09,103] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093608_455.png
+[2025-11-18 09:36:56,114] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093656_000.png
+[2025-11-18 09:36:56,115] INFO: 文件将保存为: design_image/cropped_20251118_093656_000.png
+[2025-11-18 09:36:56,624] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093656_000.png
+[2025-11-18 09:36:56,625] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093656_000.png
+[2025-11-18 09:38:22,253] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093822_139.png
+[2025-11-18 09:38:22,254] INFO: 文件将保存为: design_image/cropped_20251118_093822_139.png
+[2025-11-18 09:38:23,114] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093822_139.png
+[2025-11-18 09:38:23,115] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093822_139.png
+[2025-11-18 09:39:45,178] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_093945_065.png
+[2025-11-18 09:39:45,179] INFO: 文件将保存为: design_image/cropped_20251118_093945_065.png
+[2025-11-18 09:39:45,706] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093945_065.png
+[2025-11-18 09:39:45,707] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_093945_065.png
+[2025-11-18 09:40:49,815] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_094049_699.png
+[2025-11-18 09:40:49,815] INFO: 文件将保存为: design_image/cropped_20251118_094049_699.png
+[2025-11-18 09:40:50,351] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094049_699.png
+[2025-11-18 09:40:50,352] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094049_699.png
+[2025-11-18 09:45:59,946] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_094559_545.png
+[2025-11-18 09:45:59,946] INFO: 文件将保存为: design_image/cropped_20251118_094559_545.png
+[2025-11-18 09:46:01,683] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094559_545.png
+[2025-11-18 09:46:01,684] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094559_545.png
+[2025-11-18 09:48:41,389] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_094840_988.png
+[2025-11-18 09:48:41,389] INFO: 文件将保存为: design_image/cropped_20251118_094840_988.png
+[2025-11-18 09:48:43,112] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094840_988.png
+[2025-11-18 09:48:43,113] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_094840_988.png
+[2025-11-18 10:14:31,270] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_101431_012.png
+[2025-11-18 10:14:31,270] INFO: 文件将保存为: design_image/cropped_20251118_101431_012.png
+[2025-11-18 10:14:31,849] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_101431_012.png
+[2025-11-18 10:14:31,850] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_101431_012.png
+[2025-11-18 10:15:22,470] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_101522_212.png
+[2025-11-18 10:15:22,470] INFO: 文件将保存为: design_image/cropped_20251118_101522_212.png
+[2025-11-18 10:15:23,391] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_101522_212.png
+[2025-11-18 10:15:23,392] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_101522_212.png
+[2025-11-18 10:40:06,861] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_104006_600.png
+[2025-11-18 10:40:06,861] INFO: 文件将保存为: design_image/cropped_20251118_104006_600.png
+[2025-11-18 10:40:08,029] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104006_600.png
+[2025-11-18 10:40:08,030] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104006_600.png
+[2025-11-18 10:41:08,533] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_104108_272.png
+[2025-11-18 10:41:08,533] INFO: 文件将保存为: design_image/cropped_20251118_104108_272.png
+[2025-11-18 10:41:10,095] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104108_272.png
+[2025-11-18 10:41:10,096] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104108_272.png
+[2025-11-18 10:42:02,739] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_104202_478.png
+[2025-11-18 10:42:02,740] INFO: 文件将保存为: design_image/cropped_20251118_104202_478.png
+[2025-11-18 10:42:03,694] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104202_478.png
+[2025-11-18 10:42:03,695] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104202_478.png
+[2025-11-18 10:45:39,029] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251118_104538_767.png
+[2025-11-18 10:45:39,029] INFO: 文件将保存为: design_image/cropped_20251118_104538_767.png
+[2025-11-18 10:45:39,962] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104538_767.png
+[2025-11-18 10:45:39,963] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251118_104538_767.png
+[2025-11-19 11:05:29,132] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_110529_112.png
+[2025-11-19 11:05:29,133] INFO: 文件将保存为: design_image/cropped_20251119_110529_112.png
+[2025-11-19 11:05:29,392] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_110529_112.png
+[2025-11-19 11:05:29,394] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_110529_112.png
+[2025-11-19 11:11:50,842] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111150_807.png
+[2025-11-19 11:11:50,843] INFO: 文件将保存为: design_image/cropped_20251119_111150_807.png
+[2025-11-19 11:11:51,056] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111150_807.png
+[2025-11-19 11:11:51,057] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111150_807.png
+[2025-11-19 11:11:52,371] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111152_351.png
+[2025-11-19 11:11:52,371] INFO: 文件将保存为: design_image/cropped_20251119_111152_351.png
+[2025-11-19 11:11:52,581] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111152_351.png
+[2025-11-19 11:11:52,582] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111152_351.png
+[2025-11-19 11:11:54,056] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111154_026.png
+[2025-11-19 11:11:54,056] INFO: 文件将保存为: design_image/cropped_20251119_111154_026.png
+[2025-11-19 11:11:54,231] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111154_026.png
+[2025-11-19 11:11:54,232] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111154_026.png
+[2025-11-19 11:11:55,526] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111155_509.png
+[2025-11-19 11:11:55,526] INFO: 文件将保存为: design_image/cropped_20251119_111155_509.png
+[2025-11-19 11:11:55,709] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111155_509.png
+[2025-11-19 11:11:55,710] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111155_509.png
+[2025-11-19 11:11:56,851] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111156_835.png
+[2025-11-19 11:11:56,851] INFO: 文件将保存为: design_image/cropped_20251119_111156_835.png
+[2025-11-19 11:11:57,029] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111156_835.png
+[2025-11-19 11:11:57,030] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111156_835.png
+[2025-11-19 11:11:58,233] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111158_217.png
+[2025-11-19 11:11:58,234] INFO: 文件将保存为: design_image/cropped_20251119_111158_217.png
+[2025-11-19 11:11:58,407] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111158_217.png
+[2025-11-19 11:11:58,409] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111158_217.png
+[2025-11-19 11:11:59,591] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111159_562.png
+[2025-11-19 11:11:59,591] INFO: 文件将保存为: design_image/cropped_20251119_111159_562.png
+[2025-11-19 11:11:59,798] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111159_562.png
+[2025-11-19 11:11:59,800] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111159_562.png
+[2025-11-19 11:12:00,993] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111200_977.png
+[2025-11-19 11:12:00,993] INFO: 文件将保存为: design_image/cropped_20251119_111200_977.png
+[2025-11-19 11:12:01,175] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111200_977.png
+[2025-11-19 11:12:01,176] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111200_977.png
+[2025-11-19 11:12:02,393] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111202_364.png
+[2025-11-19 11:12:02,393] INFO: 文件将保存为: design_image/cropped_20251119_111202_364.png
+[2025-11-19 11:12:02,576] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111202_364.png
+[2025-11-19 11:12:02,577] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111202_364.png
+[2025-11-19 11:12:03,733] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111203_719.png
+[2025-11-19 11:12:03,735] INFO: 文件将保存为: design_image/cropped_20251119_111203_719.png
+[2025-11-19 11:12:03,879] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111203_719.png
+[2025-11-19 11:12:03,880] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111203_719.png
+[2025-11-19 11:12:05,180] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111205_159.png
+[2025-11-19 11:12:05,181] INFO: 文件将保存为: design_image/cropped_20251119_111205_159.png
+[2025-11-19 11:12:05,361] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111205_159.png
+[2025-11-19 11:12:05,362] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111205_159.png
+[2025-11-19 11:12:06,589] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111206_568.png
+[2025-11-19 11:12:06,589] INFO: 文件将保存为: design_image/cropped_20251119_111206_568.png
+[2025-11-19 11:12:06,766] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111206_568.png
+[2025-11-19 11:12:06,767] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111206_568.png
+[2025-11-19 11:12:07,926] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111207_903.png
+[2025-11-19 11:12:07,926] INFO: 文件将保存为: design_image/cropped_20251119_111207_903.png
+[2025-11-19 11:12:08,070] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111207_903.png
+[2025-11-19 11:12:08,071] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111207_903.png
+[2025-11-19 11:12:09,203] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111209_190.png
+[2025-11-19 11:12:09,203] INFO: 文件将保存为: design_image/cropped_20251119_111209_190.png
+[2025-11-19 11:12:09,351] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111209_190.png
+[2025-11-19 11:12:09,352] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111209_190.png
+[2025-11-19 11:12:10,520] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111210_496.png
+[2025-11-19 11:12:10,521] INFO: 文件将保存为: design_image/cropped_20251119_111210_496.png
+[2025-11-19 11:12:10,751] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111210_496.png
+[2025-11-19 11:12:10,752] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111210_496.png
+[2025-11-19 11:12:12,201] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111212_176.png
+[2025-11-19 11:12:12,202] INFO: 文件将保存为: design_image/cropped_20251119_111212_176.png
+[2025-11-19 11:12:12,437] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111212_176.png
+[2025-11-19 11:12:12,438] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111212_176.png
+[2025-11-19 11:12:13,695] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111213_670.png
+[2025-11-19 11:12:13,695] INFO: 文件将保存为: design_image/cropped_20251119_111213_670.png
+[2025-11-19 11:12:13,863] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111213_670.png
+[2025-11-19 11:12:13,864] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111213_670.png
+[2025-11-19 11:12:15,074] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111215_056.png
+[2025-11-19 11:12:15,074] INFO: 文件将保存为: design_image/cropped_20251119_111215_056.png
+[2025-11-19 11:12:15,290] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111215_056.png
+[2025-11-19 11:12:15,291] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111215_056.png
+[2025-11-19 11:12:16,496] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111216_476.png
+[2025-11-19 11:12:16,496] INFO: 文件将保存为: design_image/cropped_20251119_111216_476.png
+[2025-11-19 11:12:16,745] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111216_476.png
+[2025-11-19 11:12:16,746] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111216_476.png
+[2025-11-19 11:12:18,094] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111218_073.png
+[2025-11-19 11:12:18,094] INFO: 文件将保存为: design_image/cropped_20251119_111218_073.png
+[2025-11-19 11:12:18,247] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111218_073.png
+[2025-11-19 11:12:18,248] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111218_073.png
+[2025-11-19 11:12:19,482] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111219_463.png
+[2025-11-19 11:12:19,483] INFO: 文件将保存为: design_image/cropped_20251119_111219_463.png
+[2025-11-19 11:12:19,633] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111219_463.png
+[2025-11-19 11:12:19,634] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111219_463.png
+[2025-11-19 11:12:21,107] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111221_070.png
+[2025-11-19 11:12:21,107] INFO: 文件将保存为: design_image/cropped_20251119_111221_070.png
+[2025-11-19 11:12:21,333] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111221_070.png
+[2025-11-19 11:12:21,334] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111221_070.png
+[2025-11-19 11:12:22,516] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111222_494.png
+[2025-11-19 11:12:22,517] INFO: 文件将保存为: design_image/cropped_20251119_111222_494.png
+[2025-11-19 11:12:22,727] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111222_494.png
+[2025-11-19 11:12:22,728] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111222_494.png
+[2025-11-19 11:12:24,055] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111224_033.png
+[2025-11-19 11:12:24,056] INFO: 文件将保存为: design_image/cropped_20251119_111224_033.png
+[2025-11-19 11:12:24,250] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111224_033.png
+[2025-11-19 11:12:24,252] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111224_033.png
+[2025-11-19 11:15:35,246] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111535_153.png
+[2025-11-19 11:15:35,246] INFO: 文件将保存为: design_image/cropped_20251119_111535_153.png
+[2025-11-19 11:15:35,673] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111535_153.png
+[2025-11-19 11:15:35,674] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111535_153.png
+[2025-11-19 11:15:37,479] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111537_400.png
+[2025-11-19 11:15:37,480] INFO: 文件将保存为: design_image/cropped_20251119_111537_400.png
+[2025-11-19 11:15:37,908] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111537_400.png
+[2025-11-19 11:15:37,909] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111537_400.png
+[2025-11-19 11:15:39,496] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111539_482.png
+[2025-11-19 11:15:39,496] INFO: 文件将保存为: design_image/cropped_20251119_111539_482.png
+[2025-11-19 11:15:39,644] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111539_482.png
+[2025-11-19 11:15:39,645] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111539_482.png
+[2025-11-19 11:15:40,920] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111540_906.png
+[2025-11-19 11:15:40,920] INFO: 文件将保存为: design_image/cropped_20251119_111540_906.png
+[2025-11-19 11:15:41,127] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111540_906.png
+[2025-11-19 11:15:41,129] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111540_906.png
+[2025-11-19 11:15:42,338] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111542_297.png
+[2025-11-19 11:15:42,339] INFO: 文件将保存为: design_image/cropped_20251119_111542_297.png
+[2025-11-19 11:15:42,518] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111542_297.png
+[2025-11-19 11:15:42,519] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111542_297.png
+[2025-11-19 11:15:43,685] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111543_675.png
+[2025-11-19 11:15:43,685] INFO: 文件将保存为: design_image/cropped_20251119_111543_675.png
+[2025-11-19 11:15:43,863] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111543_675.png
+[2025-11-19 11:15:43,864] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111543_675.png
+[2025-11-19 11:15:45,041] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111545_029.png
+[2025-11-19 11:15:45,041] INFO: 文件将保存为: design_image/cropped_20251119_111545_029.png
+[2025-11-19 11:15:45,199] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111545_029.png
+[2025-11-19 11:15:45,200] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111545_029.png
+[2025-11-19 11:15:46,410] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111546_398.png
+[2025-11-19 11:15:46,410] INFO: 文件将保存为: design_image/cropped_20251119_111546_398.png
+[2025-11-19 11:15:46,543] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111546_398.png
+[2025-11-19 11:15:46,544] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111546_398.png
+[2025-11-19 11:15:47,680] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111547_670.png
+[2025-11-19 11:15:47,680] INFO: 文件将保存为: design_image/cropped_20251119_111547_670.png
+[2025-11-19 11:15:47,810] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111547_670.png
+[2025-11-19 11:15:47,811] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111547_670.png
+[2025-11-19 11:15:48,959] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111548_938.png
+[2025-11-19 11:15:48,959] INFO: 文件将保存为: design_image/cropped_20251119_111548_938.png
+[2025-11-19 11:15:49,086] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111548_938.png
+[2025-11-19 11:15:49,087] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111548_938.png
+[2025-11-19 11:15:50,304] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111550_271.png
+[2025-11-19 11:15:50,304] INFO: 文件将保存为: design_image/cropped_20251119_111550_271.png
+[2025-11-19 11:15:50,503] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111550_271.png
+[2025-11-19 11:15:50,504] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111550_271.png
+[2025-11-19 11:15:51,755] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111551_729.png
+[2025-11-19 11:15:51,756] INFO: 文件将保存为: design_image/cropped_20251119_111551_729.png
+[2025-11-19 11:15:51,969] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111551_729.png
+[2025-11-19 11:15:51,970] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111551_729.png
+[2025-11-19 11:15:53,225] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111553_193.png
+[2025-11-19 11:15:53,225] INFO: 文件将保存为: design_image/cropped_20251119_111553_193.png
+[2025-11-19 11:15:53,428] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111553_193.png
+[2025-11-19 11:15:53,429] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111553_193.png
+[2025-11-19 11:15:54,645] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111554_614.png
+[2025-11-19 11:15:54,646] INFO: 文件将保存为: design_image/cropped_20251119_111554_614.png
+[2025-11-19 11:15:54,830] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111554_614.png
+[2025-11-19 11:15:54,831] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111554_614.png
+[2025-11-19 11:15:56,052] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111556_034.png
+[2025-11-19 11:15:56,052] INFO: 文件将保存为: design_image/cropped_20251119_111556_034.png
+[2025-11-19 11:15:56,224] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111556_034.png
+[2025-11-19 11:15:56,225] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111556_034.png
+[2025-11-19 11:15:57,446] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111557_427.png
+[2025-11-19 11:15:57,447] INFO: 文件将保存为: design_image/cropped_20251119_111557_427.png
+[2025-11-19 11:15:57,620] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111557_427.png
+[2025-11-19 11:15:57,622] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111557_427.png
+[2025-11-19 11:15:58,926] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111558_899.png
+[2025-11-19 11:15:58,927] INFO: 文件将保存为: design_image/cropped_20251119_111558_899.png
+[2025-11-19 11:15:59,123] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111558_899.png
+[2025-11-19 11:15:59,124] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111558_899.png
+[2025-11-19 11:16:00,302] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111600_285.png
+[2025-11-19 11:16:00,304] INFO: 文件将保存为: design_image/cropped_20251119_111600_285.png
+[2025-11-19 11:16:00,498] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111600_285.png
+[2025-11-19 11:16:00,499] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111600_285.png
+[2025-11-19 11:16:01,662] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111601_646.png
+[2025-11-19 11:16:01,662] INFO: 文件将保存为: design_image/cropped_20251119_111601_646.png
+[2025-11-19 11:16:01,813] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111601_646.png
+[2025-11-19 11:16:01,814] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111601_646.png
+[2025-11-19 11:16:03,040] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111603_024.png
+[2025-11-19 11:16:03,040] INFO: 文件将保存为: design_image/cropped_20251119_111603_024.png
+[2025-11-19 11:16:03,212] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111603_024.png
+[2025-11-19 11:16:03,213] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111603_024.png
+[2025-11-19 11:16:04,389] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111604_370.png
+[2025-11-19 11:16:04,389] INFO: 文件将保存为: design_image/cropped_20251119_111604_370.png
+[2025-11-19 11:16:04,515] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111604_370.png
+[2025-11-19 11:16:04,516] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111604_370.png
+[2025-11-19 11:16:05,693] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111605_674.png
+[2025-11-19 11:16:05,693] INFO: 文件将保存为: design_image/cropped_20251119_111605_674.png
+[2025-11-19 11:16:05,827] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111605_674.png
+[2025-11-19 11:16:05,828] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111605_674.png
+[2025-11-19 11:16:07,127] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111607_109.png
+[2025-11-19 11:16:07,127] INFO: 文件将保存为: design_image/cropped_20251119_111607_109.png
+[2025-11-19 11:16:07,296] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111607_109.png
+[2025-11-19 11:16:07,298] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111607_109.png
+[2025-11-19 11:16:08,547] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111608_506.png
+[2025-11-19 11:16:08,547] INFO: 文件将保存为: design_image/cropped_20251119_111608_506.png
+[2025-11-19 11:16:08,706] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111608_506.png
+[2025-11-19 11:16:08,730] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111608_506.png
+[2025-11-19 11:16:10,099] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111610_058.png
+[2025-11-19 11:16:10,099] INFO: 文件将保存为: design_image/cropped_20251119_111610_058.png
+[2025-11-19 11:16:10,332] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111610_058.png
+[2025-11-19 11:16:10,334] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111610_058.png
+[2025-11-19 11:16:11,570] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251119_111611_528.png
+[2025-11-19 11:16:11,570] INFO: 文件将保存为: design_image/cropped_20251119_111611_528.png
+[2025-11-19 11:16:11,789] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111611_528.png
+[2025-11-19 11:16:11,791] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251119_111611_528.png
+[2025-11-21 09:32:48,965] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093248_943.png
+[2025-11-21 09:32:48,971] INFO: 文件将保存为: design_image/cropped_20251121_093248_943.png
+[2025-11-21 09:32:49,206] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093248_943.png
+[2025-11-21 09:32:49,207] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093248_943.png
+[2025-11-21 09:32:49,625] ERROR: FAL图生图接口的报错: Please set the FAL_KEY environment variable to your API key, or set the FAL_KEY_ID and FAL_KEY_SECRET environment variables.
+Traceback (most recent call last):
+  File "d:\线稿图\fal.py", line 28, in fal_edit_images
+    result = fal_client.subscribe(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1210, in subscribe
+    handle = self.submit(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1180, in submit
+    self._client,
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\functools.py", line 981, in __get__
+    val = self.func(instance)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1095, in _client
+    key = self._get_key()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1090, in _get_key
+    return fetch_credentials()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\auth.py", line 66, in fetch_credentials
+    raise MissingCredentialsError(
+fal_client.auth.MissingCredentialsError: Please set the FAL_KEY environment variable to your API key, or set the FAL_KEY_ID and FAL_KEY_SECRET environment variables.
+[2025-11-21 09:35:03,521] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093503_499.png
+[2025-11-21 09:35:03,521] INFO: 文件将保存为: design_image/cropped_20251121_093503_499.png
+[2025-11-21 09:35:03,735] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093503_499.png
+[2025-11-21 09:35:03,736] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093503_499.png
+[2025-11-21 09:35:20,092] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/dGGRNAKLaj1WrF0c6iF0Z.png', 'content_type': 'image/png', 'file_name': 'dGGRNAKLaj1WrF0c6iF0Z.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 09:35:23,026] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093522_816.png
+[2025-11-21 09:35:23,027] INFO: 文件将保存为: design_image/cropped_20251121_093522_816.png
+[2025-11-21 09:35:23,836] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093522_816.png
+[2025-11-21 09:35:23,837] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093522_816.png
+[2025-11-21 09:35:45,554] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093545_533.png
+[2025-11-21 09:35:45,555] INFO: 文件将保存为: design_image/cropped_20251121_093545_533.png
+[2025-11-21 09:35:45,730] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093545_533.png
+[2025-11-21 09:35:45,732] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093545_533.png
+[2025-11-21 09:36:06,494] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/-1tn8Ect5KhQYwm1o6QAo.png', 'content_type': 'image/png', 'file_name': '-1tn8Ect5KhQYwm1o6QAo.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 09:36:09,353] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093609_144.png
+[2025-11-21 09:36:09,353] INFO: 文件将保存为: design_image/cropped_20251121_093609_144.png
+[2025-11-21 09:36:10,242] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093609_144.png
+[2025-11-21 09:36:10,243] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093609_144.png
+[2025-11-21 09:36:32,206] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093632_185.png
+[2025-11-21 09:36:32,207] INFO: 文件将保存为: design_image/cropped_20251121_093632_185.png
+[2025-11-21 09:36:32,371] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093632_185.png
+[2025-11-21 09:36:32,373] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093632_185.png
+[2025-11-21 09:36:49,752] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/ngKUpEk6-cIwKsFPCooGc.png', 'content_type': 'image/png', 'file_name': 'ngKUpEk6-cIwKsFPCooGc.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 09:36:52,577] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_093652_376.png
+[2025-11-21 09:36:52,577] INFO: 文件将保存为: design_image/cropped_20251121_093652_376.png
+[2025-11-21 09:36:53,453] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093652_376.png
+[2025-11-21 09:36:53,454] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_093652_376.png
+[2025-11-21 11:07:06,047] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_110706_025.png
+[2025-11-21 11:07:06,047] INFO: 文件将保存为: design_image/cropped_20251121_110706_025.png
+[2025-11-21 11:07:06,300] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_110706_025.png
+[2025-11-21 11:07:06,301] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_110706_025.png
+[2025-11-21 11:07:18,074] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/pVMQapm1iQKRmx0gwKO7a.png', 'content_type': 'image/png', 'file_name': 'pVMQapm1iQKRmx0gwKO7a.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:07:20,047] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_110719_949.png
+[2025-11-21 11:07:20,048] INFO: 文件将保存为: design_image/cropped_20251121_110719_949.png
+[2025-11-21 11:07:20,403] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_110719_949.png
+[2025-11-21 11:07:20,405] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_110719_949.png
+[2025-11-21 11:17:18,245] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_111718_223.png
+[2025-11-21 11:17:18,245] INFO: 文件将保存为: design_image/cropped_20251121_111718_223.png
+[2025-11-21 11:17:18,441] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_111718_223.png
+[2025-11-21 11:17:18,442] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_111718_223.png
+[2025-11-21 11:17:35,324] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/Psa2n08f4hprHCswoMbEO.png', 'content_type': 'image/png', 'file_name': 'Psa2n08f4hprHCswoMbEO.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:17:37,976] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_111737_875.png
+[2025-11-21 11:17:37,977] INFO: 文件将保存为: design_image/cropped_20251121_111737_875.png
+[2025-11-21 11:17:38,332] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_111737_875.png
+[2025-11-21 11:17:38,334] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_111737_875.png
+[2025-11-21 11:21:34,502] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112134_481.png
+[2025-11-21 11:21:34,503] INFO: 文件将保存为: design_image/cropped_20251121_112134_481.png
+[2025-11-21 11:21:34,719] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112134_481.png
+[2025-11-21 11:21:34,720] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112134_481.png
+[2025-11-21 11:21:49,713] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/355C3BA6zBVC7kHWQqWtc.png', 'content_type': 'image/png', 'file_name': '355C3BA6zBVC7kHWQqWtc.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:21:51,767] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112151_681.png
+[2025-11-21 11:21:51,768] INFO: 文件将保存为: design_image/cropped_20251121_112151_681.png
+[2025-11-21 11:21:52,108] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112151_681.png
+[2025-11-21 11:21:52,109] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112151_681.png
+[2025-11-21 11:22:17,450] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112217_432.png
+[2025-11-21 11:22:17,450] INFO: 文件将保存为: design_image/cropped_20251121_112217_432.png
+[2025-11-21 11:22:17,656] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112217_432.png
+[2025-11-21 11:22:17,657] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112217_432.png
+[2025-11-21 11:22:31,145] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/nKrnnbkzrPm5wOT7EYKKo.png', 'content_type': 'image/png', 'file_name': 'nKrnnbkzrPm5wOT7EYKKo.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 11:22:33,956] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112233_700.png
+[2025-11-21 11:22:33,956] INFO: 文件将保存为: design_image/cropped_20251121_112233_700.png
+[2025-11-21 11:22:34,663] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112233_700.png
+[2025-11-21 11:22:34,664] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112233_700.png
+[2025-11-21 11:22:59,518] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112259_499.png
+[2025-11-21 11:22:59,518] INFO: 文件将保存为: design_image/cropped_20251121_112259_499.png
+[2025-11-21 11:22:59,732] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112259_499.png
+[2025-11-21 11:22:59,733] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112259_499.png
+[2025-11-21 11:23:17,514] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/UskXRgKCDHE6V0UV5Bf8Z.png', 'content_type': 'image/png', 'file_name': 'UskXRgKCDHE6V0UV5Bf8Z.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/7ac530396fd25bb9c1eb047742b695937a7fb0c2706d46361a51c6fc1a1ff283?w=864&h=1184'}
+[2025-11-21 11:23:19,373] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112319_287.png
+[2025-11-21 11:23:19,373] INFO: 文件将保存为: design_image/cropped_20251121_112319_287.png
+[2025-11-21 11:23:19,817] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112319_287.png
+[2025-11-21 11:23:19,818] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112319_287.png
+[2025-11-21 11:23:55,685] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112355_671.png
+[2025-11-21 11:23:55,685] INFO: 文件将保存为: design_image/cropped_20251121_112355_671.png
+[2025-11-21 11:23:55,826] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112355_671.png
+[2025-11-21 11:23:55,827] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112355_671.png
+[2025-11-21 11:24:15,856] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/KBs91jleoo0TEmEOHMCge.png', 'content_type': 'image/png', 'file_name': 'KBs91jleoo0TEmEOHMCge.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:24:17,974] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112417_831.png
+[2025-11-21 11:24:17,974] INFO: 文件将保存为: design_image/cropped_20251121_112417_831.png
+[2025-11-21 11:24:18,422] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112417_831.png
+[2025-11-21 11:24:18,424] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112417_831.png
+[2025-11-21 11:24:56,329] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112456_308.png
+[2025-11-21 11:24:56,330] INFO: 文件将保存为: design_image/cropped_20251121_112456_308.png
+[2025-11-21 11:24:56,507] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112456_308.png
+[2025-11-21 11:24:56,508] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112456_308.png
+[2025-11-21 11:25:23,833] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/057f_m23zBj1I9e2JCtEj.png', 'content_type': 'image/png', 'file_name': '057f_m23zBj1I9e2JCtEj.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要的衣服线稿平铺版型图。 '}
+[2025-11-21 11:25:25,865] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112525_768.png
+[2025-11-21 11:25:25,866] INFO: 文件将保存为: design_image/cropped_20251121_112525_768.png
+[2025-11-21 11:25:26,431] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112525_768.png
+[2025-11-21 11:25:26,432] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112525_768.png
+[2025-11-21 11:26:21,104] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112621_083.png
+[2025-11-21 11:26:21,104] INFO: 文件将保存为: design_image/cropped_20251121_112621_083.png
+[2025-11-21 11:26:21,307] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112621_083.png
+[2025-11-21 11:26:21,309] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112621_083.png
+[2025-11-21 11:26:34,478] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/79z38l6B1dDk2jn01r3uj.png', 'content_type': 'image/png', 'file_name': '79z38l6B1dDk2jn01r3uj.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:26:36,638] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112636_537.png
+[2025-11-21 11:26:36,638] INFO: 文件将保存为: design_image/cropped_20251121_112636_537.png
+[2025-11-21 11:26:37,023] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112636_537.png
+[2025-11-21 11:26:37,024] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112636_537.png
+[2025-11-21 11:27:23,460] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112723_435.png
+[2025-11-21 11:27:23,460] INFO: 文件将保存为: design_image/cropped_20251121_112723_435.png
+[2025-11-21 11:27:23,657] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112723_435.png
+[2025-11-21 11:27:23,658] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112723_435.png
+[2025-11-21 11:27:37,119] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/3fgd8FgmdlSGmRaMr8JYm.png', 'content_type': 'image/png', 'file_name': '3fgd8FgmdlSGmRaMr8JYm.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是你想要的线稿版型图:\n\n'}
+[2025-11-21 11:27:39,596] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112739_384.png
+[2025-11-21 11:27:39,596] INFO: 文件将保存为: design_image/cropped_20251121_112739_384.png
+[2025-11-21 11:27:40,299] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112739_384.png
+[2025-11-21 11:27:40,300] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112739_384.png
+[2025-11-21 11:28:14,168] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112813_718.png
+[2025-11-21 11:28:14,169] INFO: 文件将保存为: design_image/cropped_20251121_112813_718.png
+[2025-11-21 11:28:15,340] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112813_718.png
+[2025-11-21 11:28:15,341] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112813_718.png
+[2025-11-21 11:28:29,802] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/WqiflXKGF_yH_prCn3X0f.png', 'content_type': 'image/png', 'file_name': 'WqiflXKGF_yH_prCn3X0f.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:28:32,490] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_112832_191.png
+[2025-11-21 11:28:32,490] INFO: 文件将保存为: design_image/cropped_20251121_112832_191.png
+[2025-11-21 11:28:33,283] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112832_191.png
+[2025-11-21 11:28:33,285] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_112832_191.png
+[2025-11-21 11:40:03,667] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114003_215.png
+[2025-11-21 11:40:03,668] INFO: 文件将保存为: design_image/cropped_20251121_114003_215.png
+[2025-11-21 11:40:04,884] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114003_215.png
+[2025-11-21 11:40:04,886] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114003_215.png
+[2025-11-21 11:40:20,663] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/vc5k1P2v3HILHWRdHXVth.png', 'content_type': 'image/png', 'file_name': 'vc5k1P2v3HILHWRdHXVth.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:40:22,676] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114022_574.png
+[2025-11-21 11:40:22,676] INFO: 文件将保存为: design_image/cropped_20251121_114022_574.png
+[2025-11-21 11:40:23,016] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114022_574.png
+[2025-11-21 11:40:23,017] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114022_574.png
+[2025-11-21 11:41:04,103] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114103_541.png
+[2025-11-21 11:41:04,104] INFO: 文件将保存为: design_image/cropped_20251121_114103_541.png
+[2025-11-21 11:41:05,971] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114103_541.png
+[2025-11-21 11:41:05,973] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114103_541.png
+[2025-11-21 11:41:23,810] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/9Q_MqP8Sk4E4srnTdbGx2.png', 'content_type': 'image/png', 'file_name': '9Q_MqP8Sk4E4srnTdbGx2.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:41:25,772] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114125_675.png
+[2025-11-21 11:41:25,773] INFO: 文件将保存为: design_image/cropped_20251121_114125_675.png
+[2025-11-21 11:41:26,146] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114125_675.png
+[2025-11-21 11:41:26,147] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114125_675.png
+[2025-11-21 11:42:00,486] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114200_467.png
+[2025-11-21 11:42:00,486] INFO: 文件将保存为: design_image/cropped_20251121_114200_467.png
+[2025-11-21 11:42:00,652] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114200_467.png
+[2025-11-21 11:42:00,653] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114200_467.png
+[2025-11-21 11:42:15,777] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/vJ78QugayprWVs9Uei09f.png', 'content_type': 'image/png', 'file_name': 'vJ78QugayprWVs9Uei09f.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:42:18,252] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114218_002.png
+[2025-11-21 11:42:18,252] INFO: 文件将保存为: design_image/cropped_20251121_114218_002.png
+[2025-11-21 11:42:19,100] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114218_002.png
+[2025-11-21 11:42:19,101] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114218_002.png
+[2025-11-21 11:42:50,369] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114250_350.png
+[2025-11-21 11:42:50,369] INFO: 文件将保存为: design_image/cropped_20251121_114250_350.png
+[2025-11-21 11:42:50,552] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114250_350.png
+[2025-11-21 11:42:50,554] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114250_350.png
+[2025-11-21 11:43:10,797] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/oCTmiUXsEgNGTz1limDcI.png', 'content_type': 'image/png', 'file_name': 'oCTmiUXsEgNGTz1limDcI.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:43:12,951] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114312_829.png
+[2025-11-21 11:43:12,951] INFO: 文件将保存为: design_image/cropped_20251121_114312_829.png
+[2025-11-21 11:43:13,306] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114312_829.png
+[2025-11-21 11:43:13,307] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114312_829.png
+[2025-11-21 11:45:53,833] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114553_812.png
+[2025-11-21 11:45:53,833] INFO: 文件将保存为: design_image/cropped_20251121_114553_812.png
+[2025-11-21 11:45:54,108] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114553_812.png
+[2025-11-21 11:45:54,109] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114553_812.png
+[2025-11-21 11:46:09,520] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/VP3bjD6kvwbO0Q5258sBi.png', 'content_type': 'image/png', 'file_name': 'VP3bjD6kvwbO0Q5258sBi.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:46:12,217] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_114611_954.png
+[2025-11-21 11:46:12,218] INFO: 文件将保存为: design_image/cropped_20251121_114611_954.png
+[2025-11-21 11:46:12,749] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114611_954.png
+[2025-11-21 11:46:12,750] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_114611_954.png
+[2025-11-21 11:51:37,590] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115137_579.png
+[2025-11-21 11:51:37,590] INFO: 文件将保存为: design_image/cropped_20251121_115137_579.png
+[2025-11-21 11:51:37,868] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115137_579.png
+[2025-11-21 11:51:37,870] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115137_579.png
+[2025-11-21 11:51:52,881] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/OVG4odMh_BFQ5ku6uFjB2.png', 'content_type': 'image/png', 'file_name': 'OVG4odMh_BFQ5ku6uFjB2.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:51:55,761] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115155_520.png
+[2025-11-21 11:51:55,761] INFO: 文件将保存为: design_image/cropped_20251121_115155_520.png
+[2025-11-21 11:51:56,586] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115155_520.png
+[2025-11-21 11:51:56,587] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115155_520.png
+[2025-11-21 11:51:56,620] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115156_596.png
+[2025-11-21 11:51:56,621] INFO: 文件将保存为: design_image/cropped_20251121_115156_596.png
+[2025-11-21 11:51:56,786] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115156_596.png
+[2025-11-21 11:51:56,787] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115156_596.png
+[2025-11-21 11:52:06,798] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/qPvJDSH_6g8K6SZrDXUIo.png', 'content_type': 'image/png', 'file_name': 'qPvJDSH_6g8K6SZrDXUIo.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:52:09,972] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115209_836.png
+[2025-11-21 11:52:09,972] INFO: 文件将保存为: design_image/cropped_20251121_115209_836.png
+[2025-11-21 11:52:10,414] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115209_836.png
+[2025-11-21 11:52:10,415] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115209_836.png
+[2025-11-21 11:52:10,456] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115210_423.png
+[2025-11-21 11:52:10,456] INFO: 文件将保存为: design_image/cropped_20251121_115210_423.png
+[2025-11-21 11:52:10,699] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115210_423.png
+[2025-11-21 11:52:10,700] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115210_423.png
+[2025-11-21 11:52:26,466] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/f2IkC7D22geLBSYy-CjZq.png', 'content_type': 'image/png', 'file_name': 'f2IkC7D22geLBSYy-CjZq.png', 'file_size': None, 'width': None, 'height': None}], 'description': '当然,这是您要的线稿版型图: '}
+[2025-11-21 11:52:28,532] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115228_447.png
+[2025-11-21 11:52:28,532] INFO: 文件将保存为: design_image/cropped_20251121_115228_447.png
+[2025-11-21 11:52:29,077] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115228_447.png
+[2025-11-21 11:52:29,078] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115228_447.png
+[2025-11-21 11:52:29,104] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115229_088.png
+[2025-11-21 11:52:29,104] INFO: 文件将保存为: design_image/cropped_20251121_115229_088.png
+[2025-11-21 11:52:29,272] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115229_088.png
+[2025-11-21 11:52:29,273] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115229_088.png
+[2025-11-21 11:52:50,556] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/8FO-Kvfya6dWczugpnBfs.png', 'content_type': 'image/png', 'file_name': '8FO-Kvfya6dWczugpnBfs.png', 'file_size': None, 'width': None, 'height': None}, {'url': 'https://v3b.fal.media/files/b/koala/kTHlfI2RUSSyX-4rWjryg.png', 'content_type': 'image/png', 'file_name': 'kTHlfI2RUSSyX-4rWjryg.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`\n`'}
+[2025-11-21 11:52:52,726] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115252_633.png
+[2025-11-21 11:52:52,726] INFO: 文件将保存为: design_image/cropped_20251121_115252_633.png
+[2025-11-21 11:52:53,089] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115252_633.png
+[2025-11-21 11:52:53,090] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115252_633.png
+[2025-11-21 11:52:53,115] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115253_096.png
+[2025-11-21 11:52:53,115] INFO: 文件将保存为: design_image/cropped_20251121_115253_096.png
+[2025-11-21 11:52:53,270] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115253_096.png
+[2025-11-21 11:52:53,271] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115253_096.png
+[2025-11-21 11:53:11,690] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/ZGDC1VDY1hOb2CkbC7nlc.png', 'content_type': 'image/png', 'file_name': 'ZGDC1VDY1hOb2CkbC7nlc.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:53:14,470] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115314_207.png
+[2025-11-21 11:53:14,471] INFO: 文件将保存为: design_image/cropped_20251121_115314_207.png
+[2025-11-21 11:53:15,006] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115314_207.png
+[2025-11-21 11:53:15,007] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115314_207.png
+[2025-11-21 11:53:15,046] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115315_015.png
+[2025-11-21 11:53:15,046] INFO: 文件将保存为: design_image/cropped_20251121_115315_015.png
+[2025-11-21 11:53:15,215] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115315_015.png
+[2025-11-21 11:53:15,216] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115315_015.png
+[2025-11-21 11:53:28,714] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/RmumDMHQP4yATFK-XdwRg.png', 'content_type': 'image/png', 'file_name': 'RmumDMHQP4yATFK-XdwRg.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:53:30,688] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115330_620.png
+[2025-11-21 11:53:30,688] INFO: 文件将保存为: design_image/cropped_20251121_115330_620.png
+[2025-11-21 11:53:30,984] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115330_620.png
+[2025-11-21 11:53:30,985] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115330_620.png
+[2025-11-21 11:53:31,011] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115330_992.png
+[2025-11-21 11:53:31,012] INFO: 文件将保存为: design_image/cropped_20251121_115330_992.png
+[2025-11-21 11:53:31,167] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115330_992.png
+[2025-11-21 11:53:31,169] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115330_992.png
+[2025-11-21 11:53:43,398] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/8MxvapoqWhhaUMborA0vJ.png', 'content_type': 'image/png', 'file_name': '8MxvapoqWhhaUMborA0vJ.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:53:45,253] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115345_180.png
+[2025-11-21 11:53:45,254] INFO: 文件将保存为: design_image/cropped_20251121_115345_180.png
+[2025-11-21 11:53:45,584] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115345_180.png
+[2025-11-21 11:53:45,585] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115345_180.png
+[2025-11-21 11:53:45,618] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115345_587.png
+[2025-11-21 11:53:45,618] INFO: 文件将保存为: design_image/cropped_20251121_115345_587.png
+[2025-11-21 11:53:45,818] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115345_587.png
+[2025-11-21 11:53:45,819] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115345_587.png
+[2025-11-21 11:53:58,730] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/zn0iuxPA21VXlTd3E0uG8.png', 'content_type': 'image/png', 'file_name': 'zn0iuxPA21VXlTd3E0uG8.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:54:00,523] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115400_432.png
+[2025-11-21 11:54:00,523] INFO: 文件将保存为: design_image/cropped_20251121_115400_432.png
+[2025-11-21 11:54:00,936] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115400_432.png
+[2025-11-21 11:54:00,937] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115400_432.png
+[2025-11-21 11:54:00,953] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115400_944.png
+[2025-11-21 11:54:00,953] INFO: 文件将保存为: design_image/cropped_20251121_115400_944.png
+[2025-11-21 11:54:01,129] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115400_944.png
+[2025-11-21 11:54:01,130] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115400_944.png
+[2025-11-21 11:54:19,545] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/b6_0K-U_-3GaILDK_gaaU.png', 'content_type': 'image/png', 'file_name': 'b6_0K-U_-3GaILDK_gaaU.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:54:22,048] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115421_793.png
+[2025-11-21 11:54:22,048] INFO: 文件将保存为: design_image/cropped_20251121_115421_793.png
+[2025-11-21 11:54:22,590] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115421_793.png
+[2025-11-21 11:54:22,591] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115421_793.png
+[2025-11-21 11:54:22,610] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115422_593.png
+[2025-11-21 11:54:22,610] INFO: 文件将保存为: design_image/cropped_20251121_115422_593.png
+[2025-11-21 11:54:22,757] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115422_593.png
+[2025-11-21 11:54:22,758] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115422_593.png
+[2025-11-21 11:54:37,379] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/4JnZytPz7Z9-IUffQZyYf.png', 'content_type': 'image/png', 'file_name': '4JnZytPz7Z9-IUffQZyYf.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:54:39,098] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115439_033.png
+[2025-11-21 11:54:39,098] INFO: 文件将保存为: design_image/cropped_20251121_115439_033.png
+[2025-11-21 11:54:39,535] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115439_033.png
+[2025-11-21 11:54:39,536] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115439_033.png
+[2025-11-21 11:54:39,562] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115439_543.png
+[2025-11-21 11:54:39,562] INFO: 文件将保存为: design_image/cropped_20251121_115439_543.png
+[2025-11-21 11:54:39,798] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115439_543.png
+[2025-11-21 11:54:39,800] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115439_543.png
+[2025-11-21 11:54:56,974] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/QhvI6p7mKkWQ28BFbW25C.png', 'content_type': 'image/png', 'file_name': 'QhvI6p7mKkWQ28BFbW25C.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/8f5bd6d613bc2da341e46cbc5d30e9343c7e7cce1721bd8cafdbfd43983cd51e?w=896&h=1152'}
+[2025-11-21 11:54:58,969] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115458_874.png
+[2025-11-21 11:54:58,969] INFO: 文件将保存为: design_image/cropped_20251121_115458_874.png
+[2025-11-21 11:54:59,376] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115458_874.png
+[2025-11-21 11:54:59,377] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115458_874.png
+[2025-11-21 11:54:59,411] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115459_387.png
+[2025-11-21 11:54:59,412] INFO: 文件将保存为: design_image/cropped_20251121_115459_387.png
+[2025-11-21 11:54:59,617] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115459_387.png
+[2025-11-21 11:54:59,619] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115459_387.png
+[2025-11-21 11:55:15,002] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/HkLH1BXFUyIi7VcaME-He.png', 'content_type': 'image/png', 'file_name': 'HkLH1BXFUyIi7VcaME-He.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:55:17,370] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115517_150.png
+[2025-11-21 11:55:17,370] INFO: 文件将保存为: design_image/cropped_20251121_115517_150.png
+[2025-11-21 11:55:18,132] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115517_150.png
+[2025-11-21 11:55:18,134] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115517_150.png
+[2025-11-21 11:55:18,157] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115518_144.png
+[2025-11-21 11:55:18,157] INFO: 文件将保存为: design_image/cropped_20251121_115518_144.png
+[2025-11-21 11:55:18,297] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115518_144.png
+[2025-11-21 11:55:18,298] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115518_144.png
+[2025-11-21 11:55:28,591] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/9lZDPTom_0e6Aq29ICf1D.png', 'content_type': 'image/png', 'file_name': '9lZDPTom_0e6Aq29ICf1D.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:55:31,910] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115531_822.png
+[2025-11-21 11:55:31,910] INFO: 文件将保存为: design_image/cropped_20251121_115531_822.png
+[2025-11-21 11:55:32,393] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115531_822.png
+[2025-11-21 11:55:32,394] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115531_822.png
+[2025-11-21 11:55:32,420] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115532_403.png
+[2025-11-21 11:55:32,420] INFO: 文件将保存为: design_image/cropped_20251121_115532_403.png
+[2025-11-21 11:55:32,656] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115532_403.png
+[2025-11-21 11:55:32,657] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115532_403.png
+[2025-11-21 11:55:42,081] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/k674mjIrjITgVHcJ6Q2Nk.png', 'content_type': 'image/png', 'file_name': 'k674mjIrjITgVHcJ6Q2Nk.png', 'file_size': None, 'width': None, 'height': None}], 'description': '没问题,这是您要的线稿版型图:\n '}
+[2025-11-21 11:56:01,826] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115601_705.png
+[2025-11-21 11:56:01,826] INFO: 文件将保存为: design_image/cropped_20251121_115601_705.png
+[2025-11-21 11:56:02,267] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115601_705.png
+[2025-11-21 11:56:02,268] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115601_705.png
+[2025-11-21 11:56:02,288] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115602_276.png
+[2025-11-21 11:56:02,288] INFO: 文件将保存为: design_image/cropped_20251121_115602_276.png
+[2025-11-21 11:56:02,440] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115602_276.png
+[2025-11-21 11:56:02,441] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115602_276.png
+[2025-11-21 11:56:15,747] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/DAku1QvAC4CHpf3WhWCoe.png', 'content_type': 'image/png', 'file_name': 'DAku1QvAC4CHpf3WhWCoe.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:56:28,912] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115628_838.png
+[2025-11-21 11:56:28,913] INFO: 文件将保存为: design_image/cropped_20251121_115628_838.png
+[2025-11-21 11:56:29,251] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115628_838.png
+[2025-11-21 11:56:29,253] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115628_838.png
+[2025-11-21 11:56:29,356] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115629_279.png
+[2025-11-21 11:56:29,356] INFO: 文件将保存为: design_image/cropped_20251121_115629_279.png
+[2025-11-21 11:56:29,764] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115629_279.png
+[2025-11-21 11:56:29,765] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115629_279.png
+[2025-11-21 11:56:43,732] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/BKX7Rn6M2iblaIdGvU6rU.png', 'content_type': 'image/png', 'file_name': 'BKX7Rn6M2iblaIdGvU6rU.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:56:46,226] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115646_029.png
+[2025-11-21 11:56:46,227] INFO: 文件将保存为: design_image/cropped_20251121_115646_029.png
+[2025-11-21 11:56:46,722] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115646_029.png
+[2025-11-21 11:56:46,724] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115646_029.png
+[2025-11-21 11:56:46,757] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115646_731.png
+[2025-11-21 11:56:46,757] INFO: 文件将保存为: design_image/cropped_20251121_115646_731.png
+[2025-11-21 11:56:46,966] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115646_731.png
+[2025-11-21 11:56:46,967] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115646_731.png
+[2025-11-21 11:56:58,959] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/B_Tmgiq98n7AMgakLkKBY.png', 'content_type': 'image/png', 'file_name': 'B_Tmgiq98n7AMgakLkKBY.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 11:57:00,915] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115700_838.png
+[2025-11-21 11:57:00,915] INFO: 文件将保存为: design_image/cropped_20251121_115700_838.png
+[2025-11-21 11:57:01,256] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115700_838.png
+[2025-11-21 11:57:01,258] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115700_838.png
+[2025-11-21 11:57:01,284] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115701_266.png
+[2025-11-21 11:57:01,285] INFO: 文件将保存为: design_image/cropped_20251121_115701_266.png
+[2025-11-21 11:57:01,438] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115701_266.png
+[2025-11-21 11:57:01,439] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115701_266.png
+[2025-11-21 11:57:12,714] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/LXwJvsGDAyWtcpzrk1zr5.png', 'content_type': 'image/png', 'file_name': 'LXwJvsGDAyWtcpzrk1zr5.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:57:14,806] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115714_710.png
+[2025-11-21 11:57:14,806] INFO: 文件将保存为: design_image/cropped_20251121_115714_710.png
+[2025-11-21 11:57:15,305] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115714_710.png
+[2025-11-21 11:57:15,306] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115714_710.png
+[2025-11-21 11:57:15,330] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115715_313.png
+[2025-11-21 11:57:15,330] INFO: 文件将保存为: design_image/cropped_20251121_115715_313.png
+[2025-11-21 11:57:15,588] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115715_313.png
+[2025-11-21 11:57:15,590] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115715_313.png
+[2025-11-21 11:57:28,876] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/WYe1HX6Otmi-gUfp1b0Wi.png', 'content_type': 'image/png', 'file_name': 'WYe1HX6Otmi-gUfp1b0Wi.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是这条衣服的线稿版型图: '}
+[2025-11-21 11:57:31,127] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115731_018.png
+[2025-11-21 11:57:31,127] INFO: 文件将保存为: design_image/cropped_20251121_115731_018.png
+[2025-11-21 11:57:31,819] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115731_018.png
+[2025-11-21 11:57:31,821] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115731_018.png
+[2025-11-21 11:57:31,851] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115731_830.png
+[2025-11-21 11:57:31,851] INFO: 文件将保存为: design_image/cropped_20251121_115731_830.png
+[2025-11-21 11:57:32,013] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115731_830.png
+[2025-11-21 11:57:32,014] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115731_830.png
+[2025-11-21 11:57:41,982] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/ZFtrk0fqZI93gQl9owJ2C.png', 'content_type': 'image/png', 'file_name': 'ZFtrk0fqZI93gQl9owJ2C.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:57:44,028] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115743_933.png
+[2025-11-21 11:57:44,029] INFO: 文件将保存为: design_image/cropped_20251121_115743_933.png
+[2025-11-21 11:57:44,369] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115743_933.png
+[2025-11-21 11:57:44,370] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115743_933.png
+[2025-11-21 11:57:44,404] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115744_378.png
+[2025-11-21 11:57:44,405] INFO: 文件将保存为: design_image/cropped_20251121_115744_378.png
+[2025-11-21 11:57:44,564] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115744_378.png
+[2025-11-21 11:57:44,566] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115744_378.png
+[2025-11-21 11:57:55,830] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/bGucYxphkuYugWIKQmDef.png', 'content_type': 'image/png', 'file_name': 'bGucYxphkuYugWIKQmDef.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是这条衣服的平铺线稿版型图:\n '}
+[2025-11-21 11:57:57,833] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115757_719.png
+[2025-11-21 11:57:57,834] INFO: 文件将保存为: design_image/cropped_20251121_115757_719.png
+[2025-11-21 11:57:58,257] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115757_719.png
+[2025-11-21 11:57:58,259] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115757_719.png
+[2025-11-21 11:57:58,291] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115758_268.png
+[2025-11-21 11:57:58,291] INFO: 文件将保存为: design_image/cropped_20251121_115758_268.png
+[2025-11-21 11:57:58,473] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115758_268.png
+[2025-11-21 11:57:58,474] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115758_268.png
+[2025-11-21 11:58:06,827] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/QlA-rUOhumX6TxZpVkgwS.png', 'content_type': 'image/png', 'file_name': 'QlA-rUOhumX6TxZpVkgwS.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:58:08,811] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115808_709.png
+[2025-11-21 11:58:08,811] INFO: 文件将保存为: design_image/cropped_20251121_115808_709.png
+[2025-11-21 11:58:09,143] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115808_709.png
+[2025-11-21 11:58:09,145] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115808_709.png
+[2025-11-21 11:58:09,174] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115809_154.png
+[2025-11-21 11:58:09,174] INFO: 文件将保存为: design_image/cropped_20251121_115809_154.png
+[2025-11-21 11:58:09,318] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115809_154.png
+[2025-11-21 11:58:09,319] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115809_154.png
+[2025-11-21 11:58:26,415] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/WsjVEMMbH9bhofZWw0Z7-.png', 'content_type': 'image/png', 'file_name': 'WsjVEMMbH9bhofZWw0Z7-.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/7e71038d2b48ec48882416781d9c9879b915bad1baab9a7452d44606b267ba26?w=864&h=1184'}
+[2025-11-21 11:58:28,926] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115828_640.png
+[2025-11-21 11:58:28,926] INFO: 文件将保存为: design_image/cropped_20251121_115828_640.png
+[2025-11-21 11:58:29,561] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115828_640.png
+[2025-11-21 11:58:29,562] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115828_640.png
+[2025-11-21 11:58:29,594] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115829_570.png
+[2025-11-21 11:58:29,594] INFO: 文件将保存为: design_image/cropped_20251121_115829_570.png
+[2025-11-21 11:58:29,801] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115829_570.png
+[2025-11-21 11:58:29,802] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115829_570.png
+[2025-11-21 11:58:46,233] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/Rc5M5JAINea_bM6zN6Z4y.png', 'content_type': 'image/png', 'file_name': 'Rc5M5JAINea_bM6zN6Z4y.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:58:48,227] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115848_128.png
+[2025-11-21 11:58:48,228] INFO: 文件将保存为: design_image/cropped_20251121_115848_128.png
+[2025-11-21 11:58:48,593] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115848_128.png
+[2025-11-21 11:58:48,594] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115848_128.png
+[2025-11-21 11:58:48,631] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115848_601.png
+[2025-11-21 11:58:48,632] INFO: 文件将保存为: design_image/cropped_20251121_115848_601.png
+[2025-11-21 11:58:48,861] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115848_601.png
+[2025-11-21 11:58:48,862] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115848_601.png
+[2025-11-21 11:59:01,450] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/7gho9UsD_E9dGML9hPsiT.png', 'content_type': 'image/png', 'file_name': '7gho9UsD_E9dGML9hPsiT.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要求的线稿版型图:\n '}
+[2025-11-21 11:59:03,848] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115903_591.png
+[2025-11-21 11:59:03,849] INFO: 文件将保存为: design_image/cropped_20251121_115903_591.png
+[2025-11-21 11:59:04,432] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115903_591.png
+[2025-11-21 11:59:04,433] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115903_591.png
+[2025-11-21 11:59:04,452] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115904_440.png
+[2025-11-21 11:59:04,452] INFO: 文件将保存为: design_image/cropped_20251121_115904_440.png
+[2025-11-21 11:59:04,582] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115904_440.png
+[2025-11-21 11:59:04,583] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115904_440.png
+[2025-11-21 11:59:21,710] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/PqRWhxDrtIHPA_ebFeFxD.png', 'content_type': 'image/png', 'file_name': 'PqRWhxDrtIHPA_ebFeFxD.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:59:23,514] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115923_431.png
+[2025-11-21 11:59:23,514] INFO: 文件将保存为: design_image/cropped_20251121_115923_431.png
+[2025-11-21 11:59:23,860] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115923_431.png
+[2025-11-21 11:59:23,861] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115923_431.png
+[2025-11-21 11:59:23,887] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115923_868.png
+[2025-11-21 11:59:23,887] INFO: 文件将保存为: design_image/cropped_20251121_115923_868.png
+[2025-11-21 11:59:24,038] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115923_868.png
+[2025-11-21 11:59:24,039] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115923_868.png
+[2025-11-21 11:59:40,705] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/585yRm2vjTBduQpfzh45M.png', 'content_type': 'image/png', 'file_name': '585yRm2vjTBduQpfzh45M.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:59:42,476] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115942_411.png
+[2025-11-21 11:59:42,476] INFO: 文件将保存为: design_image/cropped_20251121_115942_411.png
+[2025-11-21 11:59:42,752] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115942_411.png
+[2025-11-21 11:59:42,754] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115942_411.png
+[2025-11-21 11:59:42,798] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115942_761.png
+[2025-11-21 11:59:42,799] INFO: 文件将保存为: design_image/cropped_20251121_115942_761.png
+[2025-11-21 11:59:43,018] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115942_761.png
+[2025-11-21 11:59:43,019] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115942_761.png
+[2025-11-21 11:59:53,157] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/YGshPHorDtEdK2uthKovv.png', 'content_type': 'image/png', 'file_name': 'YGshPHorDtEdK2uthKovv.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 11:59:55,446] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115955_370.png
+[2025-11-21 11:59:55,446] INFO: 文件将保存为: design_image/cropped_20251121_115955_370.png
+[2025-11-21 11:59:55,770] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115955_370.png
+[2025-11-21 11:59:55,772] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115955_370.png
+[2025-11-21 11:59:55,794] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_115955_774.png
+[2025-11-21 11:59:55,794] INFO: 文件将保存为: design_image/cropped_20251121_115955_774.png
+[2025-11-21 11:59:55,987] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115955_774.png
+[2025-11-21 11:59:55,989] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_115955_774.png
+[2025-11-21 12:00:09,106] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/JKhdBKcteFRA6ye8CjLtO.png', 'content_type': 'image/png', 'file_name': 'JKhdBKcteFRA6ye8CjLtO.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:00:11,128] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120011_026.png
+[2025-11-21 12:00:11,128] INFO: 文件将保存为: design_image/cropped_20251121_120011_026.png
+[2025-11-21 12:00:11,500] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120011_026.png
+[2025-11-21 12:00:11,501] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120011_026.png
+[2025-11-21 12:00:11,532] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120011_508.png
+[2025-11-21 12:00:11,533] INFO: 文件将保存为: design_image/cropped_20251121_120011_508.png
+[2025-11-21 12:00:11,719] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120011_508.png
+[2025-11-21 12:00:11,720] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120011_508.png
+[2025-11-21 12:00:23,961] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/f8h7uPnpiwQ1J-jRECTsN.png', 'content_type': 'image/png', 'file_name': 'f8h7uPnpiwQ1J-jRECTsN.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:00:25,905] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120025_800.png
+[2025-11-21 12:00:25,906] INFO: 文件将保存为: design_image/cropped_20251121_120025_800.png
+[2025-11-21 12:00:26,249] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120025_800.png
+[2025-11-21 12:00:26,250] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120025_800.png
+[2025-11-21 12:00:26,264] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120026_252.png
+[2025-11-21 12:00:26,264] INFO: 文件将保存为: design_image/cropped_20251121_120026_252.png
+[2025-11-21 12:00:26,472] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120026_252.png
+[2025-11-21 12:00:26,473] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120026_252.png
+[2025-11-21 12:01:23,132] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/IbqYxkWJW2-XmvudHCI9q.png', 'content_type': 'image/png', 'file_name': 'IbqYxkWJW2-XmvudHCI9q.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:01:25,807] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120125_572.png
+[2025-11-21 12:01:25,807] INFO: 文件将保存为: design_image/cropped_20251121_120125_572.png
+[2025-11-21 12:01:26,683] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120125_572.png
+[2025-11-21 12:01:26,684] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120125_572.png
+[2025-11-21 12:01:26,715] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120126_691.png
+[2025-11-21 12:01:26,715] INFO: 文件将保存为: design_image/cropped_20251121_120126_691.png
+[2025-11-21 12:01:26,923] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120126_691.png
+[2025-11-21 12:01:26,924] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120126_691.png
+[2025-11-21 12:01:38,523] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/YMMVuP1CT0pIPtSA7SfDS.png', 'content_type': 'image/png', 'file_name': 'YMMVuP1CT0pIPtSA7SfDS.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:01:40,286] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120140_214.png
+[2025-11-21 12:01:40,286] INFO: 文件将保存为: design_image/cropped_20251121_120140_214.png
+[2025-11-21 12:01:40,554] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120140_214.png
+[2025-11-21 12:01:40,555] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120140_214.png
+[2025-11-21 12:01:40,586] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120140_562.png
+[2025-11-21 12:01:40,587] INFO: 文件将保存为: design_image/cropped_20251121_120140_562.png
+[2025-11-21 12:01:40,804] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120140_562.png
+[2025-11-21 12:01:40,805] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120140_562.png
+[2025-11-21 12:02:03,765] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/ord69fCRnb6gT312g5qs_.png', 'content_type': 'image/png', 'file_name': 'ord69fCRnb6gT312g5qs_.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:02:05,547] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120205_483.png
+[2025-11-21 12:02:05,548] INFO: 文件将保存为: design_image/cropped_20251121_120205_483.png
+[2025-11-21 12:02:05,819] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120205_483.png
+[2025-11-21 12:02:05,820] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120205_483.png
+[2025-11-21 12:02:05,840] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120205_826.png
+[2025-11-21 12:02:05,840] INFO: 文件将保存为: design_image/cropped_20251121_120205_826.png
+[2025-11-21 12:02:06,056] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120205_826.png
+[2025-11-21 12:02:06,057] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120205_826.png
+[2025-11-21 12:02:20,163] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/zfRNscB7zuVqpjjXIFBBq.png', 'content_type': 'image/png', 'file_name': 'zfRNscB7zuVqpjjXIFBBq.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 12:02:21,921] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120221_850.png
+[2025-11-21 12:02:21,922] INFO: 文件将保存为: design_image/cropped_20251121_120221_850.png
+[2025-11-21 12:02:22,245] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120221_850.png
+[2025-11-21 12:02:22,247] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120221_850.png
+[2025-11-21 12:02:22,280] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120222_257.png
+[2025-11-21 12:02:22,280] INFO: 文件将保存为: design_image/cropped_20251121_120222_257.png
+[2025-11-21 12:02:22,476] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120222_257.png
+[2025-11-21 12:02:22,478] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120222_257.png
+[2025-11-21 12:02:41,241] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/oDyS7IqKvHwpIUvvggrtH.png', 'content_type': 'image/png', 'file_name': 'oDyS7IqKvHwpIUvvggrtH.png', 'file_size': None, 'width': None, 'height': None}, {'url': 'https://v3b.fal.media/files/b/kangaroo/kmjLGDi7SX__ZxVgUWg-_.png', 'content_type': 'image/png', 'file_name': 'kmjLGDi7SX__ZxVgUWg-_.png', 'file_size': None, 'width': None, 'height': None}], 'description': '```\n```'}
+[2025-11-21 12:02:43,689] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120243_446.png
+[2025-11-21 12:02:43,689] INFO: 文件将保存为: design_image/cropped_20251121_120243_446.png
+[2025-11-21 12:02:44,303] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120243_446.png
+[2025-11-21 12:02:44,304] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120243_446.png
+[2025-11-21 12:02:44,318] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120244_307.png
+[2025-11-21 12:02:44,319] INFO: 文件将保存为: design_image/cropped_20251121_120244_307.png
+[2025-11-21 12:02:44,471] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120244_307.png
+[2025-11-21 12:02:44,472] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120244_307.png
+[2025-11-21 12:04:26,743] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/pg0-w4syi3TeeO2XSKFQb.png', 'content_type': 'image/png', 'file_name': 'pg0-w4syi3TeeO2XSKFQb.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:04:28,813] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120428_730.png
+[2025-11-21 12:04:28,813] INFO: 文件将保存为: design_image/cropped_20251121_120428_730.png
+[2025-11-21 12:04:29,209] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120428_730.png
+[2025-11-21 12:04:29,211] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120428_730.png
+[2025-11-21 12:04:29,242] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120429_218.png
+[2025-11-21 12:04:29,243] INFO: 文件将保存为: design_image/cropped_20251121_120429_218.png
+[2025-11-21 12:04:29,530] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120429_218.png
+[2025-11-21 12:04:29,531] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120429_218.png
+[2025-11-21 12:04:41,632] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/g2uWTDnCuPyyVdlvOBfFL.png', 'content_type': 'image/png', 'file_name': 'g2uWTDnCuPyyVdlvOBfFL.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:04:43,473] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120443_397.png
+[2025-11-21 12:04:43,473] INFO: 文件将保存为: design_image/cropped_20251121_120443_397.png
+[2025-11-21 12:04:43,771] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120443_397.png
+[2025-11-21 12:04:43,773] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120443_397.png
+[2025-11-21 12:04:43,799] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120443_780.png
+[2025-11-21 12:04:43,799] INFO: 文件将保存为: design_image/cropped_20251121_120443_780.png
+[2025-11-21 12:04:43,987] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120443_780.png
+[2025-11-21 12:04:43,988] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120443_780.png
+[2025-11-21 12:04:55,588] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/lzZZuBrHf-BtxFPROLnQd.png', 'content_type': 'image/png', 'file_name': 'lzZZuBrHf-BtxFPROLnQd.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:04:57,422] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120457_338.png
+[2025-11-21 12:04:57,423] INFO: 文件将保存为: design_image/cropped_20251121_120457_338.png
+[2025-11-21 12:04:57,771] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120457_338.png
+[2025-11-21 12:04:57,772] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120457_338.png
+[2025-11-21 12:04:57,809] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120457_779.png
+[2025-11-21 12:04:57,810] INFO: 文件将保存为: design_image/cropped_20251121_120457_779.png
+[2025-11-21 12:04:58,111] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120457_779.png
+[2025-11-21 12:04:58,112] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120457_779.png
+[2025-11-21 12:05:10,347] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/x4i6NeWmCHpQbUCSyly_G.png', 'content_type': 'image/png', 'file_name': 'x4i6NeWmCHpQbUCSyly_G.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:05:12,233] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120512_163.png
+[2025-11-21 12:05:12,234] INFO: 文件将保存为: design_image/cropped_20251121_120512_163.png
+[2025-11-21 12:05:12,543] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120512_163.png
+[2025-11-21 12:05:12,544] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120512_163.png
+[2025-11-21 12:05:12,583] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120512_551.png
+[2025-11-21 12:05:12,584] INFO: 文件将保存为: design_image/cropped_20251121_120512_551.png
+[2025-11-21 12:05:12,740] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120512_551.png
+[2025-11-21 12:05:12,741] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120512_551.png
+[2025-11-21 12:05:26,516] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/7f6jldXRjRy73g_2HicBH.png', 'content_type': 'image/png', 'file_name': '7f6jldXRjRy73g_2HicBH.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/60f033bbb6b0bc8ca4bbcddcc54bc166c3d87c36efb1f99d11a259a7b7aebf30?w=896&h=1152'}
+[2025-11-21 12:05:28,291] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120528_203.png
+[2025-11-21 12:05:28,291] INFO: 文件将保存为: design_image/cropped_20251121_120528_203.png
+[2025-11-21 12:05:28,561] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120528_203.png
+[2025-11-21 12:05:28,563] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120528_203.png
+[2025-11-21 12:05:28,594] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120528_570.png
+[2025-11-21 12:05:28,595] INFO: 文件将保存为: design_image/cropped_20251121_120528_570.png
+[2025-11-21 12:05:28,775] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120528_570.png
+[2025-11-21 12:05:28,777] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120528_570.png
+[2025-11-21 12:05:44,053] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/Hm_lippaxxjqBBa8DGgU3.png', 'content_type': 'image/png', 'file_name': 'Hm_lippaxxjqBBa8DGgU3.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:05:45,873] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120545_798.png
+[2025-11-21 12:05:45,874] INFO: 文件将保存为: design_image/cropped_20251121_120545_798.png
+[2025-11-21 12:05:46,206] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120545_798.png
+[2025-11-21 12:05:46,207] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120545_798.png
+[2025-11-21 12:05:46,238] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120546_214.png
+[2025-11-21 12:05:46,239] INFO: 文件将保存为: design_image/cropped_20251121_120546_214.png
+[2025-11-21 12:05:46,420] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120546_214.png
+[2025-11-21 12:05:46,421] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120546_214.png
+[2025-11-21 12:05:55,395] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/PguQd_YdbU6CVMXsqhdBa.png', 'content_type': 'image/png', 'file_name': 'PguQd_YdbU6CVMXsqhdBa.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:05:57,084] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120557_027.png
+[2025-11-21 12:05:57,084] INFO: 文件将保存为: design_image/cropped_20251121_120557_027.png
+[2025-11-21 12:05:57,370] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120557_027.png
+[2025-11-21 12:05:57,371] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120557_027.png
+[2025-11-21 12:05:57,396] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120557_381.png
+[2025-11-21 12:05:57,396] INFO: 文件将保存为: design_image/cropped_20251121_120557_381.png
+[2025-11-21 12:05:57,674] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120557_381.png
+[2025-11-21 12:05:57,675] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120557_381.png
+[2025-11-21 12:06:07,715] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/enXQxVIMgmQH1_qD21pnY.png', 'content_type': 'image/png', 'file_name': 'enXQxVIMgmQH1_qD21pnY.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要的线稿版型图:\n '}
+[2025-11-21 12:06:09,690] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120609_586.png
+[2025-11-21 12:06:09,690] INFO: 文件将保存为: design_image/cropped_20251121_120609_586.png
+[2025-11-21 12:06:10,064] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120609_586.png
+[2025-11-21 12:06:10,065] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120609_586.png
+[2025-11-21 12:06:10,082] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120610_072.png
+[2025-11-21 12:06:10,082] INFO: 文件将保存为: design_image/cropped_20251121_120610_072.png
+[2025-11-21 12:06:10,251] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120610_072.png
+[2025-11-21 12:06:10,252] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120610_072.png
+[2025-11-21 12:06:22,142] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/zajvGupJZKM55ShYo_XjI.png', 'content_type': 'image/png', 'file_name': 'zajvGupJZKM55ShYo_XjI.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是这条衣服的线稿版型图,我已经去除了颜色和褶皱,保持了原比例和衣服的细节,并且移除了非衣服的元素。 '}
+[2025-11-21 12:06:24,189] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120624_088.png
+[2025-11-21 12:06:24,189] INFO: 文件将保存为: design_image/cropped_20251121_120624_088.png
+[2025-11-21 12:06:24,546] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120624_088.png
+[2025-11-21 12:06:24,548] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120624_088.png
+[2025-11-21 12:06:24,574] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120624_557.png
+[2025-11-21 12:06:24,575] INFO: 文件将保存为: design_image/cropped_20251121_120624_557.png
+[2025-11-21 12:06:24,723] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120624_557.png
+[2025-11-21 12:06:24,724] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120624_557.png
+[2025-11-21 12:06:38,572] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/ct9p-vxM8uz84kk8fNt04.png', 'content_type': 'image/png', 'file_name': 'ct9p-vxM8uz84kk8fNt04.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/38f3eeb17c060f4639c0fe5b049f7db9f6e5939c3004acdb8b1455562ec26662?w=736&h=1408'}
+[2025-11-21 12:06:40,328] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120640_252.png
+[2025-11-21 12:06:40,328] INFO: 文件将保存为: design_image/cropped_20251121_120640_252.png
+[2025-11-21 12:06:40,632] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120640_252.png
+[2025-11-21 12:06:40,632] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120640_252.png
+[2025-11-21 12:06:40,668] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120640_635.png
+[2025-11-21 12:06:40,669] INFO: 文件将保存为: design_image/cropped_20251121_120640_635.png
+[2025-11-21 12:06:40,881] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120640_635.png
+[2025-11-21 12:06:40,882] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120640_635.png
+[2025-11-21 12:06:50,518] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/KckA4zhI5KhlmINQQI6c6.png', 'content_type': 'image/png', 'file_name': 'KckA4zhI5KhlmINQQI6c6.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:06:52,288] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120652_205.png
+[2025-11-21 12:06:52,288] INFO: 文件将保存为: design_image/cropped_20251121_120652_205.png
+[2025-11-21 12:06:52,620] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120652_205.png
+[2025-11-21 12:06:52,621] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120652_205.png
+[2025-11-21 12:06:52,645] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120652_628.png
+[2025-11-21 12:06:52,645] INFO: 文件将保存为: design_image/cropped_20251121_120652_628.png
+[2025-11-21 12:06:52,799] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120652_628.png
+[2025-11-21 12:06:52,801] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120652_628.png
+[2025-11-21 12:07:03,101] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/9lHuIq1DqTA_x4X1ylgGu.png', 'content_type': 'image/png', 'file_name': '9lHuIq1DqTA_x4X1ylgGu.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:07:05,149] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120705_068.png
+[2025-11-21 12:07:05,149] INFO: 文件将保存为: design_image/cropped_20251121_120705_068.png
+[2025-11-21 12:07:05,406] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120705_068.png
+[2025-11-21 12:07:05,407] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120705_068.png
+[2025-11-21 12:07:05,436] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120705_416.png
+[2025-11-21 12:07:05,436] INFO: 文件将保存为: design_image/cropped_20251121_120705_416.png
+[2025-11-21 12:07:05,849] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120705_416.png
+[2025-11-21 12:07:05,850] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120705_416.png
+[2025-11-21 12:07:15,132] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/SqMu40krXByyDhQhOy-Rc.png', 'content_type': 'image/png', 'file_name': 'SqMu40krXByyDhQhOy-Rc.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:07:16,957] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120716_895.png
+[2025-11-21 12:07:16,957] INFO: 文件将保存为: design_image/cropped_20251121_120716_895.png
+[2025-11-21 12:07:17,202] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120716_895.png
+[2025-11-21 12:07:17,203] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120716_895.png
+[2025-11-21 12:07:17,229] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120717_205.png
+[2025-11-21 12:07:17,230] INFO: 文件将保存为: design_image/cropped_20251121_120717_205.png
+[2025-11-21 12:07:17,432] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120717_205.png
+[2025-11-21 12:07:17,433] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120717_205.png
+[2025-11-21 12:07:28,822] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/QtMBJJoLWEB5VUs2cx64m.png', 'content_type': 'image/png', 'file_name': 'QtMBJJoLWEB5VUs2cx64m.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:07:30,811] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120730_738.png
+[2025-11-21 12:07:30,812] INFO: 文件将保存为: design_image/cropped_20251121_120730_738.png
+[2025-11-21 12:07:31,116] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120730_738.png
+[2025-11-21 12:07:31,117] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120730_738.png
+[2025-11-21 12:07:31,144] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120731_124.png
+[2025-11-21 12:07:31,145] INFO: 文件将保存为: design_image/cropped_20251121_120731_124.png
+[2025-11-21 12:07:31,345] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120731_124.png
+[2025-11-21 12:07:31,347] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120731_124.png
+[2025-11-21 12:07:41,920] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/xJ3tz44wWHaBN01aWWuiU.png', 'content_type': 'image/png', 'file_name': 'xJ3tz44wWHaBN01aWWuiU.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:07:44,525] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120744_311.png
+[2025-11-21 12:07:44,525] INFO: 文件将保存为: design_image/cropped_20251121_120744_311.png
+[2025-11-21 12:07:45,716] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120744_311.png
+[2025-11-21 12:07:45,717] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120744_311.png
+[2025-11-21 12:07:45,742] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120745_725.png
+[2025-11-21 12:07:45,742] INFO: 文件将保存为: design_image/cropped_20251121_120745_725.png
+[2025-11-21 12:07:45,983] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120745_725.png
+[2025-11-21 12:07:45,984] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120745_725.png
+[2025-11-21 12:07:57,720] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/Y4med3RbteXdsAWJx3ngX.png', 'content_type': 'image/png', 'file_name': 'Y4med3RbteXdsAWJx3ngX.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:07:59,691] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120759_579.png
+[2025-11-21 12:07:59,691] INFO: 文件将保存为: design_image/cropped_20251121_120759_579.png
+[2025-11-21 12:08:00,130] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120759_579.png
+[2025-11-21 12:08:00,131] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120759_579.png
+[2025-11-21 12:08:00,159] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120800_138.png
+[2025-11-21 12:08:00,160] INFO: 文件将保存为: design_image/cropped_20251121_120800_138.png
+[2025-11-21 12:08:00,358] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120800_138.png
+[2025-11-21 12:08:00,360] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120800_138.png
+[2025-11-21 12:08:17,184] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/NUQcMEVK1qBZnSsdRf-Rw.png', 'content_type': 'image/png', 'file_name': 'NUQcMEVK1qBZnSsdRf-Rw.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 12:08:19,192] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120819_122.png
+[2025-11-21 12:08:19,192] INFO: 文件将保存为: design_image/cropped_20251121_120819_122.png
+[2025-11-21 12:08:19,503] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120819_122.png
+[2025-11-21 12:08:19,505] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120819_122.png
+[2025-11-21 12:08:19,536] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120819_514.png
+[2025-11-21 12:08:19,537] INFO: 文件将保存为: design_image/cropped_20251121_120819_514.png
+[2025-11-21 12:08:19,734] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120819_514.png
+[2025-11-21 12:08:19,736] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120819_514.png
+[2025-11-21 12:08:28,823] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/IGi65EuBY746AJ-CV7vHt.png', 'content_type': 'image/png', 'file_name': 'IGi65EuBY746AJ-CV7vHt.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:08:31,215] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120831_053.png
+[2025-11-21 12:08:31,215] INFO: 文件将保存为: design_image/cropped_20251121_120831_053.png
+[2025-11-21 12:08:31,747] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120831_053.png
+[2025-11-21 12:08:31,749] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120831_053.png
+[2025-11-21 12:08:31,770] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120831_752.png
+[2025-11-21 12:08:31,770] INFO: 文件将保存为: design_image/cropped_20251121_120831_752.png
+[2025-11-21 12:08:31,915] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120831_752.png
+[2025-11-21 12:08:31,916] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120831_752.png
+[2025-11-21 12:08:42,816] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/ZcvX0rBJwLaT4MSjQUGPD.png', 'content_type': 'image/png', 'file_name': 'ZcvX0rBJwLaT4MSjQUGPD.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:08:45,016] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120844_895.png
+[2025-11-21 12:08:45,016] INFO: 文件将保存为: design_image/cropped_20251121_120844_895.png
+[2025-11-21 12:08:45,405] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120844_895.png
+[2025-11-21 12:08:45,407] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120844_895.png
+[2025-11-21 12:08:45,429] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120845_414.png
+[2025-11-21 12:08:45,429] INFO: 文件将保存为: design_image/cropped_20251121_120845_414.png
+[2025-11-21 12:08:45,642] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120845_414.png
+[2025-11-21 12:08:45,643] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120845_414.png
+[2025-11-21 12:08:57,114] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/GfDHBei62FFKDDMTz-rkr.png', 'content_type': 'image/png', 'file_name': 'GfDHBei62FFKDDMTz-rkr.png', 'file_size': None, 'width': None, 'height': None}], 'description': '当然,这是您要的线稿版型图:\n '}
+[2025-11-21 12:08:59,120] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120859_023.png
+[2025-11-21 12:08:59,120] INFO: 文件将保存为: design_image/cropped_20251121_120859_023.png
+[2025-11-21 12:08:59,486] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120859_023.png
+[2025-11-21 12:08:59,488] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120859_023.png
+[2025-11-21 12:08:59,510] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120859_495.png
+[2025-11-21 12:08:59,511] INFO: 文件将保存为: design_image/cropped_20251121_120859_495.png
+[2025-11-21 12:08:59,670] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120859_495.png
+[2025-11-21 12:08:59,672] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120859_495.png
+[2025-11-21 12:09:08,733] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/uFZ9k1rSJovRKyJPtRfqa.png', 'content_type': 'image/png', 'file_name': 'uFZ9k1rSJovRKyJPtRfqa.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:09:10,725] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120910_631.png
+[2025-11-21 12:09:10,725] INFO: 文件将保存为: design_image/cropped_20251121_120910_631.png
+[2025-11-21 12:09:11,125] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120910_631.png
+[2025-11-21 12:09:11,126] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120910_631.png
+[2025-11-21 12:09:11,151] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120911_133.png
+[2025-11-21 12:09:11,151] INFO: 文件将保存为: design_image/cropped_20251121_120911_133.png
+[2025-11-21 12:09:11,320] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120911_133.png
+[2025-11-21 12:09:11,321] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120911_133.png
+[2025-11-21 12:09:22,622] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/1INgcGSpLIrSA6OHh5Dzm.png', 'content_type': 'image/png', 'file_name': '1INgcGSpLIrSA6OHh5Dzm.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:09:24,509] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120924_438.png
+[2025-11-21 12:09:24,509] INFO: 文件将保存为: design_image/cropped_20251121_120924_438.png
+[2025-11-21 12:09:25,338] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120924_438.png
+[2025-11-21 12:09:25,339] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120924_438.png
+[2025-11-21 12:09:25,374] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120925_349.png
+[2025-11-21 12:09:25,374] INFO: 文件将保存为: design_image/cropped_20251121_120925_349.png
+[2025-11-21 12:09:25,589] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120925_349.png
+[2025-11-21 12:09:25,590] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120925_349.png
+[2025-11-21 12:09:35,070] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/Nm5nWWyH65pJcjH0WPQMe.png', 'content_type': 'image/png', 'file_name': 'Nm5nWWyH65pJcjH0WPQMe.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:09:37,120] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120937_047.png
+[2025-11-21 12:09:37,120] INFO: 文件将保存为: design_image/cropped_20251121_120937_047.png
+[2025-11-21 12:09:37,463] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120937_047.png
+[2025-11-21 12:09:37,464] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120937_047.png
+[2025-11-21 12:09:37,487] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120937_471.png
+[2025-11-21 12:09:37,487] INFO: 文件将保存为: design_image/cropped_20251121_120937_471.png
+[2025-11-21 12:09:37,654] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120937_471.png
+[2025-11-21 12:09:37,655] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120937_471.png
+[2025-11-21 12:09:49,264] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/P6siofHsyU5kJxNigneD2.png', 'content_type': 'image/png', 'file_name': 'P6siofHsyU5kJxNigneD2.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:09:51,203] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120951_119.png
+[2025-11-21 12:09:51,203] INFO: 文件将保存为: design_image/cropped_20251121_120951_119.png
+[2025-11-21 12:09:51,631] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120951_119.png
+[2025-11-21 12:09:51,632] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120951_119.png
+[2025-11-21 12:09:51,648] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_120951_634.png
+[2025-11-21 12:09:51,648] INFO: 文件将保存为: design_image/cropped_20251121_120951_634.png
+[2025-11-21 12:09:51,819] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120951_634.png
+[2025-11-21 12:09:51,820] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120951_634.png
+[2025-11-21 12:10:03,898] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/twXtrUoXfmfnBHjkWve8h.png', 'content_type': 'image/png', 'file_name': 'twXtrUoXfmfnBHjkWve8h.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 12:10:06,383] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_121006_121.png
+[2025-11-21 12:10:06,384] INFO: 文件将保存为: design_image/cropped_20251121_121006_121.png
+[2025-11-21 12:10:06,938] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_121006_121.png
+[2025-11-21 12:10:06,939] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_121006_121.png
+[2025-11-21 15:05:57,707] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_150557_691.png
+[2025-11-21 15:05:57,707] INFO: 文件将保存为: design_image/cropped_20251121_150557_691.png
+[2025-11-21 15:05:57,907] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150557_691.png
+[2025-11-21 15:05:57,908] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150557_691.png
+[2025-11-21 15:06:13,398] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/4kExYQIwyN3mRqw1P-d8a.png', 'content_type': 'image/png', 'file_name': '4kExYQIwyN3mRqw1P-d8a.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/e59973c599f9928e352d4520d41a7ea3598fcb69b98f773d92fc58b603ea3ab5?w=800&h=1280'}
+[2025-11-21 15:06:15,440] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_150615_370.png
+[2025-11-21 15:06:15,441] INFO: 文件将保存为: design_image/cropped_20251121_150615_370.png
+[2025-11-21 15:06:15,788] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150615_370.png
+[2025-11-21 15:06:15,789] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150615_370.png
+[2025-11-21 15:07:20,010] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_150720_000.png
+[2025-11-21 15:07:20,010] INFO: 文件将保存为: design_image/cropped_20251121_150720_000.png
+[2025-11-21 15:07:20,165] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150720_000.png
+[2025-11-21 15:07:20,166] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150720_000.png
+[2025-11-21 15:07:38,805] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/Hue9d80aduxp0DaLjbeNd.png', 'content_type': 'image/png', 'file_name': 'Hue9d80aduxp0DaLjbeNd.png', 'file_size': None, 'width': None, 'height': None}], 'description': 'Here is the flat line drawing of the dress, with colors removed, original proportions maintained, and wrinkles smoothed out, showing only the details of the garment without other elements. \n\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/da9b08c839e1ebb7f22e4c4b235da90aad5f1db708198d6c82637d0058bbc953?w=640&h=1632'}
+[2025-11-21 15:07:41,005] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_150740_912.png
+[2025-11-21 15:07:41,005] INFO: 文件将保存为: design_image/cropped_20251121_150740_912.png
+[2025-11-21 15:07:41,358] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150740_912.png
+[2025-11-21 15:07:41,359] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_150740_912.png
+[2025-11-21 15:21:17,719] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152117_708.png
+[2025-11-21 15:21:17,720] INFO: 文件将保存为: design_image/cropped_20251121_152117_708.png
+[2025-11-21 15:21:17,933] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152117_708.png
+[2025-11-21 15:21:17,934] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152117_708.png
+[2025-11-21 15:21:34,005] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/PPFk9HnDir5N3b8lIhcS1.png', 'content_type': 'image/png', 'file_name': 'PPFk9HnDir5N3b8lIhcS1.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n.\n\nhttps://pfst.cf2.poecdn.net/base/image/9690fecf615293929f687a02eff56ced36b9dbf5b8f19556e9c3f9c15a882511?w=800&h=1280'}
+[2025-11-21 15:21:36,946] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152136_712.png
+[2025-11-21 15:21:36,947] INFO: 文件将保存为: design_image/cropped_20251121_152136_712.png
+[2025-11-21 15:21:38,691] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152136_712.png
+[2025-11-21 15:21:38,692] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152136_712.png
+[2025-11-21 15:22:06,650] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152206_639.png
+[2025-11-21 15:22:06,651] INFO: 文件将保存为: design_image/cropped_20251121_152206_639.png
+[2025-11-21 15:22:06,879] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152206_639.png
+[2025-11-21 15:22:06,880] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152206_639.png
+[2025-11-21 15:22:21,052] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/aix_figBUGNsWlfkQyns6.png', 'content_type': 'image/png', 'file_name': 'aix_figBUGNsWlfkQyns6.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 15:22:29,081] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152228_836.png
+[2025-11-21 15:22:29,081] INFO: 文件将保存为: design_image/cropped_20251121_152228_836.png
+[2025-11-21 15:22:30,086] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152228_836.png
+[2025-11-21 15:22:30,087] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152228_836.png
+[2025-11-21 15:24:59,643] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152459_631.png
+[2025-11-21 15:24:59,644] INFO: 文件将保存为: design_image/cropped_20251121_152459_631.png
+[2025-11-21 15:24:59,871] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152459_631.png
+[2025-11-21 15:24:59,872] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152459_631.png
+[2025-11-21 15:25:12,931] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/cBcKaHsQ0NB33_RYESKP4.png', 'content_type': 'image/png', 'file_name': 'cBcKaHsQ0NB33_RYESKP4.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 15:25:14,906] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_152514_797.png
+[2025-11-21 15:25:14,907] INFO: 文件将保存为: design_image/cropped_20251121_152514_797.png
+[2025-11-21 15:25:15,273] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152514_797.png
+[2025-11-21 15:25:15,275] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_152514_797.png
+[2025-11-21 15:31:42,250] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_153142_233.png
+[2025-11-21 15:31:42,250] INFO: 文件将保存为: design_image/cropped_20251121_153142_233.png
+[2025-11-21 15:31:42,475] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153142_233.png
+[2025-11-21 15:31:42,477] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153142_233.png
+[2025-11-21 15:31:55,024] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/zHEBl-YHRTrkXn1kc2HjS.png', 'content_type': 'image/png', 'file_name': 'zHEBl-YHRTrkXn1kc2HjS.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 15:31:57,378] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_153157_269.png
+[2025-11-21 15:31:57,378] INFO: 文件将保存为: design_image/cropped_20251121_153157_269.png
+[2025-11-21 15:31:58,037] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153157_269.png
+[2025-11-21 15:31:58,038] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153157_269.png
+[2025-11-21 15:34:37,407] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_153437_394.png
+[2025-11-21 15:34:37,407] INFO: 文件将保存为: design_image/cropped_20251121_153437_394.png
+[2025-11-21 15:34:37,667] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153437_394.png
+[2025-11-21 15:34:37,669] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153437_394.png
+[2025-11-21 15:34:53,005] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/j_wKy5uqywEu0shuyBaiL.png', 'content_type': 'image/png', 'file_name': 'j_wKy5uqywEu0shuyBaiL.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 15:34:55,439] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_153455_171.png
+[2025-11-21 15:34:55,439] INFO: 文件将保存为: design_image/cropped_20251121_153455_171.png
+[2025-11-21 15:34:56,120] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153455_171.png
+[2025-11-21 15:34:56,121] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_153455_171.png
+[2025-11-21 16:08:59,677] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_160859_653.png
+[2025-11-21 16:08:59,677] INFO: 文件将保存为: design_image/cropped_20251121_160859_653.png
+[2025-11-21 16:08:59,879] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160859_653.png
+[2025-11-21 16:08:59,880] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160859_653.png
+[2025-11-21 16:09:15,931] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/epbV34VKjV8c3HYqwlim4.png', 'content_type': 'image/png', 'file_name': 'epbV34VKjV8c3HYqwlim4.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 16:09:18,033] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_160917_908.png
+[2025-11-21 16:09:18,033] INFO: 文件将保存为: design_image/cropped_20251121_160917_908.png
+[2025-11-21 16:09:18,464] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160917_908.png
+[2025-11-21 16:09:18,465] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160917_908.png
+[2025-11-21 16:09:31,762] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_160931_735.png
+[2025-11-21 16:09:31,763] INFO: 文件将保存为: design_image/cropped_20251121_160931_735.png
+[2025-11-21 16:09:31,953] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160931_735.png
+[2025-11-21 16:09:31,954] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160931_735.png
+[2025-11-21 16:09:51,899] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/wWJ6BqiOHdfhkBtobbK7J.png', 'content_type': 'image/png', 'file_name': 'wWJ6BqiOHdfhkBtobbK7J.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/6e1a43635559d0b3aa73c3984e066a45d9c0e4bdeedfe8e59145103620ab33ab?w=832&h=1248'}
+[2025-11-21 16:09:53,989] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_160953_851.png
+[2025-11-21 16:09:53,990] INFO: 文件将保存为: design_image/cropped_20251121_160953_851.png
+[2025-11-21 16:09:54,435] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160953_851.png
+[2025-11-21 16:09:54,437] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_160953_851.png
+[2025-11-21 16:10:39,927] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161039_903.png
+[2025-11-21 16:10:39,927] INFO: 文件将保存为: design_image/cropped_20251121_161039_903.png
+[2025-11-21 16:10:40,163] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161039_903.png
+[2025-11-21 16:10:40,165] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161039_903.png
+[2025-11-21 16:10:52,655] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/t3qfCJKgrmp_MFRTiHylZ.png', 'content_type': 'image/png', 'file_name': 't3qfCJKgrmp_MFRTiHylZ.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:10:54,709] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161054_588.png
+[2025-11-21 16:10:54,709] INFO: 文件将保存为: design_image/cropped_20251121_161054_588.png
+[2025-11-21 16:10:55,133] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161054_588.png
+[2025-11-21 16:10:55,133] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161054_588.png
+[2025-11-21 16:12:00,378] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161200_359.png
+[2025-11-21 16:12:00,378] INFO: 文件将保存为: design_image/cropped_20251121_161200_359.png
+[2025-11-21 16:12:00,616] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161200_359.png
+[2025-11-21 16:12:00,618] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161200_359.png
+[2025-11-21 16:12:14,414] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/-nCoT49HstmJ2KxMa97Vv.png', 'content_type': 'image/png', 'file_name': '-nCoT49HstmJ2KxMa97Vv.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:12:34,391] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161234_139.png
+[2025-11-21 16:12:34,391] INFO: 文件将保存为: design_image/cropped_20251121_161234_139.png
+[2025-11-21 16:12:34,947] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161234_139.png
+[2025-11-21 16:12:34,948] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161234_139.png
+[2025-11-21 16:13:03,305] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161303_286.png
+[2025-11-21 16:13:03,305] INFO: 文件将保存为: design_image/cropped_20251121_161303_286.png
+[2025-11-21 16:13:03,522] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161303_286.png
+[2025-11-21 16:13:03,524] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161303_286.png
+[2025-11-21 16:13:16,996] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/qOHkht7BGOINFNDKS94QB.png', 'content_type': 'image/png', 'file_name': 'qOHkht7BGOINFNDKS94QB.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:13:19,210] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161319_109.png
+[2025-11-21 16:13:19,210] INFO: 文件将保存为: design_image/cropped_20251121_161319_109.png
+[2025-11-21 16:13:19,578] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161319_109.png
+[2025-11-21 16:13:19,580] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161319_109.png
+[2025-11-21 16:15:56,588] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161556_561.png
+[2025-11-21 16:15:56,588] INFO: 文件将保存为: design_image/cropped_20251121_161556_561.png
+[2025-11-21 16:15:56,797] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161556_561.png
+[2025-11-21 16:15:56,798] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161556_561.png
+[2025-11-21 16:16:12,609] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/IAVSVDchlrIQvssSKKJQ-.png', 'content_type': 'image/png', 'file_name': 'IAVSVDchlrIQvssSKKJQ-.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:16:14,466] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161614_379.png
+[2025-11-21 16:16:14,466] INFO: 文件将保存为: design_image/cropped_20251121_161614_379.png
+[2025-11-21 16:16:14,772] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161614_379.png
+[2025-11-21 16:16:14,773] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161614_379.png
+[2025-11-21 16:16:43,858] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161643_831.png
+[2025-11-21 16:16:43,858] INFO: 文件将保存为: design_image/cropped_20251121_161643_831.png
+[2025-11-21 16:16:44,136] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161643_831.png
+[2025-11-21 16:16:44,137] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161643_831.png
+[2025-11-21 16:17:00,769] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/0qjNTCUWC8r2CF-jpUal-.png', 'content_type': 'image/png', 'file_name': '0qjNTCUWC8r2CF-jpUal-.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:17:02,532] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161702_459.png
+[2025-11-21 16:17:02,533] INFO: 文件将保存为: design_image/cropped_20251121_161702_459.png
+[2025-11-21 16:17:02,852] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161702_459.png
+[2025-11-21 16:17:02,854] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161702_459.png
+[2025-11-21 16:18:44,335] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161844_308.png
+[2025-11-21 16:18:44,335] INFO: 文件将保存为: design_image/cropped_20251121_161844_308.png
+[2025-11-21 16:18:44,603] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161844_308.png
+[2025-11-21 16:18:44,605] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161844_308.png
+[2025-11-21 16:19:00,378] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/g0UX00ujm-66_aOOJW6yh.png', 'content_type': 'image/png', 'file_name': 'g0UX00ujm-66_aOOJW6yh.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/3b07d89ffa77c5a12330b34afa1c391c65efed4428c07812e023c8f484b668a9?w=864&h=1184'}
+[2025-11-21 16:19:02,369] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161902_267.png
+[2025-11-21 16:19:02,370] INFO: 文件将保存为: design_image/cropped_20251121_161902_267.png
+[2025-11-21 16:19:02,732] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161902_267.png
+[2025-11-21 16:19:02,733] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161902_267.png
+[2025-11-21 16:19:37,851] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161937_841.png
+[2025-11-21 16:19:37,851] INFO: 文件将保存为: design_image/cropped_20251121_161937_841.png
+[2025-11-21 16:19:38,028] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161937_841.png
+[2025-11-21 16:19:38,030] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161937_841.png
+[2025-11-21 16:19:54,560] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/JZHFfVwASjF7fG0VY_2vD.png', 'content_type': 'image/png', 'file_name': 'JZHFfVwASjF7fG0VY_2vD.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:19:56,423] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_161956_364.png
+[2025-11-21 16:19:56,423] INFO: 文件将保存为: design_image/cropped_20251121_161956_364.png
+[2025-11-21 16:19:56,796] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161956_364.png
+[2025-11-21 16:19:56,797] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_161956_364.png
+[2025-11-21 16:20:47,293] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162047_284.png
+[2025-11-21 16:20:47,293] INFO: 文件将保存为: design_image/cropped_20251121_162047_284.png
+[2025-11-21 16:20:47,492] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162047_284.png
+[2025-11-21 16:20:47,493] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162047_284.png
+[2025-11-21 16:21:14,145] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/sRTDXNcjX9qLyuxy_A-1G.png', 'content_type': 'image/png', 'file_name': 'sRTDXNcjX9qLyuxy_A-1G.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:21:16,094] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162116_028.png
+[2025-11-21 16:21:16,094] INFO: 文件将保存为: design_image/cropped_20251121_162116_028.png
+[2025-11-21 16:21:16,461] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162116_028.png
+[2025-11-21 16:21:16,463] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162116_028.png
+[2025-11-21 16:21:39,962] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162139_953.png
+[2025-11-21 16:21:39,962] INFO: 文件将保存为: design_image/cropped_20251121_162139_953.png
+[2025-11-21 16:21:40,121] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162139_953.png
+[2025-11-21 16:21:40,122] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162139_953.png
+[2025-11-21 16:22:01,273] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/nFItqm0hoY3BsR1WrfQav.png', 'content_type': 'image/png', 'file_name': 'nFItqm0hoY3BsR1WrfQav.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:22:03,691] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162203_443.png
+[2025-11-21 16:22:03,692] INFO: 文件将保存为: design_image/cropped_20251121_162203_443.png
+[2025-11-21 16:22:04,553] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162203_443.png
+[2025-11-21 16:22:04,554] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162203_443.png
+[2025-11-21 16:22:27,973] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162227_964.png
+[2025-11-21 16:22:27,973] INFO: 文件将保存为: design_image/cropped_20251121_162227_964.png
+[2025-11-21 16:22:28,183] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162227_964.png
+[2025-11-21 16:22:28,185] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162227_964.png
+[2025-11-21 16:22:38,370] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/V5RNCe14UJoy_G3gJFSE8.png', 'content_type': 'image/png', 'file_name': 'V5RNCe14UJoy_G3gJFSE8.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要求的线稿版型图: '}
+[2025-11-21 16:22:40,833] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162240_528.png
+[2025-11-21 16:22:40,833] INFO: 文件将保存为: design_image/cropped_20251121_162240_528.png
+[2025-11-21 16:22:41,406] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162240_528.png
+[2025-11-21 16:22:41,408] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162240_528.png
+[2025-11-21 16:23:44,019] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162343_999.png
+[2025-11-21 16:23:44,019] INFO: 文件将保存为: design_image/cropped_20251121_162343_999.png
+[2025-11-21 16:23:44,219] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162343_999.png
+[2025-11-21 16:23:44,220] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162343_999.png
+[2025-11-21 16:24:10,651] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/M_4OEBCgOUhI_Eprbwf9n.png', 'content_type': 'image/png', 'file_name': 'M_4OEBCgOUhI_Eprbwf9n.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/42ce20b38ee455a0a75d57f96ad8f05948dc29181f3b870d32cbffd940058017?w=896&h=1152'}
+[2025-11-21 16:24:15,972] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162415_878.png
+[2025-11-21 16:24:15,973] INFO: 文件将保存为: design_image/cropped_20251121_162415_878.png
+[2025-11-21 16:24:16,571] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162415_878.png
+[2025-11-21 16:24:16,573] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162415_878.png
+[2025-11-21 16:25:43,723] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162543_711.png
+[2025-11-21 16:25:43,723] INFO: 文件将保存为: design_image/cropped_20251121_162543_711.png
+[2025-11-21 16:25:43,925] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162543_711.png
+[2025-11-21 16:25:43,926] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162543_711.png
+[2025-11-21 16:25:59,102] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/2RdaCu1VYqAA6Y8ZL_v4W.png', 'content_type': 'image/png', 'file_name': '2RdaCu1VYqAA6Y8ZL_v4W.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 16:26:01,112] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162601_003.png
+[2025-11-21 16:26:01,113] INFO: 文件将保存为: design_image/cropped_20251121_162601_003.png
+[2025-11-21 16:26:01,505] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162601_003.png
+[2025-11-21 16:26:01,507] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162601_003.png
+[2025-11-21 16:26:53,758] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162653_742.png
+[2025-11-21 16:26:53,758] INFO: 文件将保存为: design_image/cropped_20251121_162653_742.png
+[2025-11-21 16:26:54,010] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162653_742.png
+[2025-11-21 16:26:54,011] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162653_742.png
+[2025-11-21 16:27:03,301] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/EDP68R7tFfbfepyDBygqr.png', 'content_type': 'image/png', 'file_name': 'EDP68R7tFfbfepyDBygqr.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:27:05,327] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162705_235.png
+[2025-11-21 16:27:05,327] INFO: 文件将保存为: design_image/cropped_20251121_162705_235.png
+[2025-11-21 16:27:05,668] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162705_235.png
+[2025-11-21 16:27:05,670] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162705_235.png
+[2025-11-21 16:27:14,596] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162714_580.png
+[2025-11-21 16:27:14,596] INFO: 文件将保存为: design_image/cropped_20251121_162714_580.png
+[2025-11-21 16:27:14,736] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162714_580.png
+[2025-11-21 16:27:14,737] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162714_580.png
+[2025-11-21 16:27:31,383] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/m6CAOB4VOaxzjx9zwld_q.png', 'content_type': 'image/png', 'file_name': 'm6CAOB4VOaxzjx9zwld_q.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:27:33,872] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162733_526.png
+[2025-11-21 16:27:33,872] INFO: 文件将保存为: design_image/cropped_20251121_162733_526.png
+[2025-11-21 16:27:34,398] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162733_526.png
+[2025-11-21 16:27:34,399] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162733_526.png
+[2025-11-21 16:28:16,128] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162816_112.png
+[2025-11-21 16:28:16,129] INFO: 文件将保存为: design_image/cropped_20251121_162816_112.png
+[2025-11-21 16:28:16,297] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162816_112.png
+[2025-11-21 16:28:16,298] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162816_112.png
+[2025-11-21 16:28:30,411] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/HaUfSRby_DxBvz7dfc_xN.png', 'content_type': 'image/png', 'file_name': 'HaUfSRby_DxBvz7dfc_xN.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/b3009115fa7d2de289be0454f6af60cd7cb9e131c48fd33da9ab847a7f5a47c9?w=800&h=1280'}
+[2025-11-21 16:28:32,308] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162832_191.png
+[2025-11-21 16:28:32,308] INFO: 文件将保存为: design_image/cropped_20251121_162832_191.png
+[2025-11-21 16:28:32,612] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162832_191.png
+[2025-11-21 16:28:32,613] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162832_191.png
+[2025-11-21 16:28:45,577] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162845_561.png
+[2025-11-21 16:28:45,578] INFO: 文件将保存为: design_image/cropped_20251121_162845_561.png
+[2025-11-21 16:28:45,761] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162845_561.png
+[2025-11-21 16:28:45,762] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162845_561.png
+[2025-11-21 16:28:59,867] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/yx0Oskg4vgo-_RjA-8BJE.png', 'content_type': 'image/png', 'file_name': 'yx0Oskg4vgo-_RjA-8BJE.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:29:01,701] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162901_599.png
+[2025-11-21 16:29:01,701] INFO: 文件将保存为: design_image/cropped_20251121_162901_599.png
+[2025-11-21 16:29:01,978] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162901_599.png
+[2025-11-21 16:29:01,979] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162901_599.png
+[2025-11-21 16:29:23,330] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162923_306.png
+[2025-11-21 16:29:23,330] INFO: 文件将保存为: design_image/cropped_20251121_162923_306.png
+[2025-11-21 16:29:23,522] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162923_306.png
+[2025-11-21 16:29:23,523] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162923_306.png
+[2025-11-21 16:29:35,068] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/LEqzCOr-L2Ua5E30ZeHkK.png', 'content_type': 'image/png', 'file_name': 'LEqzCOr-L2Ua5E30ZeHkK.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:29:37,094] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_162936_974.png
+[2025-11-21 16:29:37,094] INFO: 文件将保存为: design_image/cropped_20251121_162936_974.png
+[2025-11-21 16:29:37,447] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162936_974.png
+[2025-11-21 16:29:37,449] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_162936_974.png
+[2025-11-21 16:30:32,735] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163032_716.png
+[2025-11-21 16:30:32,736] INFO: 文件将保存为: design_image/cropped_20251121_163032_716.png
+[2025-11-21 16:30:32,953] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163032_716.png
+[2025-11-21 16:30:32,954] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163032_716.png
+[2025-11-21 16:30:33,739] ERROR: FAL图生图接口的报错: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+Traceback (most recent call last):
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 499, in _raise_for_status
+    response.raise_for_status()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\httpx\_models.py", line 829, in raise_for_status
+    raise HTTPStatusError(message, request=request, response=self)
+httpx.HTTPStatusError: Client error '403 Forbidden' for url 'https://queue.fal.run/fal-ai/nano-banana/edit'
+For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\线稿图\fal.py", line 33, in fal_edit_images
+    result = fal_client.subscribe(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1210, in subscribe
+    handle = self.submit(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1179, in submit
+    response = _maybe_retry_request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 666, in _maybe_retry_request
+    return _request(client, method, url, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 612, in _request
+    _raise_for_status(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 506, in _raise_for_status
+    raise FalClientError(msg) from exc
+fal_client.client.FalClientError: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+[2025-11-21 16:31:29,594] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163129_561.png
+[2025-11-21 16:31:29,595] INFO: 文件将保存为: design_image/cropped_20251121_163129_561.png
+[2025-11-21 16:31:29,801] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163129_561.png
+[2025-11-21 16:31:29,803] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163129_561.png
+[2025-11-21 16:31:42,569] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/qjGFQUEIvPK3BRJkY7_WC.png', 'content_type': 'image/png', 'file_name': 'qjGFQUEIvPK3BRJkY7_WC.png', 'file_size': None, 'width': None, 'height': None}], 'description': '当然,这是您要求的线稿版型图:\n '}
+[2025-11-21 16:31:44,417] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163144_340.png
+[2025-11-21 16:31:44,417] INFO: 文件将保存为: design_image/cropped_20251121_163144_340.png
+[2025-11-21 16:31:44,719] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163144_340.png
+[2025-11-21 16:31:44,721] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163144_340.png
+[2025-11-21 16:31:52,153] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163152_134.png
+[2025-11-21 16:31:52,154] INFO: 文件将保存为: design_image/cropped_20251121_163152_134.png
+[2025-11-21 16:31:52,344] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163152_134.png
+[2025-11-21 16:31:52,345] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163152_134.png
+[2025-11-21 16:32:08,756] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/IUxXUKaDZ5enPwVY0wV-k.png', 'content_type': 'image/png', 'file_name': 'IUxXUKaDZ5enPwVY0wV-k.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:32:10,468] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163210_395.png
+[2025-11-21 16:32:10,468] INFO: 文件将保存为: design_image/cropped_20251121_163210_395.png
+[2025-11-21 16:32:10,736] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163210_395.png
+[2025-11-21 16:32:10,737] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163210_395.png
+[2025-11-21 16:32:31,766] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163231_728.png
+[2025-11-21 16:32:31,766] INFO: 文件将保存为: design_image/cropped_20251121_163231_728.png
+[2025-11-21 16:32:32,054] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163231_728.png
+[2025-11-21 16:32:32,056] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163231_728.png
+[2025-11-21 16:32:47,381] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/s2E4jH553TDycAIK_jzak.png', 'content_type': 'image/png', 'file_name': 's2E4jH553TDycAIK_jzak.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/0fca9c842ee154ba8c1074dee9280e6deff9f0e92698c44527966f478617243c?w=864&h=1184'}
+[2025-11-21 16:32:49,310] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163249_230.png
+[2025-11-21 16:32:49,310] INFO: 文件将保存为: design_image/cropped_20251121_163249_230.png
+[2025-11-21 16:32:49,691] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163249_230.png
+[2025-11-21 16:32:49,692] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163249_230.png
+[2025-11-21 16:34:15,499] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163415_476.png
+[2025-11-21 16:34:15,500] INFO: 文件将保存为: design_image/cropped_20251121_163415_476.png
+[2025-11-21 16:34:15,818] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163415_476.png
+[2025-11-21 16:34:15,819] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163415_476.png
+[2025-11-21 16:34:27,571] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/3yKiYSVsKIeX3dEcGK_me.png', 'content_type': 'image/png', 'file_name': '3yKiYSVsKIeX3dEcGK_me.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:34:29,440] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163429_353.png
+[2025-11-21 16:34:29,440] INFO: 文件将保存为: design_image/cropped_20251121_163429_353.png
+[2025-11-21 16:34:29,779] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163429_353.png
+[2025-11-21 16:34:29,780] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163429_353.png
+[2025-11-21 16:35:35,887] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163535_863.png
+[2025-11-21 16:35:35,888] INFO: 文件将保存为: design_image/cropped_20251121_163535_863.png
+[2025-11-21 16:35:36,132] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163535_863.png
+[2025-11-21 16:35:36,133] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163535_863.png
+[2025-11-21 16:35:51,548] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/31tuf8wEKufWFFbFQKSg2.png', 'content_type': 'image/png', 'file_name': '31tuf8wEKufWFFbFQKSg2.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 16:35:53,354] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163553_257.png
+[2025-11-21 16:35:53,355] INFO: 文件将保存为: design_image/cropped_20251121_163553_257.png
+[2025-11-21 16:35:53,679] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163553_257.png
+[2025-11-21 16:35:53,680] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163553_257.png
+[2025-11-21 16:36:09,556] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163609_532.png
+[2025-11-21 16:36:09,557] INFO: 文件将保存为: design_image/cropped_20251121_163609_532.png
+[2025-11-21 16:36:09,795] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163609_532.png
+[2025-11-21 16:36:09,797] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163609_532.png
+[2025-11-21 16:36:26,613] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/E0vcqDQC_ulCzAQFVOUs0.png', 'content_type': 'image/png', 'file_name': 'E0vcqDQC_ulCzAQFVOUs0.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`'}
+[2025-11-21 16:36:28,408] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163628_344.png
+[2025-11-21 16:36:28,408] INFO: 文件将保存为: design_image/cropped_20251121_163628_344.png
+[2025-11-21 16:36:28,679] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163628_344.png
+[2025-11-21 16:36:28,680] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163628_344.png
+[2025-11-21 16:37:35,674] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163735_654.png
+[2025-11-21 16:37:35,674] INFO: 文件将保存为: design_image/cropped_20251121_163735_654.png
+[2025-11-21 16:37:35,906] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163735_654.png
+[2025-11-21 16:37:35,907] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163735_654.png
+[2025-11-21 16:37:48,237] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/ejC4ytqy7sFc555SLPC5m.png', 'content_type': 'image/png', 'file_name': 'ejC4ytqy7sFc555SLPC5m.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:37:50,165] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163750_060.png
+[2025-11-21 16:37:50,165] INFO: 文件将保存为: design_image/cropped_20251121_163750_060.png
+[2025-11-21 16:37:50,443] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163750_060.png
+[2025-11-21 16:37:50,445] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163750_060.png
+[2025-11-21 16:38:51,233] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163851_212.png
+[2025-11-21 16:38:51,234] INFO: 文件将保存为: design_image/cropped_20251121_163851_212.png
+[2025-11-21 16:38:51,426] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163851_212.png
+[2025-11-21 16:38:51,428] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163851_212.png
+[2025-11-21 16:39:07,497] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/URWQCyUEFIGpICRSrofU_.png', 'content_type': 'image/png', 'file_name': 'URWQCyUEFIGpICRSrofU_.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要求的衣服线稿版型图:\n'}
+[2025-11-21 16:39:10,073] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163909_744.png
+[2025-11-21 16:39:10,074] INFO: 文件将保存为: design_image/cropped_20251121_163909_744.png
+[2025-11-21 16:39:10,602] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163909_744.png
+[2025-11-21 16:39:10,604] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163909_744.png
+[2025-11-21 16:39:30,544] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163930_523.png
+[2025-11-21 16:39:30,545] INFO: 文件将保存为: design_image/cropped_20251121_163930_523.png
+[2025-11-21 16:39:30,791] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163930_523.png
+[2025-11-21 16:39:30,792] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163930_523.png
+[2025-11-21 16:39:44,584] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/MY8fXO_HcssW-MaxxWJTh.png', 'content_type': 'image/png', 'file_name': 'MY8fXO_HcssW-MaxxWJTh.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是这件衣服的线稿版型图:\n '}
+[2025-11-21 16:39:46,388] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163946_309.png
+[2025-11-21 16:39:46,388] INFO: 文件将保存为: design_image/cropped_20251121_163946_309.png
+[2025-11-21 16:39:46,674] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163946_309.png
+[2025-11-21 16:39:46,675] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163946_309.png
+[2025-11-21 16:39:54,971] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_163954_949.png
+[2025-11-21 16:39:54,971] INFO: 文件将保存为: design_image/cropped_20251121_163954_949.png
+[2025-11-21 16:39:55,156] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163954_949.png
+[2025-11-21 16:39:55,158] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_163954_949.png
+[2025-11-21 16:40:06,614] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/WqqDQlg3UgVIpEmmGQnUV.png', 'content_type': 'image/png', 'file_name': 'WqqDQlg3UgVIpEmmGQnUV.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:40:11,757] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164011_680.png
+[2025-11-21 16:40:11,757] INFO: 文件将保存为: design_image/cropped_20251121_164011_680.png
+[2025-11-21 16:40:12,110] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164011_680.png
+[2025-11-21 16:40:12,111] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164011_680.png
+[2025-11-21 16:40:20,157] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164020_146.png
+[2025-11-21 16:40:20,157] INFO: 文件将保存为: design_image/cropped_20251121_164020_146.png
+[2025-11-21 16:40:20,357] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164020_146.png
+[2025-11-21 16:40:20,358] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164020_146.png
+[2025-11-21 16:40:50,330] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/MQtTJWqAovH7yoKV_3qo1.png', 'content_type': 'image/png', 'file_name': 'MQtTJWqAovH7yoKV_3qo1.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:40:52,848] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164052_508.png
+[2025-11-21 16:40:52,849] INFO: 文件将保存为: design_image/cropped_20251121_164052_508.png
+[2025-11-21 16:40:53,350] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164052_508.png
+[2025-11-21 16:40:53,351] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164052_508.png
+[2025-11-21 16:41:47,493] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164147_476.png
+[2025-11-21 16:41:47,493] INFO: 文件将保存为: design_image/cropped_20251121_164147_476.png
+[2025-11-21 16:41:47,687] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164147_476.png
+[2025-11-21 16:41:47,689] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164147_476.png
+[2025-11-21 16:42:01,837] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/BJpRJjHuJnkOhd-_NpZzF.png', 'content_type': 'image/png', 'file_name': 'BJpRJjHuJnkOhd-_NpZzF.png', 'file_size': None, 'width': None, 'height': None}], 'description': '遵照您的要求,这是这款衣服的线稿版型图,已去除颜色、褶皱和非衣服元素,保持了原比例和细节: '}
+[2025-11-21 16:42:04,059] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164203_841.png
+[2025-11-21 16:42:04,059] INFO: 文件将保存为: design_image/cropped_20251121_164203_841.png
+[2025-11-21 16:42:04,768] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164203_841.png
+[2025-11-21 16:42:04,769] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164203_841.png
+[2025-11-21 16:42:14,055] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164214_038.png
+[2025-11-21 16:42:14,056] INFO: 文件将保存为: design_image/cropped_20251121_164214_038.png
+[2025-11-21 16:42:14,202] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164214_038.png
+[2025-11-21 16:42:14,203] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164214_038.png
+[2025-11-21 16:42:33,383] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/elephant/RpbJQN3AS0ztRP19FKrnu.png', 'content_type': 'image/png', 'file_name': 'RpbJQN3AS0ztRP19FKrnu.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:42:35,459] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164235_327.png
+[2025-11-21 16:42:35,460] INFO: 文件将保存为: design_image/cropped_20251121_164235_327.png
+[2025-11-21 16:42:35,787] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164235_327.png
+[2025-11-21 16:42:35,788] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164235_327.png
+[2025-11-21 16:42:43,756] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164243_739.png
+[2025-11-21 16:42:43,756] INFO: 文件将保存为: design_image/cropped_20251121_164243_739.png
+[2025-11-21 16:42:43,919] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164243_739.png
+[2025-11-21 16:42:43,920] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164243_739.png
+[2025-11-21 16:42:54,313] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/PBvNkKK1TPTz_8CGJNzcz.png', 'content_type': 'image/png', 'file_name': 'PBvNkKK1TPTz_8CGJNzcz.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:42:56,775] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164256_436.png
+[2025-11-21 16:42:56,775] INFO: 文件将保存为: design_image/cropped_20251121_164256_436.png
+[2025-11-21 16:42:57,332] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164256_436.png
+[2025-11-21 16:42:57,334] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164256_436.png
+[2025-11-21 16:43:53,023] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164353_005.png
+[2025-11-21 16:43:53,023] INFO: 文件将保存为: design_image/cropped_20251121_164353_005.png
+[2025-11-21 16:43:53,199] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164353_005.png
+[2025-11-21 16:43:53,200] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164353_005.png
+[2025-11-21 16:44:03,369] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/_PHS5rfZO_MZhZjoGj_Qo.png', 'content_type': 'image/png', 'file_name': '_PHS5rfZO_MZhZjoGj_Qo.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:44:05,565] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164405_471.png
+[2025-11-21 16:44:05,565] INFO: 文件将保存为: design_image/cropped_20251121_164405_471.png
+[2025-11-21 16:44:05,955] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164405_471.png
+[2025-11-21 16:44:05,956] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164405_471.png
+[2025-11-21 16:44:26,766] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164426_748.png
+[2025-11-21 16:44:26,766] INFO: 文件将保存为: design_image/cropped_20251121_164426_748.png
+[2025-11-21 16:44:26,920] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164426_748.png
+[2025-11-21 16:44:26,922] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164426_748.png
+[2025-11-21 16:44:38,808] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/e7RabBzlMaKqmOt-cOrqy.png', 'content_type': 'image/png', 'file_name': 'e7RabBzlMaKqmOt-cOrqy.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:44:41,091] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164440_974.png
+[2025-11-21 16:44:41,092] INFO: 文件将保存为: design_image/cropped_20251121_164440_974.png
+[2025-11-21 16:44:41,490] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164440_974.png
+[2025-11-21 16:44:41,492] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164440_974.png
+[2025-11-21 16:45:03,173] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164503_157.png
+[2025-11-21 16:45:03,173] INFO: 文件将保存为: design_image/cropped_20251121_164503_157.png
+[2025-11-21 16:45:03,322] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164503_157.png
+[2025-11-21 16:45:03,323] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164503_157.png
+[2025-11-21 16:45:15,761] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/mK13eTH_etLHIokocD9G9.png', 'content_type': 'image/png', 'file_name': 'mK13eTH_etLHIokocD9G9.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:45:23,869] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164523_765.png
+[2025-11-21 16:45:23,869] INFO: 文件将保存为: design_image/cropped_20251121_164523_765.png
+[2025-11-21 16:45:24,406] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164523_765.png
+[2025-11-21 16:45:24,407] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164523_765.png
+[2025-11-21 16:48:55,569] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164855_551.png
+[2025-11-21 16:48:55,569] INFO: 文件将保存为: design_image/cropped_20251121_164855_551.png
+[2025-11-21 16:48:55,742] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164855_551.png
+[2025-11-21 16:48:55,744] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164855_551.png
+[2025-11-21 16:49:08,365] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/buvS2_M4DJ9wtfvpm2pzH.png', 'content_type': 'image/png', 'file_name': 'buvS2_M4DJ9wtfvpm2pzH.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:49:10,845] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164910_740.png
+[2025-11-21 16:49:10,845] INFO: 文件将保存为: design_image/cropped_20251121_164910_740.png
+[2025-11-21 16:49:11,557] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164910_740.png
+[2025-11-21 16:49:11,558] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164910_740.png
+[2025-11-21 16:49:55,997] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_164955_984.png
+[2025-11-21 16:49:55,997] INFO: 文件将保存为: design_image/cropped_20251121_164955_984.png
+[2025-11-21 16:49:56,157] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164955_984.png
+[2025-11-21 16:49:56,158] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_164955_984.png
+[2025-11-21 16:50:11,961] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/penguin/y3d9u5-hZnAZVKuvAm0y9.png', 'content_type': 'image/png', 'file_name': 'y3d9u5-hZnAZVKuvAm0y9.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:50:13,952] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165013_845.png
+[2025-11-21 16:50:13,953] INFO: 文件将保存为: design_image/cropped_20251121_165013_845.png
+[2025-11-21 16:50:14,332] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165013_845.png
+[2025-11-21 16:50:14,333] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165013_845.png
+[2025-11-21 16:50:43,804] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165043_791.png
+[2025-11-21 16:50:43,804] INFO: 文件将保存为: design_image/cropped_20251121_165043_791.png
+[2025-11-21 16:50:43,945] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165043_791.png
+[2025-11-21 16:50:43,946] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165043_791.png
+[2025-11-21 16:50:57,170] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/BG1gfo1r921nfMtDK_x0d.png', 'content_type': 'image/png', 'file_name': 'BG1gfo1r921nfMtDK_x0d.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:50:59,146] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165059_055.png
+[2025-11-21 16:50:59,147] INFO: 文件将保存为: design_image/cropped_20251121_165059_055.png
+[2025-11-21 16:50:59,680] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165059_055.png
+[2025-11-21 16:50:59,681] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165059_055.png
+[2025-11-21 16:52:37,839] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165237_821.png
+[2025-11-21 16:52:37,839] INFO: 文件将保存为: design_image/cropped_20251121_165237_821.png
+[2025-11-21 16:52:38,010] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165237_821.png
+[2025-11-21 16:52:38,011] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165237_821.png
+[2025-11-21 16:52:53,993] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/gyarlhks9xsCrbEIrGcEe.png', 'content_type': 'image/png', 'file_name': 'gyarlhks9xsCrbEIrGcEe.png', 'file_size': None, 'width': None, 'height': None}], 'description': 'Here is the flat line-art version of the garment, with color removed, wrinkles smoothed, and only the outlines of the garment remaining, with the pocket details adjusted as requested. \ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/70705994688e385f966b04ab641d751b54909a76f3b0e9369c599cc15e399855?w=768&h=1344'}
+[2025-11-21 16:52:55,817] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165255_726.png
+[2025-11-21 16:52:55,817] INFO: 文件将保存为: design_image/cropped_20251121_165255_726.png
+[2025-11-21 16:52:56,154] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165255_726.png
+[2025-11-21 16:52:56,155] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165255_726.png
+[2025-11-21 16:54:10,909] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165410_891.png
+[2025-11-21 16:54:10,910] INFO: 文件将保存为: design_image/cropped_20251121_165410_891.png
+[2025-11-21 16:54:11,063] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165410_891.png
+[2025-11-21 16:54:11,064] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165410_891.png
+[2025-11-21 16:54:23,948] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/eN1vRcbw30MXIYNXDo1fE.png', 'content_type': 'image/png', 'file_name': 'eN1vRcbw30MXIYNXDo1fE.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:54:25,723] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165425_658.png
+[2025-11-21 16:54:25,723] INFO: 文件将保存为: design_image/cropped_20251121_165425_658.png
+[2025-11-21 16:54:26,087] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165425_658.png
+[2025-11-21 16:54:26,088] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165425_658.png
+[2025-11-21 16:55:28,167] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165528_148.png
+[2025-11-21 16:55:28,167] INFO: 文件将保存为: design_image/cropped_20251121_165528_148.png
+[2025-11-21 16:55:28,359] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165528_148.png
+[2025-11-21 16:55:28,360] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165528_148.png
+[2025-11-21 16:55:41,427] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/qqUKZfTO_c1k49tiIN0Dx.png', 'content_type': 'image/png', 'file_name': 'qqUKZfTO_c1k49tiIN0Dx.png', 'file_size': None, 'width': None, 'height': None}], 'description': '当然,这是您要求的红色上衣和半身裙的线稿版型图: '}
+[2025-11-21 16:55:43,164] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165543_098.png
+[2025-11-21 16:55:43,164] INFO: 文件将保存为: design_image/cropped_20251121_165543_098.png
+[2025-11-21 16:55:43,451] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165543_098.png
+[2025-11-21 16:55:43,453] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165543_098.png
+[2025-11-21 16:57:14,658] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165714_647.png
+[2025-11-21 16:57:14,658] INFO: 文件将保存为: design_image/cropped_20251121_165714_647.png
+[2025-11-21 16:57:15,013] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165714_647.png
+[2025-11-21 16:57:15,014] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165714_647.png
+[2025-11-21 16:57:29,235] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/RTKoMn471bSDk79yUKMs3.png', 'content_type': 'image/png', 'file_name': 'RTKoMn471bSDk79yUKMs3.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 16:57:32,009] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_165731_784.png
+[2025-11-21 16:57:32,009] INFO: 文件将保存为: design_image/cropped_20251121_165731_784.png
+[2025-11-21 16:57:32,913] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165731_784.png
+[2025-11-21 16:57:32,914] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_165731_784.png
+[2025-11-21 17:05:37,145] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170537_122.png
+[2025-11-21 17:05:37,146] INFO: 文件将保存为: design_image/cropped_20251121_170537_122.png
+[2025-11-21 17:05:37,381] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170537_122.png
+[2025-11-21 17:05:37,383] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170537_122.png
+[2025-11-21 17:06:00,140] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/bPCaONsO8v0VkbIT4PwxO.png', 'content_type': 'image/png', 'file_name': 'bPCaONsO8v0VkbIT4PwxO.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:06:02,430] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170602_314.png
+[2025-11-21 17:06:02,430] INFO: 文件将保存为: design_image/cropped_20251121_170602_314.png
+[2025-11-21 17:06:02,841] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170602_314.png
+[2025-11-21 17:06:02,842] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170602_314.png
+[2025-11-21 17:06:41,033] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170641_010.png
+[2025-11-21 17:06:41,034] INFO: 文件将保存为: design_image/cropped_20251121_170641_010.png
+[2025-11-21 17:06:41,261] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170641_010.png
+[2025-11-21 17:06:41,262] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170641_010.png
+[2025-11-21 17:06:55,353] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/opYDpleoz_e81-KirVWKK.png', 'content_type': 'image/png', 'file_name': 'opYDpleoz_e81-KirVWKK.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:06:57,408] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170657_307.png
+[2025-11-21 17:06:57,408] INFO: 文件将保存为: design_image/cropped_20251121_170657_307.png
+[2025-11-21 17:06:57,932] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170657_307.png
+[2025-11-21 17:06:57,933] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170657_307.png
+[2025-11-21 17:07:08,786] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170708_762.png
+[2025-11-21 17:07:08,786] INFO: 文件将保存为: design_image/cropped_20251121_170708_762.png
+[2025-11-21 17:07:08,992] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170708_762.png
+[2025-11-21 17:07:08,993] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170708_762.png
+[2025-11-21 17:07:22,893] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/yxCj41u6ayTxHvDOwl6n5.png', 'content_type': 'image/png', 'file_name': 'yxCj41u6ayTxHvDOwl6n5.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是您要求的衣服线稿版型图: '}
+[2025-11-21 17:07:24,971] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170724_832.png
+[2025-11-21 17:07:24,971] INFO: 文件将保存为: design_image/cropped_20251121_170724_832.png
+[2025-11-21 17:07:25,492] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170724_832.png
+[2025-11-21 17:07:25,493] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170724_832.png
+[2025-11-21 17:09:14,774] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170914_749.png
+[2025-11-21 17:09:14,774] INFO: 文件将保存为: design_image/cropped_20251121_170914_749.png
+[2025-11-21 17:09:14,976] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170914_749.png
+[2025-11-21 17:09:14,977] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170914_749.png
+[2025-11-21 17:09:33,366] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/W6pEtRYj3HnPqE9ZgPBnD.png', 'content_type': 'image/png', 'file_name': 'W6pEtRYj3HnPqE9ZgPBnD.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/08366c541995f7339eb120ebdd43c087ea16c7f33a061daa0684ae8d2c858061?w=832&h=1248'}
+[2025-11-21 17:09:35,549] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170935_416.png
+[2025-11-21 17:09:35,550] INFO: 文件将保存为: design_image/cropped_20251121_170935_416.png
+[2025-11-21 17:09:36,073] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170935_416.png
+[2025-11-21 17:09:36,075] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170935_416.png
+[2025-11-21 17:09:43,179] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_170943_156.png
+[2025-11-21 17:09:43,179] INFO: 文件将保存为: design_image/cropped_20251121_170943_156.png
+[2025-11-21 17:09:43,359] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170943_156.png
+[2025-11-21 17:09:43,361] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_170943_156.png
+[2025-11-21 17:10:00,677] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/nMg3BZn6KdFoJxDayhM3Y.png', 'content_type': 'image/png', 'file_name': 'nMg3BZn6KdFoJxDayhM3Y.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\n(Flap Pocket without Exposed Stitching)_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/f5059b85e525c71a4befe77853fde5926ba72f9cc45a018f48efdd378d2987b3?w=832&h=1248'}
+[2025-11-21 17:10:02,706] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_171002_574.png
+[2025-11-21 17:10:02,706] INFO: 文件将保存为: design_image/cropped_20251121_171002_574.png
+[2025-11-21 17:10:03,170] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171002_574.png
+[2025-11-21 17:10:03,171] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171002_574.png
+[2025-11-21 17:11:54,503] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_171154_486.png
+[2025-11-21 17:11:54,503] INFO: 文件将保存为: design_image/cropped_20251121_171154_486.png
+[2025-11-21 17:11:54,672] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171154_486.png
+[2025-11-21 17:11:54,674] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171154_486.png
+[2025-11-21 17:12:07,469] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/YVPpZ2PYgb9l0BrdmQYzR.png', 'content_type': 'image/png', 'file_name': 'YVPpZ2PYgb9l0BrdmQYzR.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:12:09,603] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_171209_510.png
+[2025-11-21 17:12:09,604] INFO: 文件将保存为: design_image/cropped_20251121_171209_510.png
+[2025-11-21 17:12:09,938] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171209_510.png
+[2025-11-21 17:12:09,939] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171209_510.png
+[2025-11-21 17:12:20,315] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_171220_298.png
+[2025-11-21 17:12:20,315] INFO: 文件将保存为: design_image/cropped_20251121_171220_298.png
+[2025-11-21 17:12:20,461] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171220_298.png
+[2025-11-21 17:12:20,462] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171220_298.png
+[2025-11-21 17:12:36,098] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/T8R_8MS400tzn0YopAnz3.png', 'content_type': 'image/png', 'file_name': 'T8R_8MS400tzn0YopAnz3.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:12:38,390] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_171238_241.png
+[2025-11-21 17:12:38,390] INFO: 文件将保存为: design_image/cropped_20251121_171238_241.png
+[2025-11-21 17:12:38,826] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171238_241.png
+[2025-11-21 17:12:38,827] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_171238_241.png
+[2025-11-21 17:35:01,205] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173500_692.png
+[2025-11-21 17:35:01,205] INFO: 文件将保存为: design_image/cropped_20251121_173500_692.png
+[2025-11-21 17:35:03,749] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173500_692.png
+[2025-11-21 17:35:03,750] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173500_692.png
+[2025-11-21 17:35:22,016] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/UpAcu9CCZ2OnfMf3wwUcF.png', 'content_type': 'image/png', 'file_name': 'UpAcu9CCZ2OnfMf3wwUcF.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:35:24,977] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173524_564.png
+[2025-11-21 17:35:24,977] INFO: 文件将保存为: design_image/cropped_20251121_173524_564.png
+[2025-11-21 17:35:25,883] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173524_564.png
+[2025-11-21 17:35:25,884] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173524_564.png
+[2025-11-21 17:37:30,880] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173730_333.png
+[2025-11-21 17:37:30,880] INFO: 文件将保存为: design_image/cropped_20251121_173730_333.png
+[2025-11-21 17:37:31,865] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173730_333.png
+[2025-11-21 17:37:31,867] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173730_333.png
+[2025-11-21 17:37:52,568] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/zebra/gqmQD4q4-1OJTAPHF-DvT.png', 'content_type': 'image/png', 'file_name': 'gqmQD4q4-1OJTAPHF-DvT.png', 'file_size': None, 'width': None, 'height': None}, {'url': 'https://v3b.fal.media/files/b/rabbit/7tzcjIaX4eQ0D7VOv8TZy.png', 'content_type': 'image/png', 'file_name': '7tzcjIaX4eQ0D7VOv8TZy.png', 'file_size': None, 'width': None, 'height': None}], 'description': '`\n`'}
+[2025-11-21 17:37:54,553] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173754_437.png
+[2025-11-21 17:37:54,553] INFO: 文件将保存为: design_image/cropped_20251121_173754_437.png
+[2025-11-21 17:37:54,947] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173754_437.png
+[2025-11-21 17:37:54,948] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173754_437.png
+[2025-11-21 17:38:52,167] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173851_626.png
+[2025-11-21 17:38:52,167] INFO: 文件将保存为: design_image/cropped_20251121_173851_626.png
+[2025-11-21 17:38:53,182] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173851_626.png
+[2025-11-21 17:38:53,184] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173851_626.png
+[2025-11-21 17:39:06,001] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/mjM1CY5L1zcFa5ZvFT7bn.png', 'content_type': 'image/png', 'file_name': 'mjM1CY5L1zcFa5ZvFT7bn.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,请看这条裤子的线稿版型图:\n '}
+[2025-11-21 17:39:08,061] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_173907_990.png
+[2025-11-21 17:39:08,062] INFO: 文件将保存为: design_image/cropped_20251121_173907_990.png
+[2025-11-21 17:39:08,407] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173907_990.png
+[2025-11-21 17:39:08,409] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_173907_990.png
+[2025-11-21 17:40:20,254] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_174019_714.png
+[2025-11-21 17:40:20,254] INFO: 文件将保存为: design_image/cropped_20251121_174019_714.png
+[2025-11-21 17:40:21,245] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174019_714.png
+[2025-11-21 17:40:21,246] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174019_714.png
+[2025-11-21 17:40:42,267] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/koala/3K7adQDbjrMTKdpq2ZGXw.png', 'content_type': 'image/png', 'file_name': '3K7adQDbjrMTKdpq2ZGXw.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/47bcc47f459154d10b12078498759dc84929b298732333567d851642d75d9362?w=1056&h=992'}
+[2025-11-21 17:40:44,278] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_174044_157.png
+[2025-11-21 17:40:44,278] INFO: 文件将保存为: design_image/cropped_20251121_174044_157.png
+[2025-11-21 17:40:44,661] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174044_157.png
+[2025-11-21 17:40:44,662] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174044_157.png
+[2025-11-21 17:41:34,761] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_174132_674.png
+[2025-11-21 17:41:34,761] INFO: 文件将保存为: design_image/cropped_20251121_174132_674.png
+[2025-11-21 17:41:42,769] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174132_674.png
+[2025-11-21 17:41:42,770] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174132_674.png
+[2025-11-21 17:42:04,298] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/jEH6cyH3H7moy-uyYJo-R.png', 'content_type': 'image/png', 'file_name': 'jEH6cyH3H7moy-uyYJo-R.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\ngenerated_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/1bb3996cf79405058ad0cc7e16baaa1d3395cc0c3b59c9fd8b5cf85195f4ae30?w=864&h=1184'}
+[2025-11-21 17:42:06,056] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_174205_989.png
+[2025-11-21 17:42:06,056] INFO: 文件将保存为: design_image/cropped_20251121_174205_989.png
+[2025-11-21 17:42:06,374] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174205_989.png
+[2025-11-21 17:42:06,375] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_174205_989.png
+[2025-11-21 17:53:33,028] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_175332_630.png
+[2025-11-21 17:53:33,029] INFO: 文件将保存为: design_image/cropped_20251121_175332_630.png
+[2025-11-21 17:53:35,409] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175332_630.png
+[2025-11-21 17:53:35,410] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175332_630.png
+[2025-11-21 17:53:48,791] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/kangaroo/1E-S55e0i3RZ1ipe9Y5D7.png', 'content_type': 'image/png', 'file_name': '1E-S55e0i3RZ1ipe9Y5D7.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:53:51,053] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_175350_930.png
+[2025-11-21 17:53:51,054] INFO: 文件将保存为: design_image/cropped_20251121_175350_930.png
+[2025-11-21 17:53:51,490] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175350_930.png
+[2025-11-21 17:53:51,491] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175350_930.png
+[2025-11-21 17:55:43,747] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_175543_292.png
+[2025-11-21 17:55:43,747] INFO: 文件将保存为: design_image/cropped_20251121_175543_292.png
+[2025-11-21 17:55:45,503] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175543_292.png
+[2025-11-21 17:55:45,504] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175543_292.png
+[2025-11-21 17:56:17,705] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/PSw_9T6hvNTI1eXeUlpGv.png', 'content_type': 'image/png', 'file_name': 'PSw_9T6hvNTI1eXeUlpGv.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-21 17:56:19,680] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251121_175619_607.png
+[2025-11-21 17:56:19,681] INFO: 文件将保存为: design_image/cropped_20251121_175619_607.png
+[2025-11-21 17:56:20,014] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175619_607.png
+[2025-11-21 17:56:20,016] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_175619_607.png
+[2025-11-24 09:11:12,141] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091112_123.png
+[2025-11-24 09:11:12,142] INFO: 文件将保存为: design_image/cropped_20251124_091112_123.png
+[2025-11-24 09:11:12,398] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091112_123.png
+[2025-11-24 09:11:12,400] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091112_123.png
+[2025-11-24 09:11:12,428] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091112_403.png
+[2025-11-24 09:11:12,428] INFO: 文件将保存为: design_image/cropped_20251124_091112_403.png
+[2025-11-24 09:11:12,584] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091112_403.png
+[2025-11-24 09:11:12,585] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091112_403.png
+[2025-11-24 09:11:41,510] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/dcX6-UgWU0ckw_EhMWo2g.png', 'content_type': 'image/png', 'file_name': 'dcX6-UgWU0ckw_EhMWo2g.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\n12_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/89b9ed06e7196aec6af1f02d86b8c8ac87d6451f23d736954b1c821bd3c9b265?w=1408&h=736'}
+[2025-11-24 09:11:43,364] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091143_315.png
+[2025-11-24 09:11:43,364] INFO: 文件将保存为: design_image/cropped_20251124_091143_315.png
+[2025-11-24 09:11:43,600] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091143_315.png
+[2025-11-24 09:11:43,602] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091143_315.png
+[2025-11-24 09:12:30,892] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091230_874.png
+[2025-11-24 09:12:30,893] INFO: 文件将保存为: design_image/cropped_20251124_091230_874.png
+[2025-11-24 09:12:31,116] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091230_874.png
+[2025-11-24 09:12:31,117] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091230_874.png
+[2025-11-24 09:12:31,151] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091231_121.png
+[2025-11-24 09:12:31,152] INFO: 文件将保存为: design_image/cropped_20251124_091231_121.png
+[2025-11-24 09:12:31,291] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091231_121.png
+[2025-11-24 09:12:31,292] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091231_121.png
+[2025-11-24 09:12:49,748] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/4oeLhFrRJ0QaLpAWEQ1y7.png', 'content_type': 'image/png', 'file_name': '4oeLhFrRJ0QaLpAWEQ1y7.png', 'file_size': None, 'width': None, 'height': None}], 'description': '\n1_image_1\n\n\nhttps://pfst.cf2.poecdn.net/base/image/8e572937e7b638f41dd2fa7c71a9cd70619435c8ad82f4713a7e25bd455d362c?w=768&h=1344'}
+[2025-11-24 09:12:53,093] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_091252_878.png
+[2025-11-24 09:12:53,094] INFO: 文件将保存为: design_image/cropped_20251124_091252_878.png
+[2025-11-24 09:12:55,032] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091252_878.png
+[2025-11-24 09:12:55,033] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_091252_878.png
+[2025-11-24 09:21:40,867] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092140_848.png
+[2025-11-24 09:21:40,867] INFO: 文件将保存为: design_image/cropped_20251124_092140_848.png
+[2025-11-24 09:21:41,083] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092140_848.png
+[2025-11-24 09:21:41,084] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092140_848.png
+[2025-11-24 09:21:41,111] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092141_087.png
+[2025-11-24 09:21:41,112] INFO: 文件将保存为: design_image/cropped_20251124_092141_087.png
+[2025-11-24 09:21:41,289] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092141_087.png
+[2025-11-24 09:21:41,290] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092141_087.png
+[2025-11-24 09:21:57,317] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/z9f2DTmCu3DvgL_JXLhET.png', 'content_type': 'image/png', 'file_name': 'z9f2DTmCu3DvgL_JXLhET.png', 'file_size': None, 'width': None, 'height': None}], 'description': '好的,这是图1这条裤子的平铺精修图,白色背景,去除了颜色、褶皱和非裤子元素,并保持了原比例和纽扣数量。\n'}
+[2025-11-24 09:22:00,152] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092159_928.png
+[2025-11-24 09:22:00,152] INFO: 文件将保存为: design_image/cropped_20251124_092159_928.png
+[2025-11-24 09:22:00,992] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092159_928.png
+[2025-11-24 09:22:00,993] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092159_928.png
+[2025-11-24 09:23:25,001] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092324_982.png
+[2025-11-24 09:23:25,001] INFO: 文件将保存为: design_image/cropped_20251124_092324_982.png
+[2025-11-24 09:23:25,195] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092324_982.png
+[2025-11-24 09:23:25,197] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092324_982.png
+[2025-11-24 09:23:25,225] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092325_199.png
+[2025-11-24 09:23:25,225] INFO: 文件将保存为: design_image/cropped_20251124_092325_199.png
+[2025-11-24 09:23:25,386] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092325_199.png
+[2025-11-24 09:23:25,387] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092325_199.png
+[2025-11-24 09:23:37,882] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/rabbit/wg8kGCrbfnao6Dvk6w3Ka.png', 'content_type': 'image/png', 'file_name': 'wg8kGCrbfnao6Dvk6w3Ka.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-24 09:23:40,495] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092340_264.png
+[2025-11-24 09:23:40,495] INFO: 文件将保存为: design_image/cropped_20251124_092340_264.png
+[2025-11-24 09:23:41,461] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092340_264.png
+[2025-11-24 09:23:41,463] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092340_264.png
+[2025-11-24 09:26:17,885] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092617_867.png
+[2025-11-24 09:26:17,886] INFO: 文件将保存为: design_image/cropped_20251124_092617_867.png
+[2025-11-24 09:26:18,156] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092617_867.png
+[2025-11-24 09:26:18,157] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092617_867.png
+[2025-11-24 09:26:18,184] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092618_160.png
+[2025-11-24 09:26:18,184] INFO: 文件将保存为: design_image/cropped_20251124_092618_160.png
+[2025-11-24 09:26:18,336] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092618_160.png
+[2025-11-24 09:26:18,338] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092618_160.png
+[2025-11-24 09:26:45,561] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/lion/Su9cQ8XSmMAm15DeJgc29.png', 'content_type': 'image/png', 'file_name': 'Su9cQ8XSmMAm15DeJgc29.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-24 09:26:48,772] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_092648_607.png
+[2025-11-24 09:26:48,773] INFO: 文件将保存为: design_image/cropped_20251124_092648_607.png
+[2025-11-24 09:26:50,293] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092648_607.png
+[2025-11-24 09:26:50,294] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_092648_607.png
+[2025-11-24 09:38:31,737] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_093831_719.png
+[2025-11-24 09:38:31,738] INFO: 文件将保存为: design_image/cropped_20251124_093831_719.png
+[2025-11-24 09:38:31,974] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093831_719.png
+[2025-11-24 09:38:31,975] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093831_719.png
+[2025-11-24 09:38:32,001] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_093831_977.png
+[2025-11-24 09:38:32,002] INFO: 文件将保存为: design_image/cropped_20251124_093831_977.png
+[2025-11-24 09:38:32,188] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093831_977.png
+[2025-11-24 09:38:32,190] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093831_977.png
+[2025-11-24 09:38:56,145] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/panda/b9mG4yYAVbIF-eq064tb0.png', 'content_type': 'image/png', 'file_name': 'b9mG4yYAVbIF-eq064tb0.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-24 09:38:57,938] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_093857_881.png
+[2025-11-24 09:38:57,939] INFO: 文件将保存为: design_image/cropped_20251124_093857_881.png
+[2025-11-24 09:38:58,226] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093857_881.png
+[2025-11-24 09:38:58,228] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_093857_881.png
+[2025-11-24 12:01:00,645] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120100_626.png
+[2025-11-24 12:01:00,645] INFO: 文件将保存为: design_image/cropped_20251124_120100_626.png
+[2025-11-24 12:01:00,887] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120100_626.png
+[2025-11-24 12:01:00,888] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120100_626.png
+[2025-11-24 12:01:00,920] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120100_892.png
+[2025-11-24 12:01:00,920] INFO: 文件将保存为: design_image/cropped_20251124_120100_892.png
+[2025-11-24 12:01:01,070] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120100_892.png
+[2025-11-24 12:01:01,071] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120100_892.png
+[2025-11-24 12:01:33,243] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/monkey/R1qZ00pPsYzKozVnU5E_g.png', 'content_type': 'image/png', 'file_name': 'R1qZ00pPsYzKozVnU5E_g.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-24 12:01:37,930] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120137_167.png
+[2025-11-24 12:01:37,931] INFO: 文件将保存为: design_image/cropped_20251124_120137_167.png
+[2025-11-24 12:01:39,773] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120137_167.png
+[2025-11-24 12:01:39,774] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120137_167.png
+[2025-11-24 12:02:23,807] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120223_788.png
+[2025-11-24 12:02:23,807] INFO: 文件将保存为: design_image/cropped_20251124_120223_788.png
+[2025-11-24 12:02:24,008] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120223_788.png
+[2025-11-24 12:02:24,009] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120223_788.png
+[2025-11-24 12:02:24,036] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120224_012.png
+[2025-11-24 12:02:24,036] INFO: 文件将保存为: design_image/cropped_20251124_120224_012.png
+[2025-11-24 12:02:24,179] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120224_012.png
+[2025-11-24 12:02:24,180] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120224_012.png
+[2025-11-24 12:03:00,093] INFO: FAL图生图的结果: {'images': [{'url': 'https://v3b.fal.media/files/b/tiger/C4Rpj_RUDvHJmtZts4zwn.png', 'content_type': 'image/png', 'file_name': 'C4Rpj_RUDvHJmtZts4zwn.png', 'file_size': None, 'width': None, 'height': None}], 'description': ''}
+[2025-11-24 12:03:04,767] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_120303_752.png
+[2025-11-24 12:03:04,767] INFO: 文件将保存为: design_image/cropped_20251124_120303_752.png
+[2025-11-24 12:03:06,725] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120303_752.png
+[2025-11-24 12:03:06,726] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_120303_752.png
+[2025-11-24 13:05:17,778] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130517_759.png
+[2025-11-24 13:05:17,778] INFO: 文件将保存为: design_image/cropped_20251124_130517_759.png
+[2025-11-24 13:05:17,976] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130517_759.png
+[2025-11-24 13:05:17,977] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130517_759.png
+[2025-11-24 13:05:18,005] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130517_980.png
+[2025-11-24 13:05:18,005] INFO: 文件将保存为: design_image/cropped_20251124_130517_980.png
+[2025-11-24 13:05:18,166] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130517_980.png
+[2025-11-24 13:05:18,168] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130517_980.png
+[2025-11-24 13:05:19,003] ERROR: FAL图生图接口的报错: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+Traceback (most recent call last):
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 499, in _raise_for_status
+    response.raise_for_status()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\httpx\_models.py", line 829, in raise_for_status
+    raise HTTPStatusError(message, request=request, response=self)
+httpx.HTTPStatusError: Client error '403 Forbidden' for url 'https://queue.fal.run/fal-ai/nano-banana-pro/edit'
+For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\线稿图\fal.py", line 33, in fal_edit_images
+    result = fal_client.subscribe(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1210, in subscribe
+    handle = self.submit(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1179, in submit
+    response = _maybe_retry_request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 666, in _maybe_retry_request
+    return _request(client, method, url, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 612, in _request
+    _raise_for_status(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 506, in _raise_for_status
+    raise FalClientError(msg) from exc
+fal_client.client.FalClientError: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+[2025-11-24 13:07:27,393] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130727_374.png
+[2025-11-24 13:07:27,393] INFO: 文件将保存为: design_image/cropped_20251124_130727_374.png
+[2025-11-24 13:07:27,583] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130727_374.png
+[2025-11-24 13:07:27,584] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130727_374.png
+[2025-11-24 13:07:27,612] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130727_587.png
+[2025-11-24 13:07:27,612] INFO: 文件将保存为: design_image/cropped_20251124_130727_587.png
+[2025-11-24 13:07:27,782] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130727_587.png
+[2025-11-24 13:07:27,783] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130727_587.png
+[2025-11-24 13:07:28,562] ERROR: FAL图生图接口的报错: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+Traceback (most recent call last):
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 499, in _raise_for_status
+    response.raise_for_status()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\httpx\_models.py", line 829, in raise_for_status
+    raise HTTPStatusError(message, request=request, response=self)
+httpx.HTTPStatusError: Client error '403 Forbidden' for url 'https://queue.fal.run/fal-ai/nano-banana-pro/edit'
+For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\线稿图\fal.py", line 33, in fal_edit_images
+    result = fal_client.subscribe(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1210, in subscribe
+    handle = self.submit(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1179, in submit
+    response = _maybe_retry_request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 666, in _maybe_retry_request
+    return _request(client, method, url, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 612, in _request
+    _raise_for_status(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 506, in _raise_for_status
+    raise FalClientError(msg) from exc
+fal_client.client.FalClientError: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+[2025-11-24 13:07:41,652] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130741_633.png
+[2025-11-24 13:07:41,652] INFO: 文件将保存为: design_image/cropped_20251124_130741_633.png
+[2025-11-24 13:07:41,829] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130741_633.png
+[2025-11-24 13:07:41,830] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130741_633.png
+[2025-11-24 13:07:41,859] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_130741_834.png
+[2025-11-24 13:07:41,860] INFO: 文件将保存为: design_image/cropped_20251124_130741_834.png
+[2025-11-24 13:07:42,076] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130741_834.png
+[2025-11-24 13:07:42,078] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_130741_834.png
+[2025-11-24 13:07:42,865] ERROR: FAL图生图接口的报错: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+Traceback (most recent call last):
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 499, in _raise_for_status
+    response.raise_for_status()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\httpx\_models.py", line 829, in raise_for_status
+    raise HTTPStatusError(message, request=request, response=self)
+httpx.HTTPStatusError: Client error '403 Forbidden' for url 'https://queue.fal.run/fal-ai/nano-banana-pro/edit'
+For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+  File "d:\线稿图\fal.py", line 33, in fal_edit_images
+    result = fal_client.subscribe(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1210, in subscribe
+    handle = self.submit(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 1179, in submit
+    response = _maybe_retry_request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 666, in _maybe_retry_request
+    return _request(client, method, url, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 612, in _request
+    _raise_for_status(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\fal_client\client.py", line 506, in _raise_for_status
+    raise FalClientError(msg) from exc
+fal_client.client.FalClientError: User is locked. Reason: Exhausted balance. Top up your balance at fal.ai/dashboard/billing.
+[2025-11-24 18:29:30,869] ERROR: Gemini图生图接口的报错: 524 None. {'error': {'message': '', 'type': 'rix_api_error', 'param': '', 'code': 'bad_response_status_code'}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 129, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 133, in raise_error
+    raise ServerError(status_code, response_json, response)
+google.genai.errors.ServerError: 524 None. {'error': {'message': '', 'type': 'rix_api_error', 'param': '', 'code': 'bad_response_status_code'}}
+[2025-11-24 18:35:12,580] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_183512_029.png
+[2025-11-24 18:35:12,580] INFO: 文件将保存为: design_image/cropped_20251124_183512_029.png
+[2025-11-24 18:35:14,109] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183512_029.png
+[2025-11-24 18:35:14,110] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183512_029.png
+[2025-11-24 18:35:14,110] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183512_029.png
+[2025-11-24 18:37:32,203] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_183731_648.png
+[2025-11-24 18:37:32,203] INFO: 文件将保存为: design_image/cropped_20251124_183731_648.png
+[2025-11-24 18:37:34,062] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183731_648.png
+[2025-11-24 18:37:34,064] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183731_648.png
+[2025-11-24 18:37:34,064] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183731_648.png
+[2025-11-24 18:39:27,245] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_183926_045.png
+[2025-11-24 18:39:27,245] INFO: 文件将保存为: design_image/cropped_20251124_183926_045.png
+[2025-11-24 18:39:29,363] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183926_045.png
+[2025-11-24 18:39:29,365] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183926_045.png
+[2025-11-24 18:39:29,365] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_183926_045.png
+[2025-11-24 18:41:28,233] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_184127_460.png
+[2025-11-24 18:41:28,234] INFO: 文件将保存为: design_image/cropped_20251124_184127_460.png
+[2025-11-24 18:41:29,925] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_184127_460.png
+[2025-11-24 18:41:29,926] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_184127_460.png
+[2025-11-24 18:41:29,927] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_184127_460.png
+[2025-11-24 18:42:16,301] ERROR: Gemini图生图接口的报错: 403 None. {'error': {'message': '预扣费额度失败, 用户剩余额度: $0.363730, 需要预扣费额度: $1.000000 (request id: 20251124184102102020232KZJh1VTZ)', 'type': 'rix_api_error', 'param': '', 'code': 'insufficient_user_quota'}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 129, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 131, in raise_error
+    raise ClientError(status_code, response_json, response)
+google.genai.errors.ClientError: 403 None. {'error': {'message': '预扣费额度失败, 用户剩余额度: $0.363730, 需要预扣费额度: $1.000000 (request id: 20251124184102102020232KZJh1VTZ)', 'type': 'rix_api_error', 'param': '', 'code': 'insufficient_user_quota'}}
+[2025-11-24 18:47:05,291] ERROR: Gemini图生图接口的报错: 404 None. {'error': {'message': 'Invalid URL (POST /v1/v1beta/models/gemini-3-pro-image-preview:generateContent)', 'type': 'invalid_request_error', 'param': '', 'code': ''}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 130, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 131, in raise_error
+    raise ClientError(status_code, response_json, response)
+google.genai.errors.ClientError: 404 None. {'error': {'message': 'Invalid URL (POST /v1/v1beta/models/gemini-3-pro-image-preview:generateContent)', 'type': 'invalid_request_error', 'param': '', 'code': ''}}
+[2025-11-24 18:50:25,417] ERROR: Gemini图生图接口的报错: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 imagen-3.0-generate-002 无可用渠道(distributor) (request id: 20251124185025416402761Y42zlRQB)', 'type': 'new_api_error'}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 130, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 133, in raise_error
+    raise ServerError(status_code, response_json, response)
+google.genai.errors.ServerError: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 imagen-3.0-generate-002 无可用渠道(distributor) (request id: 20251124185025416402761Y42zlRQB)', 'type': 'new_api_error'}}
+[2025-11-24 18:52:36,394] ERROR: Gemini图生图接口的报错: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 imagen-4.0-generate-001 无可用渠道(distributor) (request id: 20251124185236394873344KtxBKMEb)', 'type': 'new_api_error'}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 130, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 133, in raise_error
+    raise ServerError(status_code, response_json, response)
+google.genai.errors.ServerError: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 imagen-4.0-generate-001 无可用渠道(distributor) (request id: 20251124185236394873344KtxBKMEb)', 'type': 'new_api_error'}}
+[2025-11-24 18:53:09,141] ERROR: Gemini图生图接口的报错: 404 None. {'error': {'message': 'Invalid URL (POST /v1/images/generations/v1beta/models/gemini-3-pro-image-preview:generateContent)', 'type': 'invalid_request_error', 'param': '', 'code': ''}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 130, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 131, in raise_error
+    raise ClientError(status_code, response_json, response)
+google.genai.errors.ClientError: 404 None. {'error': {'message': 'Invalid URL (POST /v1/images/generations/v1beta/models/gemini-3-pro-image-preview:generateContent)', 'type': 'invalid_request_error', 'param': '', 'code': ''}}
+[2025-11-24 18:57:13,319] ERROR: Gemini图生图接口的报错: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 gemini-3-pro-image-preview 无可用渠道(distributor) (request id: 20251124185713304792334sEBWdFTq)', 'type': 'new_api_error'}}
+Traceback (most recent call last):
+  File "d:\线稿图\banana.py", line 130, in generate_image_from_image
+    response = _get_client().models.generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 5218, in generate_content
+    response = self._generate_content(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\models.py", line 4000, in _generate_content
+    response = self._api_client.request(
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1388, in request
+    response = self._request(http_request, http_options, stream=False)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1224, in _request
+    return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 475, in __call__
+    do = self.iter(retry_state=retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 376, in iter
+    result = action(retry_state)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 418, in exc_check
+    raise retry_exc.reraise()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 185, in reraise
+    raise self.last_attempt.result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 451, in result
+    return self.__get_result()
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\concurrent\futures\_base.py", line 403, in __get_result
+    raise self._exception
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\tenacity\__init__.py", line 478, in __call__
+    result = fn(*args, **kwargs)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\_api_client.py", line 1201, in _request_once
+    errors.APIError.raise_for_response(response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 106, in raise_for_response
+    cls.raise_error(response.status_code, response_json, response)
+  File "C:\Users\PC\anaconda3\envs\image_cv\lib\site-packages\google\genai\errors.py", line 133, in raise_error
+    raise ServerError(status_code, response_json, response)
+google.genai.errors.ServerError: 503 None. {'error': {'code': 'model_not_found', 'message': '分组 OAI-A3 下模型 gemini-3-pro-image-preview 无可用渠道(distributor) (request id: 20251124185713304792334sEBWdFTq)', 'type': 'new_api_error'}}
+[2025-11-24 19:03:03,770] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_190303_360.png
+[2025-11-24 19:03:03,770] INFO: 文件将保存为: design_image/cropped_20251124_190303_360.png
+[2025-11-24 19:03:04,953] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_190303_360.png
+[2025-11-24 19:03:04,955] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_190303_360.png
+[2025-11-24 19:03:04,955] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_190303_360.png
+[2025-11-24 19:10:47,193] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_191045_799.png
+[2025-11-24 19:10:47,193] INFO: 文件将保存为: design_image/cropped_20251124_191045_799.png
+[2025-11-24 19:10:49,588] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191045_799.png
+[2025-11-24 19:10:49,590] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191045_799.png
+[2025-11-24 19:10:49,590] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191045_799.png
+[2025-11-24 19:18:56,533] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_191855_668.png
+[2025-11-24 19:18:56,534] INFO: 文件将保存为: design_image/cropped_20251124_191855_668.png
+[2025-11-24 19:18:58,445] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191855_668.png
+[2025-11-24 19:18:58,447] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191855_668.png
+[2025-11-24 19:18:58,447] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_191855_668.png
+[2025-11-24 19:22:11,199] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_192210_341.png
+[2025-11-24 19:22:11,200] INFO: 文件将保存为: design_image/cropped_20251124_192210_341.png
+[2025-11-24 19:22:13,048] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_192210_341.png
+[2025-11-24 19:22:13,049] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_192210_341.png
+[2025-11-24 19:22:13,049] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_192210_341.png
+[2025-11-24 19:35:25,047] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251124_193524_244.png
+[2025-11-24 19:35:25,047] INFO: 文件将保存为: design_image/cropped_20251124_193524_244.png
+[2025-11-24 19:35:26,842] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_193524_244.png
+[2025-11-24 19:35:26,843] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_193524_244.png
+[2025-11-24 19:35:26,843] INFO: Gemini图生图接口上传后的结果: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251124_193524_244.png
+[2025-11-25 10:08:57,867] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_100856_536.png
+[2025-11-25 10:08:57,867] INFO: 文件将保存为: design_image/cropped_20251125_100856_536.png
+[2025-11-25 10:09:02,912] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100856_536.png
+[2025-11-25 10:09:02,913] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100856_536.png
+[2025-11-25 10:09:03,115] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_100902_942.png
+[2025-11-25 10:09:03,115] INFO: 文件将保存为: design_image/cropped_20251125_100902_942.png
+[2025-11-25 10:09:03,974] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100902_942.png
+[2025-11-25 10:09:03,975] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100902_942.png
+[2025-11-25 10:09:04,053] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_100903_990.png
+[2025-11-25 10:09:04,053] INFO: 文件将保存为: design_image/cropped_20251125_100903_990.png
+[2025-11-25 10:09:04,363] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100903_990.png
+[2025-11-25 10:09:04,364] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100903_990.png
+[2025-11-25 10:09:04,396] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_100904_370.png
+[2025-11-25 10:09:04,397] INFO: 文件将保存为: design_image/cropped_20251125_100904_370.png
+[2025-11-25 10:09:04,591] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100904_370.png
+[2025-11-25 10:09:04,593] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100904_370.png
+[2025-11-25 10:09:04,617] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_100904_596.png
+[2025-11-25 10:09:04,617] INFO: 文件将保存为: design_image/cropped_20251125_100904_596.png
+[2025-11-25 10:09:04,780] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100904_596.png
+[2025-11-25 10:09:04,782] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_100904_596.png
+[2025-11-25 10:11:00,794] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101059_454.png
+[2025-11-25 10:11:00,794] INFO: 文件将保存为: design_image/cropped_20251125_101059_454.png
+[2025-11-25 10:11:05,305] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101059_454.png
+[2025-11-25 10:11:05,307] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101059_454.png
+[2025-11-25 10:11:05,515] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101105_340.png
+[2025-11-25 10:11:05,515] INFO: 文件将保存为: design_image/cropped_20251125_101105_340.png
+[2025-11-25 10:11:06,391] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101105_340.png
+[2025-11-25 10:11:06,392] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101105_340.png
+[2025-11-25 10:11:06,452] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101106_401.png
+[2025-11-25 10:11:06,452] INFO: 文件将保存为: design_image/cropped_20251125_101106_401.png
+[2025-11-25 10:11:06,806] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101106_401.png
+[2025-11-25 10:11:06,807] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101106_401.png
+[2025-11-25 10:11:06,840] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101106_810.png
+[2025-11-25 10:11:06,840] INFO: 文件将保存为: design_image/cropped_20251125_101106_810.png
+[2025-11-25 10:11:07,011] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101106_810.png
+[2025-11-25 10:11:07,012] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101106_810.png
+[2025-11-25 10:11:07,044] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101107_014.png
+[2025-11-25 10:11:07,044] INFO: 文件将保存为: design_image/cropped_20251125_101107_014.png
+[2025-11-25 10:11:07,243] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101107_014.png
+[2025-11-25 10:11:07,245] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101107_014.png
+[2025-11-25 10:12:14,863] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101213_550.png
+[2025-11-25 10:12:14,864] INFO: 文件将保存为: design_image/cropped_20251125_101213_550.png
+[2025-11-25 10:12:18,497] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101213_550.png
+[2025-11-25 10:12:18,498] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101213_550.png
+[2025-11-25 10:12:18,695] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101218_522.png
+[2025-11-25 10:12:18,695] INFO: 文件将保存为: design_image/cropped_20251125_101218_522.png
+[2025-11-25 10:12:19,541] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101218_522.png
+[2025-11-25 10:12:19,542] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101218_522.png
+[2025-11-25 10:12:19,598] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101219_551.png
+[2025-11-25 10:12:19,599] INFO: 文件将保存为: design_image/cropped_20251125_101219_551.png
+[2025-11-25 10:12:19,939] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101219_551.png
+[2025-11-25 10:12:19,940] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101219_551.png
+[2025-11-25 10:12:19,978] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101219_942.png
+[2025-11-25 10:12:19,978] INFO: 文件将保存为: design_image/cropped_20251125_101219_942.png
+[2025-11-25 10:12:20,135] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101219_942.png
+[2025-11-25 10:12:20,136] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101219_942.png
+[2025-11-25 10:12:20,156] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101220_137.png
+[2025-11-25 10:12:20,156] INFO: 文件将保存为: design_image/cropped_20251125_101220_137.png
+[2025-11-25 10:12:20,316] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101220_137.png
+[2025-11-25 10:12:20,317] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101220_137.png
+[2025-11-25 10:13:56,218] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101354_882.png
+[2025-11-25 10:13:56,218] INFO: 文件将保存为: design_image/cropped_20251125_101354_882.png
+[2025-11-25 10:13:59,877] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101354_882.png
+[2025-11-25 10:13:59,878] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101354_882.png
+[2025-11-25 10:14:00,082] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101359_902.png
+[2025-11-25 10:14:00,082] INFO: 文件将保存为: design_image/cropped_20251125_101359_902.png
+[2025-11-25 10:14:01,492] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101359_902.png
+[2025-11-25 10:14:01,493] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101359_902.png
+[2025-11-25 10:14:01,555] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101401_502.png
+[2025-11-25 10:14:01,555] INFO: 文件将保存为: design_image/cropped_20251125_101401_502.png
+[2025-11-25 10:14:02,219] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101401_502.png
+[2025-11-25 10:14:02,221] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101401_502.png
+[2025-11-25 10:14:02,260] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101402_224.png
+[2025-11-25 10:14:02,261] INFO: 文件将保存为: design_image/cropped_20251125_101402_224.png
+[2025-11-25 10:14:02,477] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_224.png
+[2025-11-25 10:14:02,478] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_224.png
+[2025-11-25 10:14:02,510] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101402_483.png
+[2025-11-25 10:14:02,511] INFO: 文件将保存为: design_image/cropped_20251125_101402_483.png
+[2025-11-25 10:14:02,800] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_483.png
+[2025-11-25 10:14:02,801] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_483.png
+[2025-11-25 10:14:02,822] INFO: 开始上传文件: d:\线稿图\temp\cropped_20251125_101402_803.png
+[2025-11-25 10:14:02,822] INFO: 文件将保存为: design_image/cropped_20251125_101402_803.png
+[2025-11-25 10:14:03,017] INFO: 文件上传成功,访问URL: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_803.png
+[2025-11-25 10:14:03,018] INFO: 上传图片成功: https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251125_101402_803.png

+ 374 - 0
main.py

@@ -0,0 +1,374 @@
+from typing import List, Optional,Any
+from datetime import datetime
+import requests
+import os
+from PIL import Image
+import io
+from fastapi import FastAPI
+from fastapi.middleware.cors import CORSMiddleware
+from pydantic import BaseModel, Field
+# import fal_client
+from scr.check import process_image_pair_with_gemini
+from scr.conf import size_dict,check_prompt
+from scr.upload_tos import process_cropped_upload
+from scr.gemini_client_request import call_gemini_generate_image, call_gemini_generate_image_from_images
+from scr.utils.image_io import pil_to_png_bytes
+from scr.llm import llm_request
+from scr.logger_setup import logger
+from scr.sketch import generate_sketch 
+from dotenv import load_dotenv
+
+load_dotenv()
+
+# FAL API 配置
+FAL_KEY = os.getenv("FAL_KEY")
+if FAL_KEY:
+    os.environ["FAL_KEY"] = FAL_KEY
+else:
+    logger.warning("FAL_KEY 未在环境变量中设置,相关功能可能不可用")
+
+# LLM 配置 - 用于指令优化
+LLM_API_KEY = os.getenv("LLM_API_KEY")
+LLM_BASE_URL = os.getenv("LLM_BASE_URL", "https://dashscope.aliyuncs.com/compatible-mode/v1")
+LLM_MODEL = os.getenv("LLM_MODEL", "qwen-vl-max-latest")
+
+if not LLM_API_KEY:
+    logger.warning("LLM_API_KEY 未在环境变量中设置,指令优化功能不可用")
+
+
+app = FastAPI(title="Nano Banana Image Service", version="1.0.0")
+
+app.add_middleware(
+    CORSMiddleware,
+    allow_origins=["*"],
+    allow_credentials=True,
+    allow_methods=["*"],
+    allow_headers=["*"],
+)
+
+
+class EditImageRequest(BaseModel):
+    prompt: str = Field(..., description="用于编辑图像的提示词")
+    image_urls: List[str] = Field(..., description="用于编辑的原始图像URL列表")
+    ratio: Optional[tuple[int, int]] = Field(None, description="编辑比例(例如 '16:9',可选)")
+    image_size: Optional[tuple[int, int]] = Field(None, description="图像大小(可选)")
+# class EditImageRequest(BaseModel):
+#     prompt: str = Field(..., description="用于编辑图像的提示词")
+#     model_image_urls: List[str] = Field(..., description="需要换装的图像URL列表")
+#     garment_image_urls: List[str] = Field(..., description="用于编辑的原始图像URL列表")
+#     ratio: Optional[tuple[int, int]] = Field(None, description="编辑比例(例如 '16:9',可选)")
+#     image_size: Optional[tuple[int, int]] = Field(None, description="图像大小(可选)")
+
+
+class GenerateImageRequest(BaseModel):
+    prompt: str = Field(..., description="用于文生图的提示词")
+
+
+class GenerateSketchRequest(BaseModel):
+    image: str = Field(..., description="款式图片URL")
+    prompt: Optional[str] = Field("", description="提示词(可选)")
+    auto_mode: Optional[bool] = Field(False, description="是否自动模式(可选)")
+    multi_garment: Optional[bool] = Field(False, description="是否多服装模式(可选)")
+
+
+class OptimizeInstructionRequest(BaseModel):
+    instruction: str = Field(..., description="用户输入的原始编辑指令(中文)")
+    
+
+# 初始化 LLM 实例(用于指令优化)
+llm_optimizer = None
+
+def get_llm_optimizer():
+    """获取或创建 LLM 优化器实例"""
+    global llm_optimizer
+    if llm_optimizer is None:
+        if not LLM_API_KEY:
+            raise RuntimeError("指令优化器不可用:缺少 LLM_API_KEY 环境变量")
+        llm_optimizer = llm_request(LLM_API_KEY, LLM_BASE_URL, LLM_MODEL)
+        logger.info("LLM 指令优化器已初始化")
+    return llm_optimizer
+
+
+# def _on_queue_update(update):
+#     if isinstance(update, fal_client.InProgress):
+#         logs = getattr(update, "logs", None)
+#         if logs:
+#             for log in logs:
+#                 msg = log.get('message')
+#                 logger.info(f"处理中: {msg}")
+
+
+# from typing import Any
+
+# def _extract_first_image_url(result: dict[str, Any]) -> Optional[str]:
+#     if not isinstance(result, dict):
+#         return None
+#     images = result.get("images") or []
+#     if images and isinstance(images, list):
+#         first = images[0]
+#         if isinstance(first, dict):
+#             return first.get("url") or first.get("result_url")
+#     return result.get("url") or result.get("result_url")
+
+
+
+
+@app.get("/health")
+def health():
+    logger.info("health check")
+    return {"status": "ok"}
+
+
+@app.post("/optimize_instruction")
+def optimize_instruction(req: OptimizeInstructionRequest):
+    """
+    优化用户的图片编辑指令
+    将中文描述转换为 Nano Banana 可理解的英文指令,并自动添加细节保留要求
+    """
+    logger.info(f"/optimize_instruction 请求: instruction={req.instruction}")
+    try:
+        # 获取 LLM 优化器
+        optimizer = get_llm_optimizer()
+        
+        # 优化指令
+        optimized = optimizer.optimize_edit_instruction(req.instruction)
+        
+        logger.info(f"/optimize_instruction 优化结果: {optimized}")
+        
+        return {
+            "success": True,
+            "original_instruction": req.instruction,
+            "optimized_instruction": optimized,
+        }
+    except Exception as e:
+        logger.exception("指令优化接口异常")
+        return {
+            "success": False,
+            "error": str(e),
+            "original_instruction": req.instruction
+        }
+
+
+def edit_images_api(
+    prompt: str,
+    image_urls: List[str],
+    aspect_ratio: Optional[List[int]] = None,
+    resolution: str = "1K"
+) -> Optional[Image.Image]:
+    """
+    使用 Gemini API 编辑图片
+    
+    Args:
+        prompt: 编辑提示词
+        image_urls: 图片URL列表
+        aspect_ratio: 宽高比(可选,目前未使用,保留用于兼容)
+        resolution: 分辨率 ("1K" 或 "2K"),目前未使用,保留用于兼容
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    try:
+        logger.info(f"调用 edit_images_api: prompt={prompt[:100]}..., image_count={len(image_urls)}")
+        
+        # 使用 Gemini API 生成/编辑图片
+        pil_image = call_gemini_generate_image_from_images(
+            prompt=prompt,
+            image_urls=image_urls,
+            model="gemini-2.5-flash-image",
+            resolution=resolution
+        )
+        
+        if pil_image is None:
+            logger.error("Gemini API 返回 None")
+            return None
+        
+        # 如果指定了宽高比,可以在这里调整图片尺寸
+        # 注意:Gemini API 本身不支持 aspect_ratio 参数,所以这里只是兼容性处理
+        if aspect_ratio and len(aspect_ratio) == 2:
+            # 可以在这里添加图片尺寸调整逻辑
+            pass
+        
+        return pil_image
+        
+    except Exception as e:
+        logger.error(f"edit_images_api 调用失败: {e}")
+        return None
+
+
+@app.post("/edit_image")
+def edit_image(req: EditImageRequest):
+    logger.info(f"/edit_image 请求: prompt={req.prompt[:200]}...,图片链接:{req.image_urls},图片尺寸:{req.image_size},图片比例:{req.ratio} image_count={len(req.image_urls)}")
+    try:
+        pil_image = None
+        if not req.image_urls:
+            return {"success": False, "error": "图片链接不能为空"}
+
+        if req.image_size:
+            w, h = req.image_size
+            ratio = (w, h)
+            ar = f"{w}x{h}"
+            aspect_ratio = size_dict.get(ar, [1, 1])  # 使用 get 避免 KeyError
+            # 先上传获取URL,用于后续编辑
+         
+            pil_image = edit_images_api(
+                req.prompt,
+                req.image_urls,
+                aspect_ratio=aspect_ratio,
+                resolution="2K"
+            )
+            if pil_image is None:
+                return {"success": False, "error": "编辑图片失败"}
+            pil_image = pil_image.resize(req.image_size)
+            logger.info(f"图片已resize到: {req.image_size}")
+        elif req.ratio:
+            pil_image = edit_images_api(
+                req.prompt,
+                req.image_urls,
+                aspect_ratio=req.ratio,
+                resolution="1K"
+            )
+        else:
+            pil_image = edit_images_api(
+                req.prompt,
+                req.image_urls,
+                resolution="1K"
+            )
+        
+        if pil_image is None:
+            return {"success": False, "error": "编辑图片失败"}
+
+        # 上传最终图片并获取URL
+        image_url = process_cropped_upload(pil_image)
+
+        return {
+            "success": image_url is not None,
+            "description": "生成的图片如下",
+            "image_url": image_url,
+            "raw": {"url": image_url},
+        }
+
+    except Exception as e:
+        logger.exception("编辑接口异常")
+        return {"success": False, "error": str(e)}
+
+# @app.post("/edit_image_new")
+# def edit_image_new(req: EditImageRequest):
+#     logger.info(f"/edit_image 请求: prompt={req.prompt[:200]}...,模特图片链接:{req.model_image_urls},衣服图片链接:{req.garment_image_urls},图片尺寸:{req.image_size},图片比例:{req.ratio} image_count={len(req.model_image_urls)}")
+#     try:
+#         if req.image_size:
+#             w,h=req.image_size
+#             ratio = (w,h)
+#             ar = f"{w}x{h}"
+#             aspect_ratio = size_dict[ar]
+#         elif req.ratio:
+   
+#             aspect_ratio = req.ratio
+#         else:
+#             aspect_ratio = [1,1]
+#         pil_image=None
+#         pil_image_list=[]
+#         if not req.model_image_urls:
+#             return {"success": False, "error": "model_image_urls图片链接不能为空"}
+#         if not req.garment_image_urls:
+#             return {"success": False, "error": "garment_image_urls图片链接不能为空"}
+
+#         for image_url in req.model_image_urls:
+#             for garment_image_url in req.garment_image_urls:
+#                 pil_image=edit_images_api(req.prompt,[image_url,garment_image_url],aspect_ratio=aspect_ratio,resolution="2K")
+#                 if pil_image is None:
+#                     continue
+#                 if req.image_size:
+#                     pil_image=pil_image.resize(req.image_size)
+           
+
+#                 temp_image_url=process_cropped_upload(pil_image)
+#                 if temp_image_url is None:
+#                     continue
+#                 logger.info(f"图片已上传: {temp_image_url}")
+#                 pil_image_list.append(temp_image_url)
+        
+#         if len(pil_image_list) == 0:
+#             return {"success": False, "error": "编辑图片失败"}
+        
+
+
+
+#         return {
+#             "success": len(pil_image_list) > 0,
+#             "description": "生成的图片如下",
+#             "image_url": pil_image_list,
+#             "raw": {"url": pil_image_list},
+#         }
+
+#     except Exception as e:
+#         logger.exception("编辑接口异常")
+#         return {"success": False, "error": str(e)}
+
+
+
+
+@app.post("/text_to_image")
+def text_to_image(req: GenerateImageRequest):
+    logger.info(f"/text_to_image 请求: prompt={req.prompt[:200]}...")
+    try:
+        pil_image=call_gemini_generate_image(req.prompt)
+        if pil_image is None:
+            return {"success": False, "error": "生成图片失败"}
+        
+        # 上传图片并获取URL
+        image_url = process_cropped_upload(pil_image)
+        result={"url":image_url}
+        logger.info(f"/text_to_image 最终结果: {result}")
+
+        return {
+            "success": True,
+            "image_url": image_url,
+            "raw": result,
+        }
+    except Exception as e:
+        logger.exception("文生图接口异常")
+        return {"success": False, "error": str(e)}
+
+
+@app.post("/generate_sketch")
+def generate_sketch_api(req: GenerateSketchRequest):
+    """
+    生成线稿图接口
+    
+    使用scr.sketch模块生成线稿图,支持自动质量检查
+    """
+    logger.info(f"/generate_sketch 线稿图请求: image={req.image[:100] if req.image else 'None'}..., prompt={req.prompt[:100] if req.prompt else 'None'}")
+    
+    try:
+        # 检查是否提供了款式图片
+        if not req.image:
+            return {"success": False, "error": "请上传款式图片"}
+        
+        # 调用线稿图生成模块
+        sketch_url = generate_sketch(
+            image_url=req.image,
+            prompt=req.prompt if req.prompt else None,
+            max_retries=2,
+            auto_check=True
+        )
+        
+        if sketch_url is None:
+            return {"success": False, "error": "生成线稿图失败"}
+        
+        logger.info(f"/generate_sketch 最终结果: {sketch_url}")
+        
+        return {
+            "success": True,
+            "description": "线稿图生成成功",
+            "image_url": sketch_url,
+            "raw": {"url": sketch_url},
+        }
+        
+    except Exception as e:
+        logger.exception("线稿生成接口异常")
+        return {"success": False, "error": str(e)}
+
+
+if __name__ == "__main__":
+    import uvicorn
+    uvicorn.run(app, host="0.0.0.0", port=9002)

+ 151 - 0
scr/check.py

@@ -0,0 +1,151 @@
+import json
+import os
+import requests
+from io import BytesIO
+from google import genai
+from google.genai import types
+from datetime import datetime
+from google.genai import Client
+from google.genai import types 
+GEMINI_BASE_URL = os.environ.get("GEMINI_API_BASE_URL", "https://api.openaius.com")
+GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY","sk-qnsfJw0vsAitlnrXcOeBYrLbTv9LXfsN1m3jIUfMJagan5IR")
+
+_client: Client | None = None
+
+def _get_client() -> Client:
+    global _client
+    if _client is None:
+        _client = Client(
+            api_key=GEMINI_API_KEY,
+            http_options={"base_url": GEMINI_BASE_URL}
+        )
+    return _client
+
+
+
+def get_image_mime_type(image_url, content=None):
+    """
+    根据URL或内容判断图片的MIME类型
+    
+    Args:
+        image_url: 图片URL
+        content: 图片内容(可选)
+    
+    Returns:
+        MIME类型字符串
+    """
+    # 首先尝试从URL判断
+    if image_url.endswith('.png'):
+        return 'image/png'
+    elif image_url.endswith('.jpg') or image_url.endswith('.jpeg'):
+        return 'image/jpeg'
+    elif image_url.endswith('.gif'):
+        return 'image/gif'
+    elif image_url.endswith('.webp'):
+        return 'image/webp'
+    
+    # 如果URL无法判断,尝试从内容判断
+    if content:
+        # 检查文件头
+        if content.startswith(b'\x89PNG'):
+            return 'image/png'
+        elif content.startswith(b'\xff\xd8\xff'):
+            return 'image/jpeg'
+        elif content.startswith(b'GIF'):
+            return 'image/gif'
+        elif content.startswith(b'RIFF') and b'WEBP' in content[:12]:
+            return 'image/webp'
+    
+    # 默认返回jpeg
+    return 'image/jpeg'
+
+
+def download_image_from_url(image_url):
+    """
+    从URL下载图片并返回字节数据和MIME类型
+    
+    Args:
+        image_url: 图片URL
+    
+    Returns:
+        (图片字节数据, MIME类型),如果失败返回(None, None)
+    """
+    try:
+        response = requests.get(image_url, timeout=30)
+        response.raise_for_status()
+        content = response.content
+        
+        # 尝试从响应头获取Content-Type
+        content_type = response.headers.get('Content-Type', '')
+        if content_type and content_type.startswith('image/'):
+            mime_type = content_type
+        else:
+            # 从URL或内容判断
+            mime_type = get_image_mime_type(image_url, content)
+        
+        return content, mime_type
+    except Exception as e:
+        print(f"❌ 下载图片失败 {image_url}: {e}")
+        return None, None
+
+
+def process_image_pair_with_gemini(image1_url, image2_url, prompt, model="gemini-2.5-flash"):
+    """
+    使用Gemini处理成对的图片
+    
+    Args:
+        image1_url: 第一张图片的URL
+        image2_url: 第二张图片的URL
+        prompt: 提示词
+        model: 使用的模型名称
+    
+    Returns:
+        Gemini的响应文本,如果失败返回None
+    """
+    try:
+        # 下载第一张图片并获取MIME类型
+        img1_bytes, img1_mime = download_image_from_url(image1_url)
+        if not img1_bytes:
+            return None
+        
+        # 下载第二张图片并获取MIME类型
+        img2_bytes, img2_mime = download_image_from_url(image2_url)
+        if not img2_bytes:
+            return None
+        
+        # 创建请求内容 - 直接使用内联图片数据,避免使用 files.upload
+        contents = [
+            prompt,
+            types.Part.from_bytes(
+                data=img1_bytes,
+                mime_type=img1_mime
+            ),
+            types.Part.from_bytes(
+                data=img2_bytes,
+                mime_type=img2_mime
+            )
+        ]
+        
+        # 调用Gemini API
+        response = _get_client().models.generate_content(
+            model=model,
+            contents=contents
+        )
+        
+        return response.text
+        
+    except Exception as e:
+        print(f"❌ 处理图片对时出错: {e}")
+        return None
+
+
+
+
+
+if __name__ == "__main__":
+ 
+
+    prompt = """图2是不是图1的衣服的线稿款式图,而且除了衣服的线稿外没有其他的元素了?是不是只有黑白线稿没有颜色的,是不是不含人台(mannequin)的线稿,是不是衣服的数量和特征都对应上了,是的话回答是,否则回答否"""
+
+    result=process_image_pair_with_gemini(    "https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120610_072.png","https://testdgxcx-oss.gloria.com.cn/design_image/cropped_20251121_120624_088.png",prompt)
+    print(result)

+ 68 - 0
scr/conf.py

@@ -0,0 +1,68 @@
+"""
+配置文件
+
+包含API密钥、模型配置等常量
+"""
+
+# ==================== API配置 ====================
+
+# 豆包API配置 (api_key, base_url)
+doubao_ky = (
+    "817dff39-5586-4f9b-acba-55004167c0b1",
+    "https://ark.cn-beijing.volces.com/api/v3"
+)
+
+# 阿里云API配置 (api_key, base_url)
+ali_ky = (
+    "sk-04b63960983445f980d85ff185a17876",
+    "https://dashscope.aliyuncs.com/compatible-mode/v1"
+)
+
+# ==================== 模型配置 ====================
+
+# 豆包模型配置
+doubao_model = {
+    "text_doubao": "ep-20241018084532-cgm84",
+    "text_ds": "deepseek-r1-250120",
+    "mm_doubao": "doubao-1-5-vision-pro-32k-250115"
+}
+
+# 阿里云模型配置
+ali_model = {
+    "text_qwen": "qwen3-max",  # 注意:覆盖了前面的 "qwen-max-2025-01-25"
+    "text_ds": "deepseek-r1",
+    "text_dsv3": "deepseek-v3",
+    "mm_tyqw": "qwen-vl-max",
+    "mm_qwen": "qwen3-vl-plus"
+}
+import requests
+
+
+size_dict={
+"1600x1600":[1,1],
+"1800x2400":[3,4],
+"1600x2400":[2,3],
+"1080x1350":[4,5],
+"1200x1500":[4,5],
+"1920x1080":[16,9],
+"2000x2000":[1,1]}
+
+
+# API_KEY="sk-qnsfJw0vsAitlnrXcOeBYrLbTv9LXfsN1m3jIUfMJagan5IR",
+# BASE_URL="https://api.openaius.com/"
+check_prompt="""图2是不是图1的衣服的线稿款式图,而且除了衣服的线稿外没有其他的元素了?是不是只有黑白线稿没有颜色的,是不是不含人台(mannequin)的线稿,是不是衣服的数量和特征都对应上了,是的话回答是,否则回答否"""
+
+if __name__ == '__main__':
+    ratio=(2,3)
+    print(size_dict) 
+    # print(size_url[str(ratio[0])+":"+str(ratio[1])])
+    
+
+    import io   
+    from PIL import Image
+
+    # 下载原图为 PIL.Image
+    resp_img = requests.get("https://v3.fal.media/files/monkey/gtn7F5ZWMJ2SwcdWiwpkh.jpeg", timeout=30)
+    resp_img.raise_for_status()
+    pil_image = Image.open(io.BytesIO(resp_img.content)).convert("RGB")
+    print(pil_image)

+ 308 - 0
scr/gemini_client_request.py

@@ -0,0 +1,308 @@
+import base64
+import io
+import json
+import os
+from typing import List, Optional
+from ..logger_setup import logger
+from ..upload_tos import upload_image
+import requests
+from PIL import Image
+
+
+DEFAULT_API_BASE_URL = "https://api.openaius.com"
+
+# GOOGLE_API_KEY
+class GeminiAPIError(RuntimeError):
+    pass
+
+
+def _plugin_dir() -> str:
+    return os.path.dirname(__file__)
+
+
+
+def _get_api_key() -> str:
+    # 1) Environment variables override
+    key = os.environ.get("GOOGLE_API_KEY") or os.environ.get("GEMINI_API_KEY")
+    if key:
+        return key
+
+
+    raise GeminiAPIError(
+        "Google Gemini API key not found. Provide it via environment variable 'GOOGLE_API_KEY' (or 'GEMINI_API_KEY'),"
+        " config file 'gemini_config.json' (field 'api_key'), or a 'gemini_api_key.txt' file in the plugin directory."
+    )
+
+
+def _get_base_url() -> str:
+    # 2) Base URL via env
+    base = os.environ.get("GOOGLE_API_BASE_URL") or os.environ.get("GEMINI_API_BASE_URL")
+    if base:
+        return base
+    return DEFAULT_API_BASE_URL
+
+
+def _build_full_endpoint(model: str) -> str:
+
+    base = _get_base_url().rstrip("/")
+    return f"{base}/v1beta/models/{model}:generateContent"
+
+
+def _apply_auth(headers: dict, params: dict, api_key: str) -> None:
+    """Apply authentication to headers or query according to env/config.
+
+    Priority:
+    - Env vars (header)
+    - Config (auth_header_name/auth_header_value_template)
+    - Query param (env GEMINI_QUERY_PARAM_NAME) or config (query_param_name)
+    - Default query param 'key'
+    """
+    cfg = {}
+
+    # Extra headers from config
+    extra_headers = cfg.get("extra_headers") or {}
+    if isinstance(extra_headers, dict):
+        headers.update({str(k): str(v) for k, v in extra_headers.items()})
+
+    # Auth via header (env)
+    env_hdr_name = os.environ.get("GEMINI_AUTH_HEADER_NAME")
+    env_hdr_value = os.environ.get("GEMINI_AUTH_HEADER_VALUE")
+    if env_hdr_name and env_hdr_value:
+        headers[str(env_hdr_name)] = env_hdr_value.format(api_key=api_key)
+        return
+
+    # Auth via header (config)
+    hdr_name = cfg.get("auth_header_name")
+    hdr_value_tmpl = cfg.get("auth_header_value_template")
+    if hdr_name and hdr_value_tmpl:
+        headers[str(hdr_name)] = str(hdr_value_tmpl).format(api_key=api_key)
+        return
+
+    # Auth via query param (env or config)
+    query_param = os.environ.get("GEMINI_QUERY_PARAM_NAME") or cfg.get("query_param_name") or "key"
+    params[str(query_param)] = api_key
+
+
+def _encode_image_to_base64(img: Image.Image) -> dict:
+    from utils.image_io import pil_to_png_bytes
+
+    png_bytes = pil_to_png_bytes(img)
+    return {
+        "mime_type": "image/png",
+        "data": base64.b64encode(png_bytes).decode("utf-8"),
+    }
+
+
+def _build_payload(prompt: str, images: List[Image.Image], seed: Optional[int] = None) -> dict:
+    parts: List[dict] = [{"text": prompt}]
+    for img in images:
+        parts.append({"inline_data": _encode_image_to_base64(img)})
+    generation_config = {
+        "response_mime_type": "image/png",
+    }
+    if seed is not None:
+        # Include commonly seen keys for better proxy compatibility
+        try:
+            generation_config["seed"] = int(seed)
+            generation_config["random_seed"] = int(seed)
+        except Exception:
+            pass
+
+    payload = {
+        "contents": [
+            {
+                "role": "user",
+                "parts": parts,
+            }
+        ],
+        # Match requirement: request both IMAGE and TEXT modalities, but we expect image primary
+        "generationConfig": generation_config,
+        "responseModalities": ["IMAGE", "TEXT"],
+    }
+    return payload
+
+
+def _extract_image_bytes_from_response(resp_json: dict) -> bytes:
+    # Typical success path: candidates[0].content.parts[*].inline_data.data (base64)
+    candidates = resp_json.get("candidates") or []
+    if not candidates:
+        # Check for promptFeedback block
+        feedback = resp_json.get("promptFeedback") or {}
+        block_reason = feedback.get("blockReason") or feedback.get("block_reason")
+        if block_reason:
+            raise GeminiAPIError(f"Gemini blocked the request: {block_reason}")
+        raise GeminiAPIError("Gemini API returned no candidates.")
+
+    # inspect first candidate with inline image data
+    for cand in candidates:
+        content = cand.get("content") or {}
+        parts = content.get("parts") or []
+        for part in parts:
+            inline = part.get("inline_data") or part.get("inlineData")
+            if inline and isinstance(inline, dict):
+                mime = inline.get("mime_type") or inline.get("mimeType") or ""
+                data_b64 = inline.get("data")
+                if data_b64 and mime.startswith("image/"):
+                    return base64.b64decode(data_b64)
+
+    # Fallback: check ground-level parts
+    contents = resp_json.get("contents") or []
+    for content in contents:
+        for part in content.get("parts", []):
+            inline = part.get("inline_data") or part.get("inlineData")
+            if inline and isinstance(inline, dict):
+                mime = inline.get("mime_type") or inline.get("mimeType") or ""
+                data_b64 = inline.get("data")
+                if data_b64 and mime.startswith("image/"):
+                    return base64.b64decode(data_b64)
+
+    # If we reach here, extract helpful diagnostics
+    finish_reason = candidates[0].get("finishReason") if candidates else None
+    raise GeminiAPIError(
+        f"No image found in response. finishReason={finish_reason}, raw={json.dumps(resp_json)[:800]}"
+    )
+
+
+def call_gemini_generate_image(
+    prompt: str,
+    images: List[Image.Image],
+    model: str = "gemini-2.5-flash-image",
+    api_key: Optional[str] = None,
+    timeout: float = 60.0,
+    seed: Optional[int] = None,
+) -> bytes:
+    """Call Gemini API to generate an image response from prompt + images.
+
+    Returns PNG bytes on success, raises GeminiAPIError on failure.
+    """
+    key = api_key or _get_api_key()
+    url = _build_full_endpoint(model)
+    print(url)
+    headers = {
+        "Content-Type": "application/json",
+    }
+    params = {}
+    _apply_auth(headers, params, key)
+    payload = _build_payload(prompt, images, seed=seed)
+
+    try:
+        resp = requests.post(url, headers=headers, params=params, json=payload, timeout=timeout)
+    except requests.RequestException as ex:
+        raise GeminiAPIError(f"Network error calling Gemini API: {ex}")
+
+    if resp.status_code != 200:
+        # Try to parse error payload
+        try:
+            err_json = resp.json()
+        except Exception:
+            err_json = None
+        if err_json:
+            # Common format: {"error": {"code":..., "message":..., "status":...}}
+            err = err_json.get("error") or {}
+            message = err.get("message") or json.dumps(err_json)
+            raise GeminiAPIError(f"Gemini API error {resp.status_code}: {message}")
+        raise GeminiAPIError(f"Gemini API error {resp.status_code}: {resp.text}")
+
+    try:
+        resp_json = resp.json()
+    except ValueError as ex:
+        raise GeminiAPIError(f"Failed to parse Gemini response JSON: {ex}")
+
+    img_bytes=_extract_image_bytes_from_response(resp_json)
+    img = Image.open(io.BytesIO(img_bytes))
+    img_url=upload_image(img)
+    return img_url
+
+
+def call_gemini_generate_image_from_images(
+    prompt: str,
+    image_urls: List[str],
+    model: str = "gemini-2.5-flash-image",
+    resolution: str = "1K",
+    api_key: Optional[str] = None,
+    timeout: float = 60.0,
+    seed: Optional[int] = None,
+) -> Optional[Image.Image]:
+    """
+    从图片URL列表生成图片
+    
+    Args:
+        prompt: 提示词
+        image_urls: 图片URL列表
+        model: 使用的模型
+        resolution: 分辨率 ("1K" 或 "2K")
+        api_key: API密钥(可选)
+        timeout: 超时时间
+        seed: 随机种子(可选)
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    try:
+        # 下载图片URL并转换为PIL Image
+        images = []
+        for image_url in image_urls:
+            try:
+                response = requests.get(image_url, timeout=30)
+                response.raise_for_status()
+                img = Image.open(io.BytesIO(response.content)).convert("RGB")
+                images.append(img)
+            except Exception as e:
+                logger.error(f"下载图片失败 {image_url}: {e}")
+                return None
+        
+        if not images:
+            logger.error("没有成功下载任何图片")
+            return None
+        
+        # 调用生成函数
+        key = api_key or _get_api_key()
+        url = _build_full_endpoint(model)
+        headers = {
+            "Content-Type": "application/json",
+        }
+        params = {}
+        _apply_auth(headers, params, key)
+        payload = _build_payload(prompt, images, seed=seed)
+
+        try:
+            resp = requests.post(url, headers=headers, params=params, json=payload, timeout=timeout)
+        except requests.RequestException as ex:
+            logger.error(f"网络错误: {ex}")
+            return None
+
+        if resp.status_code != 200:
+            try:
+                err_json = resp.json()
+                err = err_json.get("error") or {}
+                message = err.get("message") or json.dumps(err_json)
+                logger.error(f"Gemini API错误 {resp.status_code}: {message}")
+            except Exception:
+                logger.error(f"Gemini API错误 {resp.status_code}: {resp.text}")
+            return None
+
+        try:
+            resp_json = resp.json()
+        except ValueError as ex:
+            logger.error(f"解析响应JSON失败: {ex}")
+            return None
+
+        img_bytes = _extract_image_bytes_from_response(resp_json)
+        img = Image.open(io.BytesIO(img_bytes))
+        return img
+        
+    except Exception as e:
+        logger.error(f"生成图片时出错: {e}")
+        return None
+
+
+
+
+
+
+if __name__=="__main__":
+    image=r"D:\ppt\企业微信截图_1760499008629.png"
+    image=[Image.open(image)]
+    res=call_gemini_generate_image("把这条上衣变成红色",image,api_key="sk-qnsfJw0vsAitlnrXcOeBYrLbTv9LXfsN1m3jIUfMJagan5IR")
+    with open("output.png", "wb") as f:
+        f.write(res)

+ 377 - 0
scr/llm.py

@@ -0,0 +1,377 @@
+"""
+LLM请求模块
+
+提供多模态和文本LLM请求功能,支持图片和文本输入
+"""
+
+import io
+import os
+import sys
+import time
+import base64
+import logging
+
+import numpy as np
+import requests
+from PIL import Image
+from openai import OpenAI
+from requests.adapters import HTTPAdapter
+from urllib3.util.retry import Retry
+
+from logger_setup import logger
+from conf import *
+from tos import HttpMethodType
+
+def image_to_base64(image):
+    """
+    将PIL Image对象转换为base64编码字符串
+    
+    Args:
+        image: PIL Image对象
+    
+    Returns:
+        base64编码的字符串
+    """
+    image_io = io.BytesIO()
+    image.save(image_io, format='JPEG', quality=95)
+    image_io.seek(0)
+    image_base64 = base64.b64encode(image_io.read()).decode('utf-8')
+    return image_base64
+
+def download_image_with_retry(url, max_retries=3, timeout=30):
+    """
+    下载图片并重试机制
+    
+    Args:
+        url: 图片URL
+        max_retries: 最大重试次数
+        timeout: 超时时间(秒)
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    session = requests.Session()
+    retry_strategy = Retry(
+        total=max_retries,
+        backoff_factor=1,
+        status_forcelist=[429, 500, 502, 503, 504],
+    )
+    adapter = HTTPAdapter(max_retries=retry_strategy)
+    session.mount("http://", adapter)
+    session.mount("https://", adapter)
+    
+    try:
+        logger.info(f"正在下载图片: {url}")
+        response = session.get(url, timeout=timeout)
+        response.raise_for_status()
+        logger.info("图片下载成功")
+        return Image.open(io.BytesIO(response.content))
+    except Exception as e:
+        logger.error(f"下载图片失败: {e}")
+        return None
+
+def image_reader(image):
+    """
+    图片读取器,将各种格式的图片转换为base64编码的data URI
+    
+    支持:
+    - 本地文件路径(字符串)
+    - HTTP/HTTPS URL(字符串)
+    - numpy数组
+    - PIL Image对象
+    
+    Args:
+        image: 图片输入(路径、URL、numpy数组或PIL Image)
+    
+    Returns:
+        base64编码的data URI字符串
+    
+    Raises:
+        Exception: 如果下载图片失败
+    """
+    if isinstance(image, str):
+        if image.startswith("http"):
+            # 下载网络图片
+            out_image = download_image_with_retry(image)
+            if out_image is None:
+                raise Exception(f"无法下载图片: {image}")
+        else:
+            # 读取本地图片
+            out_image = Image.open(image)
+    elif isinstance(image, np.ndarray):
+        out_image = Image.fromarray(image)
+    else:
+        out_image = image
+    
+    out_image = out_image.convert('RGB')
+    base64_img = image_to_base64(out_image)
+    return f"data:image/jpeg;base64,{base64_img}"
+
+
+def get_lm_text(sys_prompt, user_prompt):
+    """
+    文本LLM请求(已废弃,使用llm_request类替代)
+    
+    Args:
+        sys_prompt: 系统提示词
+        user_prompt: 用户提示词
+    
+    Returns:
+        LLM返回的文本
+    """
+    completion = LMConfig.lm_client.chat.completions.create(
+        messages = [
+            {"role": "system", "content": sys_prompt},
+            {"role": "user", "content": user_prompt},
+        ],
+        model=LMConfig.model,
+    )
+
+    return completion.choices[0].message.content
+
+
+
+
+# ==================== 图片处理工具 ====================
+
+def compress_image(input_path, output_path):
+    """
+    压缩图片到目标大小
+    
+    Args:
+        input_path: 输入图片路径
+        output_path: 输出图片路径
+    
+    Returns:
+        最终使用的压缩质量
+    """
+    img = Image.open(input_path)
+    current_size = os.path.getsize(input_path)
+    # 粗略的估计压缩质量,也可以从常量开始,逐步减小压缩质量,直到文件大小小于目标大小
+    image_quality = int(float(MMMConfig.target_size / current_size) * 100)
+    img.save(output_path, optimize=True, quality=int(float(MMMConfig.target_size / current_size) * 100))
+    # 如果压缩后文件大小仍然大于目标大小,则继续压缩
+    # 压缩质量递减,直到文件大小小于目标大小
+    while os.path.getsize(output_path) > MMMConfig.target_size:
+        img = Image.open(output_path)
+        image_quality -= 10
+        if image_quality <= 0:
+            break
+        img.save(output_path, optimize=True, quality=image_quality)
+    return image_quality
+
+def upload_tos(filename, tos_object_key):
+    """
+    上传文件到TOS并获取预签名URL
+    
+    Args:
+        filename: 本地文件路径
+        tos_object_key: TOS对象键
+    
+    Returns:
+        预签名的URL
+    
+    Raises:
+        Exception: 上传失败时抛出异常
+    """
+    tos_client, inner_tos_client = MMMConfig.tos_client, MMMConfig.inner_tos_client
+    try:
+        # 将本地文件上传到目标桶中, filename为本地压缩后图片的完整路径
+        tos_client.put_object_from_file(MMMConfig.tos_bucket_name, tos_object_key, filename)
+        # 获取上传后预签名的 url
+        return inner_tos_client.pre_signed_url(HttpMethodType.Http_Method_Get, MMMConfig.tos_bucket_name, tos_object_key)
+    except Exception as e:
+        if isinstance(e, tos.exceptions.TosClientError):
+            # 操作失败,捕获客户端异常,一般情况为非法请求参数或网络异常
+            logger.error('TOS客户端错误, message:{}, cause: {}'.format(e.message, e.cause))
+        elif isinstance(e, tos.exceptions.TosServerError):
+            # 操作失败,捕获服务端异常,可从返回信息中获取详细错误信息
+            logger.error('TOS服务端错误, code: {}'.format(e.code))
+            # request id 可定位具体问题,强烈建议日志中保存
+            logger.error('error with request id: {}'.format(e.request_id))
+            logger.error('error with message: {}'.format(e.message))
+            logger.error('error with http code: {}'.format(e.status_code))
+
+        else:
+            logger.error('TOS上传失败,未知错误: {}'.format(e))
+
+        raise e
+
+
+
+# def doubao_MMM_request(pre_signed_url_output, prompt):
+
+#     client = MMMConfig.client
+    
+
+#     response = client.chat.completions.create(
+#         model=MMMConfig.model,
+#         messages=[{"role": "user","content": [
+#                 {"type": "text", "text": prompt},
+#                 {"type": "image_url", "image_url": {"url": pre_signed_url_output.signed_url}}
+#             ],
+#         }],
+#         temperature=0.8,
+#         extra_headers={"x-ark-beta-vision": "true"}
+#     )
+#     result = response.choices[0].message.content
+#     return result
+
+
+class llm_request:
+    """
+    LLM请求类
+    
+    提供多模态和文本LLM请求功能
+    """
+    
+    def __init__(self, api_key, base_url, model):
+        """
+        初始化LLM请求客户端
+        
+        Args:
+            api_key: API密钥
+            base_url: API基础URL
+            model: 模型名称
+        """
+        self.api_key = api_key
+        self.base_url = base_url
+        self.model = model
+
+    def llm_mm_request(self, usr_text, img, sys_text="You are a helpful assistant."):
+        """
+        多模态请求(单张图片)
+        
+        Args:
+            usr_text: 用户文本提示
+            img: 图片(路径、URL、numpy数组或PIL Image)
+            sys_text: 系统提示词
+        
+        Returns:
+            LLM返回的文本内容
+        """
+        client = OpenAI(
+            api_key=self.api_key,
+            base_url=self.base_url
+        )
+        completion = client.chat.completions.create(
+            model=self.model,
+            messages=[
+                {
+                    "role": "system",
+                    "content": [{"type": "text", "text": sys_text}]
+                },
+                {
+                    "role": "user",
+                    "content": [
+                        {
+                            "type": "image_url",
+                            "image_url": {"url": image_reader(img)},
+                        },
+                        {"type": "text", "text": usr_text},
+                    ],
+                }
+            ],
+            temperature=0.5,
+            top_p=0.7,
+            timeout=120.0
+        )
+        return completion.choices[0].message.content
+
+    def llm_mm_2_request(self, usr_text, imgs, sys_text="You are a helpful assistant."):
+        """
+        多模态请求(多张图片)
+        
+        Args:
+            usr_text: 用户文本提示
+            imgs: 图片列表(路径、URL、numpy数组或PIL Image)
+            sys_text: 系统提示词
+        
+        Returns:
+            LLM返回的文本内容
+        """
+        client = OpenAI(
+            api_key=self.api_key,
+            base_url=self.base_url
+        )
+        image_content_list = [
+            {
+                "type": "image_url",
+                "image_url": {"url": image_reader(img)},
+            }
+            for img in imgs
+        ]
+        text_content = {"type": "text", "text": usr_text}
+        user_content = image_content_list + [text_content]
+        
+        completion = client.chat.completions.create(
+            model=self.model,
+            messages=[
+                {
+                    "role": "system",
+                    "content": [{"type": "text", "text": sys_text}]
+                },
+                {
+                    "role": "user",
+                    "content": user_content,
+                }
+            ],
+            temperature=0.5,
+            top_p=0.7,
+            timeout=120.0
+        )
+        return completion.choices[0].message.content
+
+    def llm_text_request(self, text, sys_text="You are a helpful assistant."):
+        """
+        纯文本LLM请求
+        
+        Args:
+            text: 用户文本提示
+            sys_text: 系统提示词
+        
+        Returns:
+            LLM返回的文本内容
+        """
+        client = OpenAI(
+            api_key=self.api_key,
+            base_url=self.base_url
+        )
+        completion = client.chat.completions.create(
+            model=self.model,
+            messages=[
+                {
+                    "role": "system",
+                    "content": sys_text
+                },
+                {
+                    "role": "user",
+                    "content": text,
+                }
+            ],
+            temperature=0.9,
+            timeout=120.0
+        )
+        return completion.choices[0].message.content
+    
+
+
+if __name__=="__main__":
+    ##ali
+    # ky="sk-TstsKbfIFjdNpjNGo6uBHzZayp5Bq8FjTV0b6BwyXflaOFLs"
+    # baseurl="https://api.openaius.com/v1"
+    # model="gpt-5"
+    #ali
+    ky="sk-04b63960983445f980d85ff185a17876"
+    baseurl="https://dashscope.aliyuncs.com/compatible-mode/v1"
+    model="qwen3-vl-plus"
+    ##doubao
+    # ky='817dff39-5586-4f9b-acba-55004167c0b1'
+    # baseurl="https://ark.cn-beijing.volces.com/api/v3"
+    # model="doubao-1-5-vision-pro-32k-250115"
+    llm=llm_request(ky,baseurl,model)
+    imgs=r"H:\data\线稿图\S1261A097_S1261A097_concatenated.jpg"
+    res1=llm.llm_mm_request("判断一下图2是不是图1的平铺图,纽扣数量是否一致",imgs)
+    print(res1)
+    # res2=llm.llm_text_request("你好!你是谁")
+    # print(res2)

+ 27 - 0
scr/logger_setup.py

@@ -0,0 +1,27 @@
+import os
+import logging
+from logging.handlers import RotatingFileHandler
+
+LOG_DIR = os.path.join(os.path.dirname(__file__), 'logs')
+LOG_FILE = os.path.join(LOG_DIR, 'fal_api.log')
+
+# 确保日志目录存在
+os.makedirs(LOG_DIR, exist_ok=True)
+
+# 配置logger
+logger = logging.getLogger("fal_api")
+logger.setLevel(logging.INFO)
+formatter = logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s')
+
+if not logger.handlers:
+    # 控制台handler
+    ch = logging.StreamHandler()
+    ch.setLevel(logging.INFO)
+    ch.setFormatter(formatter)
+    logger.addHandler(ch)
+
+    # 文件轮转handler
+    fh = RotatingFileHandler(LOG_FILE, maxBytes=5*1024*1024, backupCount=5, encoding='utf-8')
+    fh.setLevel(logging.INFO)
+    fh.setFormatter(formatter)
+    logger.addHandler(fh)

+ 217 - 0
scr/prompt.py

@@ -0,0 +1,217 @@
+
+
+
+flat_layout_prompt = """"
+## 角色:你是一个AI图片编辑指令专家,专门生成衣服的精修平铺图的指令。
+## 现在我需要你根据图片内容,生成衣服的精修平铺图的指令。
+## 规则:
+    - 指令格式:提取出图片里面衣服的平铺精修图(正面/背面/正反面)+保持原比例,保留衣服的细节+是否包含纽扣(是/否)
+        1、 先判断输入的图片里面衣服是正面还是背面,还是同时包含正反面,
+            - 如果是正面,则生成正面平铺图的指令:如:提取出图片里面衣服的平铺精修图,
+            - 如果是背面,则生成背面平铺图的指令:如:提取出图片里面衣服的背面平铺精修图,
+            - 如果是同时包含正反面,则生成同时包含正反面平铺图的指令:如:提取出图片里面衣服的正反面平铺精修图,
+        2、 再判断输入的衣服中是否含有纽扣
+            - 如果含有纽扣,则生成包含纽扣的平铺图的指令:如:保留原有的纽扣,不要随意减少纽扣
+            - 如果没有纽扣,则生成不包含纽扣的平铺图的指令:如:不要随意增加纽扣
+        3、 指令里面必须包括下面内容:保持原比例,保留衣服的细节
+
+### 指令格式示例
+- "提取出图片里面衣服的平铺精修图,保持原比例,保留衣服的细节,保留原有的纽扣,不要随意减少纽扣"
+- "提取出图片里面衣服的背面平铺精修图,保持原比例,保留衣服的细节,不要随意增加纽扣"
+- "提取出图片里面衣服的正反面平铺精修图,保持原比例,保留衣服的细节,保留原有的纽扣,不要随意减少纽扣"
+- "提取出图片里面所有衣服的平铺精修图,保持原比例,保留衣服的细节,不要随意增加纽扣"
+
+**重要**:只输出优化后的中文编辑指令,不要有任何额外解释、前缀或说明文字。
+"""
+flat_layout_prompt_v2 = """
+判断输入的图片里面衣服是正面还是背面,还是同时包含正反面,还有有多件衣服,同时判断衣服中是否含有纽扣
+注意:如果不能很好分辨出是正面还是背面则判断为正面
+基于这些判断输出:
+1、如果判断为正面,含纽扣,则输出:提取出图片里面衣服的平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意减少纽扣,白底背景,不要更改衣服的细节
+2、如果判断为正面,不含纽扣,则输出:提取出图片里面衣服的平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意增加纽扣,白底背景,不要更改衣服的细节
+3、如果判断为背面,含纽扣,则输出:提取出图片里面衣服的背面平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意减少纽扣,白底背景,不要更改衣服的细节
+4、如果判断为背面,不含纽扣,则输出:提取出图片里面衣服的背面平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意增加纽扣,白底背景,不要更改衣服的细节
+5、如果判断为正反面,含纽扣,则输出:提取出图片里面衣服的正反面平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意减少纽扣,白底背景,不要更改衣服的细节
+6、如果判断为正反面,不含纽扣,则输出:提取出图片里面衣服的正反面平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意增加纽扣,白底背景,不要更改衣服的细节
+7、如果判断为多件衣服,含纽扣,则输出:提取出图片里面所有衣服的平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意减少纽扣,白底背景,不要更改衣服的细节
+8、如果判断为多件衣服,不含纽扣,则输出:提取出图片里面所有衣服的平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,不要随意增加纽扣,白底背景,不要更改衣服的细节
+9、,如果裤头、裙头、裤裆、裙裆等部位有1个以上纽扣的情况下,则输出:提取出图片里面衣服的平铺精修图,只提取衣服,保持原比例,严格保留衣服的细节,保留原有的纽扣,不要随意减少纽扣,白底背景,不要更改衣服的细节
+**重要**:只输出符合上述格式的**中文编辑指令**,不要有任何额外解释、前缀或说明文字。
+"""
+
+flat_layout_prompt_v3 = """"
+## 角色:AI 电商精修指令专家
+
+## 目标:
+请根据输入的**图片内容**,生成用于自动化修图或图片生成(如 AI 生图工具)的**中文编辑指令**,确保生成服装的精修平铺图符合电商标准。
+
+## 规则与工作流:
+
+1.  **分析视角(必选其一):**
+    - 如果判断为**正面**:使用指令关键词 “提取衣服的**正面平铺**精修图”
+    - 如果判断为**背面**:使用指令关键词 “提取衣服的**背面平铺**精修图”
+    - 如果判断为**正反面**同时出现:使用指令关键词 “提取衣服的**正反面平铺**精修图”
+    - 如果判断为**多件衣服(2件以上)**:使用指令关键词 “提取出图片里面所有衣服的平铺精修图”
+
+2.  **分析细节注意留意**裤头**、**裙头**、**裤裆**、**裙裆**等部位是否含有纽扣:**
+    - 如果判断**含有纽扣**:附加指令 “保留原有的纽扣,不要随意减少纽扣”
+    - 如果判断**不含纽扣**:附加指令 “不要随意增加纽扣”
+
+3.  **强制质量要求(必须包含):**
+    - 必须包含:保持原比例,保留衣服的细节。
+
+### 指令输出格式示例(必须是单句且按以下结构组合)
+
+- "提取出图片里面衣服的平铺精修图,保持原比例,保留衣服的细节,保留原有的纽扣,不要随意减少纽扣"
+- "提取出图片里面衣服的背面平铺精修图,保持原比例,保留衣服的细节,不要随意增加纽扣"
+- "提取出图片里面衣服的正反面平铺精修图,保持原比例,保留衣服的细节,保留原有的纽扣,不要随意减少纽扣"
+- "提取出图片里面所有衣服的平铺精修图,保持原比例,保留衣服的细节,不要随意增加纽扣"
+
+**重要**:只输出符合上述格式的**中文编辑指令**,不要有任何额外解释、前缀或说明文字。
+"""
+
+sketch_prompt = """"
+## 角色:你是一个AI服装工程专家,专职于生成**极简风格的服装线稿版型图**的指令。
+
+## 目标:
+现在我需要你根据输入的图片内容,生成衣服的**线稿版型图**编辑指令。生成的指令必须侧重于清晰度、几何精度和结构表现。
+
+## 规则与工作流:
+
+1.  **分析视角(必选其一):**
+    - **线稿主题:** 所有的图都应被处理成单色的、无阴影的、高对比度的**工程线稿**(Blueprint Line Art)。
+    - 如果判断为**正面**:使用指令关键词 “将衣服转化为**正面版型线稿图**”
+    - 如果判断为**背面**:使用指令关键词 “将衣服转化为**背面版型线稿图**”
+    - 如果判断为**正反面**同时出现:使用指令关键词 “将衣服转化为**正反面版型线稿图**”
+
+2.  **分析细节(结构要素):**
+    - **结构线**:指令中必须强调**突出所有裁剪线、缝合线和结构边界**,确保线条清晰且精确。
+    - **非结构要素处理**:
+        - 如果判断**含有纽扣、拉链等附件**:附加指令 “**简化并保留**纽扣和拉链的位置,但去除所有材质和阴影细节”
+        - 如果判断**不含任何附件**:附加指令 “**去除**所有装饰元素和材质纹理”
+
+3.  **强制质量要求(必须包含):**
+    - 必须包含:保持**原始比例**,**几何精度**高,使用**等宽细线条**,采用**纯白背景**。
+
+### 指令输出格式示例(必须是单句且按以下结构组合)
+
+- "将衣服转化为正面版型线稿图,突出所有裁剪线、缝合线和结构边界,简化并保留纽扣和拉链的位置,但去除所有材质和阴影细节,保持原始比例,几何精度高,使用等宽细线条,采用纯白背景"
+- "将衣服转化为背面版型线稿图,突出所有裁剪线、缝合线和结构边界,去除所有装饰元素和材质纹理,保持原始比例,几何精度高,使用等宽细线条,采用纯白背景"
+- "将衣服转化为正反面版型线稿图,突出所有裁剪线、缝合线和结构边界,简化并保留纽扣和拉链的位置,但去除所有材质和阴影细节,保持原始比例,几何精度高,使用等宽细线条,采用纯白背景"
+
+**重要**:只输出符合上述格式的**中文编辑指令**,不要有任何额外解释、前缀或说明文字。
+
+"""
+
+
+enhance_flat_layout_prompt_v1="""" 
+# Role
+你是一位资深的AI绘画提示词优化专家。你的任务是根据用户提供的“原提示词”以及“对比图片”,判断生图效果是否符合原图特征,并输出判断结果或优化后的提示词。
+
+# Context
+- **输入内容**:一段文本(原提示词) + 一张图片。
+- **图片结构**:图片为拼接图,左侧是【参考原图】,右侧是模型生成的【平铺图】。
+
+# Task
+请仔细对比左侧原图与右侧生成图,重点检查以下细节的一致性:
+1. **结构与版型**:吊带(是否缺失)、袖子(长短/形状)、裤头/裙头(是否多出或缺失)。
+2. **细节元素**:纽扣(数量/位置是否一致)、口袋、拉链等关键特征。
+3. **多余元素检测**:
+   - 是否多出了人台(Mannequin)?
+   - 是否多出了真人肢体/面部?
+   - 是否出现了原图中不存在的非服装元素?
+   - 是否出现了多余的裤头、裙头或重影?
+
+# Optimization Logic
+根据上述检查结果执行以下逻辑:
+
+1. **如果完全一致**:
+   - 判定为成功。
+   - 输出原提示词。
+
+2. **如果不一致**:
+   - 判定为失败。
+   - **生成优化提示词**:在“原提示词”的基础上进行**补充**或**修正**,目的是强制纠正生成的错误。
+   - *示例策略*:
+     - 若少了纽扣 -> 补充 "保留原有纽扣细节"。
+     - 若多了人台 -> 补充 "不显示人台,只有衣服"。
+     - 若多了多余肢体 -> 补充 "no hands, no face, no human limbs"。
+     - 若版型错误(如多了裤头) -> 补充 "single waistband, correct tailoring"。
+
+# Output Format
+    请直接输出标准 JSON 格式,不要包含 ```json 代码块标记:
+    如果成功,则输出:
+    {"success": true, "prompt": "原提示词"}
+    如果失败,则输出:
+    {"success": false, "prompt": "优化后的提示词"}
+
+"""
+enhance_flat_layout_prompt_v2="""
+你现在是提示词优化专家,请根据图片的的平铺图情况输出优化后的提示词。用户输入的是调用生图模型生成的平铺图的提示词,图片里面的左边是原图右边是生图模型生成的平铺图。
+规则:
+1、先判断平铺图是否和原图一致,如果不一致,则输出优化后的提示词。
+2、如果平铺图和原图一致,则判断衣服品类、内衬、纽扣、吊带、袖子、裤头、裙头、裤裆、裙裆等部位是否一致,是否多出人台,是否少了吊带,是否多了纽扣,是否多了裤头,是否多了裙头,是否多了裤裆,是否多了裙裆
+3、如果内衬、纽扣、吊带、袖子、裤头、裙头、裤裆、裙裆等部位不一致,则输出优化后的提示词。
+4、如果纽扣、吊带、袖子、裤头、裙头、裤裆、裙裆等部位一致,则输出原提示词。
+5、优化后的提示词不要出现原图、左图、右图之类的信息,因为用户输入的是调用生图模型生成的平铺图的提示词,不是原图的提示词。
+
+请根据图片的的平铺图情况输出优化后的提示词。着重判断是生图模型生成的平铺图是不是和原图一致,如果不一致,则输出优化后的提示词。注意:我是要平铺图和左边的原图一致,不是原图和平铺图一致。
+着重判断纽扣、吊带、袖子、裤头、裙头、裤裆、裙裆等部位是否一致,是否多出人台,是否少了吊带,是否多了纽扣,是否多了裤头,是否多了裙头,是否多了裤裆,是否多了裙裆
+# Output Format
+    请直接输出标准 JSON 格式,不要包含 ```json 代码块标记:
+    如果成功,则输出:
+    {"success": true, "prompt": "原提示词"}
+    如果失败,则输出则输出优化后的提示词。优化有的提示词是原有提示词的补充,有的提示词是原有提示词的修改。比如少了纽扣,则补充保留原有纽扣的数量。:
+    {"success": false, "prompt": "优化后的提示词"}
+
+"""
+enhance_flat_layout_prompt_v3="""你是一位专业的服装电商修图师和AI提示词专家。你的任务是进行“平铺图(Ghost Mannequin)”的质量检测和提示词修复。
+
+### 输入说明
+用户输入的图片是由两张图拼接而成的:
+- **左侧**是【参考原图】:代表衣服正确的款式、细节、内衬和结构。
+- **右侧**是【AI生成图】:是根据当前提示词生成的平铺图,可能存在错误。
+
+### 你的工作流程
+请严格按照以下步骤在内心进行思考,不要跳过:
+
+1. **左右对比**:
+   - 以左图为标准,检查右图是否变成了错误的品类?(如:半身裙变连衣裙,短裤变长裤)。
+   - 检查右图是否有多余物体?(重点检查:是否残留了人台支架、模特的手脚、头部、多余的裤头/裙头)。
+   - 检查右图是否丢失关键细节?(重点检查:内衬是否丢失、吊带是否消失、领口结构是否错误)。
+
+2. **判断决策**:
+   - 如果右图完全符合“无模特、无背景、细节还原”的平铺图标准,则成功。
+   - 如果有任何不一致(多了人、少了内衬、款式不对),则失败。
+
+3. **提示词优化策略**:
+   - 如果失败,请在原提示词基础上修改。
+   - 出现人/人台 -> 增加负面约束或关键词:", 隐形模特, 去除人台, 纯白背景, no human, ghost mannequin"
+   - 丢失内衬 -> 增加:", 展示内衬, visible inner lining"
+   - 细节丢失 -> 增加对应部位的特写描述,如:", 细吊带, spaghetti straps"
+   - **注意**:输出的提示词只能包含用于生图的内容,绝对不要包含“左图”、“右图”、“原图”等描述性文字。
+
+### 输出格式
+请直接输出标准 JSON 格式,不要包含 markdown 标记(```json):
+
+{
+    "analysis": "简短的中文分析。例如:右图虽然是平铺图,但丢失了左图的蕾丝吊带细节,且领口处有人台残留。",
+    "success": false,
+    "prompt": "优化后的完整提示词"
+}
+
+或者当完全正确时:
+{
+    "analysis": "右图完美还原了左图的款式和细节,且无模特残留。",
+    "success": true,
+    "prompt": "原提示词"
+}
+
+"""
+
+
+
+
+
+
+

+ 160 - 0
scr/qwen_edit.py

@@ -0,0 +1,160 @@
+"""
+通义千问图片编辑模块
+
+使用通义千问图片编辑模型进行图片编辑
+"""
+
+import os
+import json
+import base64
+import mimetypes
+import requests
+import dashscope
+from dashscope import MultiModalConversation
+
+# 配置API地址(中国北京地域)
+# 若使用新加坡地域的模型,需将url替换为:https://dashscope-intl.aliyuncs.com/api/v1
+dashscope.base_http_api_url = 'https://dashscope.aliyuncs.com/api/v1'
+
+# API Key配置
+# 获取API Key:https://help.aliyun.com/zh/model-studio/get-api-key
+api_key = "sk-04b63960983445f980d85ff185a17876"
+
+def download_image(image_url, save_path='output.png'):
+    """
+    下载图片到本地
+    
+    Args:
+        image_url: 图片URL
+        save_path: 保存路径
+    """
+    try:
+        response = requests.get(image_url, stream=True, timeout=300)
+        response.raise_for_status()
+        with open(save_path, 'wb') as f:
+            for chunk in response.iter_content(chunk_size=8192):
+                f.write(chunk)
+        print(f"图像已成功下载到: {save_path}")
+    except requests.exceptions.RequestException as e:
+        print(f"图像下载失败: {e}")
+
+
+def encode_file(file_path):
+    """
+    将图片文件编码为base64格式的data URI
+    
+    Args:
+        file_path: 图片文件路径
+    
+    Returns:
+        base64编码的data URI字符串
+    
+    Raises:
+        ValueError: 如果文件格式不支持
+        IOError: 如果读取文件失败
+    """
+    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)}")
+
+
+
+def qwen_edit(image_path, prompt, save_path):
+    """
+    使用通义千问图片编辑模型编辑单张图片
+    
+    Args:
+        image_path: 输入图片路径
+        prompt: 编辑提示词
+        save_path: 保存路径
+    """
+    image = encode_file(image_path)
+
+    messages = [
+        {
+            "role": "user",
+            "content": [
+                {"image": image},
+                {"text": prompt}
+            ]
+        }
+    ]
+
+    # 调用图片编辑模型
+    # qwen-image-edit-plus支持输出1-6张图片,此处设置为1张
+    response = MultiModalConversation.call(
+        api_key=api_key,
+        model="qwen-image-edit-plus-2025-10-30",
+        messages=messages,
+        stream=False,
+        n=1,
+        watermark=False,
+        negative_prompt="不要随意减少纽扣或者随意增加纽扣",
+        prompt_extend=False,
+        # 仅当输出图像数量n=1时支持设置size参数,否则会报错
+        # size="2048*1024",
+    )
+
+    if response.status_code == 200:
+        for i, content in enumerate(response.output.choices[0].message.content):
+            print(f"输出图像{i+1}的URL: {content['image']}")
+            download_image(content['image'], save_path)
+    else:
+        print(f"HTTP返回码:{response.status_code}")
+        print(f"错误码:{response.code}")
+        print(f"错误信息:{response.message}")
+        print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
+
+
+def qwen_edit_mutil(image_path_list, prompt, save_path):
+    """
+    使用通义千问图片编辑模型编辑多张图片
+    
+    Args:
+        image_path_list: 输入图片路径列表
+        prompt: 编辑提示词
+        save_path: 保存路径
+    """
+    images = [{"image": encode_file(image_path)} for image_path in image_path_list]
+
+    messages = [
+        {
+            "role": "user",
+            "content": images + [{"text": prompt}]
+        }
+    ]
+
+    # 调用图片编辑模型
+    response = MultiModalConversation.call(
+        api_key=api_key,
+        model="qwen-image-edit-plus-2025-10-30",
+        messages=messages,
+        stream=False,
+        n=1,
+        watermark=False,
+        negative_prompt="不要随意减少纽扣或者随意增加纽扣",
+        prompt_extend=False,
+    )
+
+    if response.status_code == 200:
+        for i, content in enumerate(response.output.choices[0].message.content):
+            print(f"输出图像{i+1}的URL: {content['image']}")
+            download_image(content['image'], save_path)
+    else:
+        print(f"HTTP返回码:{response.status_code}")
+        print(f"错误码:{response.code}")
+        print(f"错误信息:{response.message}")
+        print("请参考文档:https://help.aliyun.com/zh/model-studio/developer-reference/error-code")
+
+
+if __name__ == "__main__":
+    image_path = [r"H:\data\线稿图\S1261C003.jpg",r"C:\Users\PC\Desktop\企业微信截图_17636312608996.png"]
+    prompt = "提取出图1里面整条裤子的平铺精修图,保持原比例,保留衣服的细节,不要随意增加纽扣,图2是图1的细节的补充参考图(图2仅供参考),要严格保留纽扣的数量"
+    qwen_edit_mutil(image_path,prompt,save_path=r"H:\data\线稿图\S1261C003_S1261C003_concatenated.jpg")

+ 738 - 0
scr/sketch.py

@@ -0,0 +1,738 @@
+"""
+线稿图生成模块
+
+功能:
+1. 从服装款式图生成平铺图
+2. 使用 ControlNet linear 模型从平铺图提取线稿
+3. 自动质量检查
+4. 批量处理图片
+"""
+
+import os
+import json
+import glob
+import io
+import tempfile
+import requests
+from datetime import datetime
+from typing import List, Optional
+from PIL import Image
+
+from .check import process_image_pair_with_gemini
+from .conf import check_prompt
+from .upload_tos import process_cropped_upload, upload_image
+from .qwen_edit import qwen_edit
+from .llm import llm_request
+from .conf import ali_ky
+from .prompt import flat_layout_prompt_v2
+from .logger_setup import logger
+
+
+# ==================== 常量定义 ====================
+
+DEFAULT_SKETCH_DIR = r"D:\线稿图\线稿图"
+DEFAULT_LOG_FILE = "sketch_log.json"
+
+# 默认线稿图生成提示词
+DEFAULT_SKETCH_PROMPT = (
+    "生成图片里衣服(如果有内衬则包括内衬)的服装平面款式图,"
+    "要平铺效果的线稿,仅仅保留外部轮廓和关键结构,"
+    "无多余拼接线,去除颜色,保持原比例,去除褶皱,"
+    "不要添加或删减元素,保持衣服的细节,只保留衣服的线稿,"
+    "去除其他非衣服之外的元素"
+)
+
+IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', 
+                    '.JPG', '.JPEG', '.PNG', '.BMP', '.GIF']
+
+# 最大重试次数
+MAX_RETRY_COUNT = 2
+
+
+# ==================== 平铺图生成函数 ====================
+
+def generate_flat_layout_from_url(
+    image_url: str,
+    prompt: Optional[str] = None
+) -> Optional[str]:
+    """
+    从图片URL生成平铺图
+    
+    Args:
+        image_url: 款式图片URL
+        prompt: 平铺图生成提示词,如果为None则自动生成
+    
+    Returns:
+        生成的平铺图URL,失败返回None
+    """
+    try:
+        # 下载图片到临时文件
+        response = requests.get(image_url, timeout=30)
+        response.raise_for_status()
+        
+        # 创建临时文件
+        with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as tmp_file:
+            tmp_file.write(response.content)
+            tmp_path = tmp_file.name
+        
+        try:
+            # 如果没有提供提示词,使用LLM生成
+            if prompt is None:
+                logger.info("自动生成平铺图提示词...")
+                llm = llm_request(api_key=ali_ky[0], base_url=ali_ky[1], model="qwen3-vl-plus")
+                prompt = llm.llm_mm_request(
+                    usr_text="帮我生成这条衣服的平铺图指令",
+                    img=tmp_path,
+                    sys_text=flat_layout_prompt_v2
+                )
+                logger.info(f"生成的提示词: {prompt}")
+            
+            # 创建临时文件保存平铺图
+            with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as flat_tmp:
+                flat_layout_path = flat_tmp.name
+            
+            # 使用qwen_edit生成平铺图
+            logger.info("开始生成平铺图...")
+            qwen_edit(tmp_path, prompt, flat_layout_path)
+            
+            # 检查文件是否生成成功
+            if not os.path.exists(flat_layout_path) or os.path.getsize(flat_layout_path) == 0:
+                logger.error("平铺图生成失败")
+                return None
+            
+            # 上传平铺图到TOS
+            flat_layout_url = upload_image(flat_layout_path)
+            
+            # 清理临时文件
+            try:
+                os.unlink(tmp_path)
+                os.unlink(flat_layout_path)
+            except:
+                pass
+            
+            if flat_layout_url:
+                logger.info(f"✅ 平铺图生成成功: {flat_layout_url}")
+                return flat_layout_url
+            else:
+                logger.error("上传平铺图失败")
+                return None
+                
+        except Exception as e:
+            logger.error(f"生成平铺图时出错: {e}")
+            # 清理临时文件
+            try:
+                os.unlink(tmp_path)
+            except:
+                pass
+            return None
+            
+    except Exception as e:
+        logger.error(f"下载图片失败: {e}")
+        return None
+
+
+# ==================== ControlNet Linear 线稿提取函数 ====================
+
+def extract_lineart_with_controlnet(
+    image_url: str,
+    controlnet_model: str = "lineart",
+    api_key: Optional[str] = None
+) -> Optional[Image.Image]:
+    """
+    使用 ControlNet linear 模型从图片中提取线稿
+    
+    Args:
+        image_url: 输入图片URL(平铺图)
+        controlnet_model: ControlNet模型类型,默认为 "lineart"
+        api_key: API密钥(可选,从环境变量获取)
+    
+    Returns:
+        PIL Image对象(线稿图),失败返回None
+    """
+    try:
+        # 尝试使用 FAL API(如果可用)
+        fal_key = api_key or os.environ.get("FAL_KEY")
+        
+        if fal_key:
+            return _extract_lineart_with_fal(image_url, fal_key, controlnet_model)
+        else:
+            # 如果没有 FAL API,使用其他 ControlNet 服务
+            # 这里可以添加其他 ControlNet API 调用
+            logger.warning("FAL_KEY 未设置,尝试使用本地 ControlNet 处理")
+            return _extract_lineart_local(image_url)
+            
+    except Exception as e:
+        logger.error(f"提取线稿时出错: {e}")
+        return None
+
+
+def _extract_lineart_with_fal(
+    image_url: str,
+    api_key: str,
+    controlnet_model: str = "lineart"
+) -> Optional[Image.Image]:
+    """
+    使用 FAL API 的 ControlNet 服务提取线稿
+    
+    Args:
+        image_url: 输入图片URL
+        api_key: FAL API密钥
+        controlnet_model: ControlNet模型类型
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    try:
+        import fal_client
+        
+        logger.info(f"使用 FAL API 提取线稿: {image_url}")
+        
+        # 调用 FAL API 的 ControlNet lineart 模型
+        result = fal_client.subscribe(
+            "fal-ai/controlnet-lineart",
+            arguments={
+                "image_url": image_url,
+                "model": controlnet_model
+            },
+            api_key=api_key
+        )
+        
+        # 获取结果图片URL
+        if result and "images" in result:
+            output_url = result["images"][0].get("url") if isinstance(result["images"], list) else result["images"].get("url")
+            
+            if output_url:
+                # 下载生成的线稿图
+                response = requests.get(output_url, timeout=30)
+                response.raise_for_status()
+                img = Image.open(io.BytesIO(response.content)).convert("RGB")
+                logger.info("✅ 线稿提取成功")
+                return img
+        
+        logger.error("FAL API 返回结果格式错误")
+        return None
+        
+    except ImportError:
+        logger.warning("fal_client 未安装,尝试使用 HTTP 请求")
+        return _extract_lineart_with_http(image_url, api_key, controlnet_model)
+    except Exception as e:
+        logger.error(f"FAL API 调用失败: {e}")
+        return None
+
+
+def _extract_lineart_with_http(
+    image_url: str,
+    api_key: str,
+    controlnet_model: str = "lineart"
+) -> Optional[Image.Image]:
+    """
+    使用 HTTP 请求调用 FAL API 提取线稿
+    
+    Args:
+        image_url: 输入图片URL
+        api_key: FAL API密钥
+        controlnet_model: ControlNet模型类型
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    try:
+        url = "https://fal.run/fal-ai/controlnet-lineart"
+        headers = {
+            "Authorization": f"Key {api_key}",
+            "Content-Type": "application/json"
+        }
+        payload = {
+            "image_url": image_url,
+            "model": controlnet_model
+        }
+        
+        response = requests.post(url, json=payload, headers=headers, timeout=60)
+        response.raise_for_status()
+        
+        result = response.json()
+        
+        # 获取结果图片URL
+        if result and "images" in result:
+            output_url = result["images"][0].get("url") if isinstance(result["images"], list) else result["images"].get("url")
+            
+            if output_url:
+                # 下载生成的线稿图
+                img_response = requests.get(output_url, timeout=30)
+                img_response.raise_for_status()
+                img = Image.open(io.BytesIO(img_response.content)).convert("RGB")
+                logger.info("✅ 线稿提取成功")
+                return img
+        
+        logger.error("HTTP API 返回结果格式错误")
+        return None
+        
+    except Exception as e:
+        logger.error(f"HTTP API 调用失败: {e}")
+        return None
+
+
+def _extract_lineart_local(image_url: str) -> Optional[Image.Image]:
+    """
+    使用本地方法提取线稿(简单的边缘检测)
+    
+    注意:这是一个备用方案,效果不如 ControlNet
+    如果可能,建议使用 FAL API 或其他 ControlNet 服务
+    
+    Args:
+        image_url: 输入图片URL
+    
+    Returns:
+        PIL Image对象,失败返回None
+    """
+    try:
+        import cv2
+        import numpy as np
+        
+        logger.info("使用本地方法提取线稿(边缘检测)...")
+        
+        # 下载图片
+        response = requests.get(image_url, timeout=30)
+        response.raise_for_status()
+        # 将字节数据转换为numpy数组
+        img_array = np.asarray(bytearray(response.content), dtype=np.uint8)
+        img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
+        
+        # 转换为灰度图
+        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+        
+        # 使用 Canny 边缘检测
+        edges = cv2.Canny(gray, 50, 150)
+        
+        # 反转颜色(黑底白线 -> 白底黑线)
+        edges = 255 - edges
+        
+        # 转换回 PIL Image
+        pil_img = Image.fromarray(edges).convert("RGB")
+        
+        logger.info("✅ 本地线稿提取完成(使用边缘检测)")
+        return pil_img
+        
+    except ImportError:
+        logger.error("OpenCV 未安装,无法使用本地方法")
+        return None
+    except Exception as e:
+        logger.error(f"本地线稿提取失败: {e}")
+        return None
+
+
+# ==================== 核心功能函数 ====================
+
+def generate_sketch(
+    image_url: str,
+    prompt: Optional[str] = None,
+    save_dir: Optional[str] = None,
+    max_retries: int = MAX_RETRY_COUNT,
+    auto_check: bool = True,
+    flat_layout_prompt: Optional[str] = None,
+    controlnet_model: str = "lineart"
+) -> Optional[str]:
+    """
+    生成服装线稿图(新流程:先生成平铺图,再提取线稿)
+    
+    流程:
+    1. 从款式图生成平铺图(使用 qwen_edit)
+    2. 使用 ControlNet linear 模型从平铺图提取线稿
+    3. 质量检查(可选)
+    
+    Args:
+        image_url: 款式图片URL
+        prompt: 线稿图提示词(已废弃,保留用于兼容)
+        save_dir: 保存目录,如果为None则不保存到本地
+        max_retries: 最大重试次数
+        auto_check: 是否自动质量检查
+        flat_layout_prompt: 平铺图生成提示词,如果为None则自动生成
+        controlnet_model: ControlNet模型类型,默认为 "lineart"
+    
+    Returns:
+        生成的线稿图URL,失败返回None
+    """
+    if not image_url:
+        logger.error("图片URL不能为空")
+        return None
+    
+    logger.info(f"开始生成线稿图(新流程): {image_url}")
+    logger.info("流程:款式图 → 平铺图 → 线稿图")
+    
+    # 尝试生成线稿图,最多重试max_retries次
+    for attempt in range(max_retries):
+        logger.info(f"第 {attempt + 1}/{max_retries} 次尝试生成线稿图")
+        
+        try:
+            # 第一步:生成平铺图
+            logger.info("=" * 50)
+            logger.info("步骤 1/2: 生成平铺图")
+            logger.info("=" * 50)
+            
+            flat_layout_url = generate_flat_layout_from_url(
+                image_url=image_url,
+                prompt=flat_layout_prompt
+            )
+            
+            if flat_layout_url is None:
+                logger.warning(f"第 {attempt + 1} 次生成平铺图失败,继续重试")
+                continue
+            
+            logger.info(f"✅ 平铺图生成成功: {flat_layout_url}")
+            
+            # 第二步:使用 ControlNet linear 提取线稿
+            logger.info("=" * 50)
+            logger.info("步骤 2/2: 使用 ControlNet linear 提取线稿")
+            logger.info("=" * 50)
+            
+            sketch_image = extract_lineart_with_controlnet(
+                image_url=flat_layout_url,
+                controlnet_model=controlnet_model
+            )
+            
+            if sketch_image is None:
+                logger.warning(f"第 {attempt + 1} 次提取线稿失败,继续重试")
+                continue
+            
+            # 上传线稿图获取URL
+            sketch_url = process_cropped_upload(sketch_image)
+            if sketch_url is None:
+                logger.warning(f"第 {attempt + 1} 次上传线稿图失败,继续重试")
+                continue
+            
+            logger.info(f"✅ 线稿图提取成功: {sketch_url}")
+            
+            # 如果启用自动检查,进行质量验证
+            if auto_check:
+                logger.info("=" * 50)
+                logger.info("进行质量检查...")
+                logger.info("=" * 50)
+                
+                check_result = process_image_pair_with_gemini(
+                    image1_url=image_url,
+                    image2_url=sketch_url,
+                    prompt=check_prompt
+                )
+                
+                if check_result:
+                    check_result = check_result.strip()
+                    # 检查是否通过(回答"是")
+                    if check_result and ("是" in check_result or check_result[0] == "是"):
+                        logger.info(f"✅ 质量检查通过: {check_result}")
+                        logger.info(f"✅ 线稿图生成成功: {sketch_url}")
+                        return sketch_url
+                    else:
+                        logger.warning(f"⚠️ 质量检查未通过: {check_result}")
+                        if attempt < max_retries - 1:
+                            logger.info("继续重试...")
+                            continue
+                else:
+                    logger.warning("质量检查失败,但继续使用生成的图片")
+            
+            # 如果没有启用检查或检查失败但达到最大重试次数,返回结果
+            logger.info(f"✅ 线稿图生成成功: {sketch_url}")
+            return sketch_url
+            
+        except Exception as e:
+            logger.error(f"第 {attempt + 1} 次尝试时出错: {e}")
+            if attempt < max_retries - 1:
+                continue
+            else:
+                logger.error(f"❌ 生成线稿图失败: {e}")
+                return None
+    
+    logger.error("❌ 达到最大重试次数,生成线稿图失败")
+    return None
+
+
+def generate_sketch_from_local(
+    image_path: str,
+    prompt: Optional[str] = None,
+    save_dir: Optional[str] = None,
+    max_retries: int = MAX_RETRY_COUNT,
+    auto_check: bool = True,
+    model: str = "gemini-2.5-flash-image",
+    resolution: str = "1K"
+) -> Optional[str]:
+    """
+    从本地图片文件生成线稿图
+    
+    首先上传本地图片到TOS获取URL,然后调用generate_sketch
+    
+    Args:
+        image_path: 本地图片路径
+        prompt: 提示词
+        save_dir: 保存目录
+        max_retries: 最大重试次数
+        auto_check: 是否自动质量检查
+        model: 使用的模型
+        resolution: 分辨率
+    
+    Returns:
+        生成的线稿图URL,失败返回None
+    """
+    if not os.path.exists(image_path):
+        logger.error(f"图片文件不存在: {image_path}")
+        return None
+    
+    try:
+        # 上传本地图片获取URL
+        from .upload_tos import upload_image
+        image_url = upload_image(image_path)
+        
+        if image_url is None:
+            logger.error("上传图片失败")
+            return None
+        
+        logger.info(f"图片已上传: {image_url}")
+        
+        # 调用生成函数
+        return generate_sketch(
+            image_url=image_url,
+            prompt=prompt,
+            save_dir=save_dir,
+            max_retries=max_retries,
+            auto_check=auto_check,
+            model=model,
+            resolution=resolution
+        )
+        
+    except Exception as e:
+        logger.error(f"处理本地图片时出错: {e}")
+        return None
+
+
+# ==================== 工具函数 ====================
+
+def get_image_files(directory: str, extensions: Optional[List[str]] = None) -> List[str]:
+    """
+    获取目录下所有图片文件
+    
+    Args:
+        directory: 目录路径
+        extensions: 图片扩展名列表
+    
+    Returns:
+        图片文件路径列表(已排序)
+    """
+    if extensions is None:
+        extensions = IMAGE_EXTENSIONS
+    
+    image_files = []
+    if not os.path.exists(directory):
+        return image_files
+    
+    for ext in extensions:
+        pattern = os.path.join(directory, f'*{ext}')
+        image_files.extend(glob.glob(pattern))
+    
+    return sorted(image_files)
+
+
+def save_sketch_log(image_url: str, sketch_url: str, prompt: str, 
+                   log_file: str = DEFAULT_LOG_FILE) -> None:
+    """
+    保存线稿图生成记录到JSON文件
+    
+    Args:
+        image_url: 原始图片URL
+        sketch_url: 生成的线稿图URL
+        prompt: 使用的提示词
+        log_file: 日志文件路径
+    """
+    log_data = {
+        "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+        "image_url": image_url,
+        "sketch_url": sketch_url,
+        "prompt": prompt
+    }
+    
+    # 读取现有数据
+    if os.path.exists(log_file):
+        try:
+            with open(log_file, 'r', encoding='utf-8') as f:
+                data = json.load(f)
+        except (json.JSONDecodeError, FileNotFoundError):
+            data = []
+    else:
+        data = []
+    
+    # 添加新记录
+    data.append(log_data)
+    
+    # 保存到文件
+    with open(log_file, 'w', encoding='utf-8') as f:
+        json.dump(data, f, ensure_ascii=False, indent=2)
+    
+    logger.info(f"✅ 已保存记录到 {log_file}")
+
+
+# ==================== 批量处理功能 ====================
+
+def batch_generate_sketch_from_urls(
+    image_urls: List[str],
+    prompt: Optional[str] = None,
+    max_retries: int = MAX_RETRY_COUNT,
+    auto_check: bool = True,
+    log_file: Optional[str] = None
+) -> dict:
+    """
+    批量从图片URL列表生成线稿图
+    
+    Args:
+        image_urls: 图片URL列表
+        prompt: 提示词
+        max_retries: 最大重试次数
+        auto_check: 是否自动质量检查
+        log_file: 日志文件路径,如果为None则不保存
+    
+    Returns:
+        处理结果字典,包含成功和失败的数量
+    """
+    logger.info(f"开始批量处理 {len(image_urls)} 个图片")
+    
+    success_count = 0
+    fail_count = 0
+    all_results = []
+    
+    for idx, image_url in enumerate(image_urls, 1):
+        logger.info(f"\n{'='*50}")
+        logger.info(f"处理第 {idx}/{len(image_urls)} 个图片")
+        logger.info(f"{'='*50}")
+        
+        try:
+            sketch_url = generate_sketch(
+                image_url=image_url,
+                prompt=prompt,
+                max_retries=max_retries,
+                auto_check=auto_check
+            )
+            
+            if sketch_url:
+                result = {
+                    "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+                    "image_url": image_url,
+                    "sketch_url": sketch_url,
+                    "prompt": prompt or DEFAULT_SKETCH_PROMPT,
+                    "success": True
+                }
+                all_results.append(result)
+                success_count += 1
+                
+                # 保存日志
+                if log_file:
+                    save_sketch_log(image_url, sketch_url, prompt or DEFAULT_SKETCH_PROMPT, log_file)
+            else:
+                result = {
+                    "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+                    "image_url": image_url,
+                    "success": False,
+                    "error": "生成失败"
+                }
+                all_results.append(result)
+                fail_count += 1
+                
+        except Exception as e:
+            logger.error(f"处理图片时出错: {e}")
+            result = {
+                "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
+                "image_url": image_url,
+                "success": False,
+                "error": str(e)
+            }
+            all_results.append(result)
+            fail_count += 1
+            continue
+    
+    # 保存结果到文件
+    if log_file:
+        try:
+            with open(log_file, 'w', encoding='utf-8') as f:
+                json.dump(all_results, f, ensure_ascii=False, indent=2)
+            logger.info(f"✅ 已保存处理结果到: {log_file}")
+        except Exception as e:
+            logger.error(f"保存文件时出错: {e}")
+    
+    logger.info(f"\n{'='*50}")
+    logger.info(f"✅ 批量处理完成!")
+    logger.info(f"   成功: {success_count} 个")
+    logger.info(f"   失败: {fail_count} 个")
+    logger.info(f"{'='*50}")
+    
+    return {
+        "success_count": success_count,
+        "fail_count": fail_count,
+        "total": len(image_urls),
+        "results": all_results
+    }
+
+
+def batch_generate_sketch_from_directory(
+    directory: str,
+    prompt: Optional[str] = None,
+    max_retries: int = MAX_RETRY_COUNT,
+    auto_check: bool = True,
+    log_file: Optional[str] = None
+) -> dict:
+    """
+    从目录中扫描图片,批量生成线稿图
+    
+    Args:
+        directory: 图片目录路径
+        prompt: 提示词
+        max_retries: 最大重试次数
+        auto_check: 是否自动质量检查
+        log_file: 日志文件路径
+    
+    Returns:
+        处理结果字典
+    """
+    # 获取所有图片文件
+    image_files = get_image_files(directory)
+    
+    if not image_files:
+        logger.warning(f"在目录 {directory} 中未找到图片文件")
+        return {
+            "success_count": 0,
+            "fail_count": 0,
+            "total": 0,
+            "results": []
+        }
+    
+    logger.info(f"找到 {len(image_files)} 个图片文件")
+    
+    # 上传所有图片获取URL
+    from .upload_tos import upload_image
+    image_urls = []
+    
+    for image_path in image_files:
+        try:
+            image_url = upload_image(image_path)
+            if image_url:
+                image_urls.append(image_url)
+        except Exception as e:
+            logger.error(f"上传图片失败 {image_path}: {e}")
+            continue
+    
+    logger.info(f"成功上传 {len(image_urls)} 个图片")
+    
+    # 批量生成线稿图
+    return batch_generate_sketch_from_urls(
+        image_urls=image_urls,
+        prompt=prompt,
+        max_retries=max_retries,
+        auto_check=auto_check,
+        log_file=log_file
+    )
+
+
+# ==================== 主程序入口 ====================
+
+if __name__ == "__main__":
+    # 示例:从单个图片URL生成线稿图
+    test_image_url = "https://example.com/garment.jpg"
+    result = generate_sketch(test_image_url)
+    if result:
+        print(f"✅ 线稿图生成成功: {result}")
+    else:
+        print("❌ 线稿图生成失败")

+ 104 - 0
scr/upload_tos.py

@@ -0,0 +1,104 @@
+"""
+上传服务模块
+处理图像上传到TOS云存储
+"""
+
+
+from datetime import datetime
+import io
+import os
+from PIL import Image
+import PIL
+import requests
+import tos
+from logger_setup import logger
+
+table_name="ai_video_info"
+
+# 从环境变量获取 AK 和 SK 信息
+ak ='AKLTNDNlMTFlNzk4OTNmNGU1YTlhMzQ0MmJjZjViMzc0YzQ'
+sk = 'T0dReU1USm1PVEkzT0RSa05EY3hZamt6Wm1SalpqUmlOamhqTnpZMVlUVQ=='
+
+# 存储桶配置信息
+endpoint = "https://tos-cn-guangzhou.volces.com"
+region = "cn-guangzhou" 
+bucket_name = "guide-material"
+
+
+def upload_image(image):
+    try:
+        if isinstance(image,str):
+            if image.startswith("http"):
+                temp_img = requests.get(image, timeout=30)
+                temp_img.raise_for_status()
+                temp_img = Image.open(io.BytesIO(temp_img.content)).convert("RGB")
+                
+            else:
+                temp_img = Image.open(image).convert("RGB")
+            image_url=process_cropped_upload(temp_img)
+        elif isinstance(image, Image.Image):
+            image_url=process_cropped_upload(image)
+        logger.info(f'上传图片成功: {image_url}')
+        return image_url
+    except Exception as e:
+        error_msg = f'上传失败,未知错误: {str(e)}'
+        raise Exception(error_msg)
+
+
+def process_cropped_upload(pil_image) :
+                    # 保存到 temp(时间戳命名)
+    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
+    filename = f"cropped_{timestamp}.png"
+    temp_dir = os.path.join(os.path.dirname(__file__), "temp")
+    os.makedirs(temp_dir, exist_ok=True)
+    local_path = os.path.join(temp_dir, filename)
+    pil_image.save(local_path, format="PNG")
+
+    # 上传到 TOS,成功后删除临时文件并替换最终链接
+    uploaded_url = upload_file_to_tos(local_path)
+    if uploaded_url:
+        # try:
+        #     os.remove(local_path)
+        #     logger.info(f"已上传并删除裁剪后的临时文件: {local_path}")
+        # except Exception as del_err:
+        #     logger.warning(f"删除临时文件失败: {del_err}")
+        return uploaded_url
+    else:
+        logger.warning(f"TOS 上传失败,保留临时文件: {local_path}")
+        return ''
+
+
+
+def upload_file_to_tos(file_path: str, dir_path="design_image") -> str:
+    """上传文件到TOS云存储"""
+    try:
+        # 从文件路径中提取文件名作为object_key
+        object_key = dir_path+'/'+os.path.basename(file_path)
+        logger.info(f'开始上传文件: {file_path}')
+        logger.info(f'文件将保存为: {object_key}')
+        
+        # 创建客户端并上传文件
+        client = tos.TosClientV2(ak, sk, endpoint, region)
+        client.put_object_from_file(bucket_name, object_key, file_path)
+        
+        # 生成访问URL
+        # object_url = f"https://{bucket_name}.{endpoint.split('//')[1]}/{object_key}"
+        object_url = f"https://testdgxcx-oss.gloria.com.cn/{object_key}"
+        logger.info(f'文件上传成功,访问URL: {object_url}')
+        return object_url
+        
+    except tos.exceptions.TosClientError as e:
+        error_msg = f'上传失败,客户端错误: message={e.message}, cause={e.cause}'
+        logger.error(error_msg)
+        raise Exception(error_msg)
+    except tos.exceptions.TosServerError as e:
+        error_msg = f'上传失败,服务端错误: code={e.code}, request_id={e.request_id}, message={e.message}, status_code={e.status_code}, ec={e.ec}, request_url={e.request_url}'
+        logger.error(error_msg)
+        raise Exception(error_msg)
+    except Exception as e:
+        error_msg = f'上传失败,未知错误: {str(e)}'
+        logger.error(error_msg)
+        raise Exception(error_msg)
+
+if __name__=="__main__":
+    upload_file_to_tos(file_path=r"D:\AI模特流程\历史.xlsx")

+ 226 - 0
scr/utils.py

@@ -0,0 +1,226 @@
+"""
+工具函数模块
+
+包含图片处理、JSON解析等通用工具函数
+"""
+
+import os
+import json
+from PIL import Image
+
+def parse_json_output(ai_response_text):
+    """
+    尝试将AI的回复解析为JSON对象
+    
+    Args:
+        ai_response_text: AI返回的字符串
+    
+    Returns:
+        (success, data): 
+            success: 是否解析成功
+            data: 解析后的数据字典,如果失败则包含error字段
+    """
+    try:
+        # 1. 清洗数据:有时候 AI 会不听话地加上 ```json ... ```,这里做个简单的清洗
+        cleaned_text = ai_response_text.strip()
+        if cleaned_text.startswith("```"):
+            cleaned_text = cleaned_text.replace("```json", "").replace("```", "")
+        
+        # 2. 尝试解析
+        data = json.loads(cleaned_text)
+        
+        # 3. 验证关键字段是否存在
+        if "success" in data and "prompt" in data:
+            return True, data
+        else:
+            return False, {"error": "JSON格式合法,但缺少 success 或 prompt 字段"}
+
+    except json.JSONDecodeError as e:
+        return False, {"error": f"JSON解析失败: {str(e)}", "raw_text": ai_response_text}
+
+
+def resize_proportional(image, target_width, target_height):
+    """
+    按照目标尺寸等比例缩放图片,保持宽高比
+    计算长和宽的比例,取较小值以确保图片完全适应目标尺寸
+    
+    Args:
+        image: PIL Image 对象
+        target_width: 目标宽度
+        target_height: 目标高度
+    
+    Returns:
+        缩放后的 PIL Image 对象
+    """
+    width, height = image.size
+    
+    # 计算宽度和高度分别的比例
+    width_ratio = target_width / width
+    height_ratio = target_height / height
+    
+    # 取较小的比例,确保图片不会超出目标尺寸,同时保持宽高比
+    ratio = min(width_ratio, height_ratio)
+    
+    new_width = int(width * ratio)
+    new_height = int(height * ratio)
+    
+    return image.resize((new_width, new_height), Image.Resampling.LANCZOS)
+
+
+def center_image_on_white_background(image, target_width, target_height):
+    """
+    将图片居中放在白底图上
+    
+    Args:
+        image: PIL Image 对象(需要放置的图片)
+        target_width: 目标宽度
+        target_height: 目标高度
+    
+    Returns:
+        居中放置在白底图上的 PIL Image 对象
+    """
+    # 创建白底图
+    white_background = Image.new('RGB', (target_width, target_height), (255, 255, 255))
+    
+    # 计算居中位置
+    img_width, img_height = image.size
+    x_offset = (target_width - img_width) // 2
+    y_offset = (target_height - img_height) // 2
+    
+    # 如果图片是 RGBA 模式,需要处理透明度
+    if image.mode == 'RGBA':
+        white_background.paste(image, (x_offset, y_offset), image)
+    else:
+        white_background.paste(image, (x_offset, y_offset))
+    
+    return white_background
+
+
+def prepare_second_image(second_image_path, first_image_size):
+    """
+    准备第二张图片:生成白底图,按照第一张图的长宽比例等比例缩放并居中放置
+    
+    Args:
+        second_image_path: 第二张图片路径
+        first_image_size: 第一张图片的尺寸 (width, height)
+    
+    Returns:
+        处理后的 PIL Image 对象
+    """
+    # 读取第二张图片
+    second_img = Image.open(second_image_path)
+    
+    # 转换为 RGB 模式(如果不是的话)
+    if second_img.mode != 'RGB' and second_img.mode != 'RGBA':
+        second_img = second_img.convert('RGB')
+    
+    target_width, target_height = first_image_size
+    
+    # 按照第一张图的长宽比例等比例缩放第二张图(保持宽高比)
+    resized_second = resize_proportional(second_img, target_width, target_height)
+    
+    # 居中放在白底图上
+    final_second = center_image_on_white_background(resized_second, target_width, target_height)
+    
+    return final_second
+
+
+def horizontal_concatenate_images(image1_path, image2_path, output_path=None):
+    """
+    将两张图片横向拼接,第二张图会按照第一张图的尺寸进行调整
+    
+    Args:
+        image1_path: 第一张图片路径(作为尺寸参考)
+        image2_path: 第二张图片路径
+        output_path: 输出图片路径,如果为None则自动生成
+    
+    Returns:
+        输出图片路径
+    """
+    # 读取第一张图片
+    first_img = Image.open(image1_path)
+    
+    # 转换为 RGB 模式(如果不是的话)
+    if first_img.mode != 'RGB' and first_img.mode != 'RGBA':
+        first_img = first_img.convert('RGB')
+    
+    # 获取第一张图的尺寸
+    first_width, first_height = first_img.size
+    
+    # 准备第二张图片
+    second_img = prepare_second_image(image2_path, (first_width, first_height))
+    
+    # 横向拼接两张图片
+    # 总宽度 = 第一张图宽度 + 第二张图宽度
+    # 总高度 = 两张图中较高的那个
+    total_width = first_width + second_img.width
+    total_height = max(first_height, second_img.height)
+    
+    # 创建拼接后的图片
+    concatenated = Image.new('RGB', (total_width, total_height), (255, 255, 255))
+    
+    # 粘贴第一张图(左侧)
+    concatenated.paste(first_img, (0, 0))
+    
+    # 粘贴第二张图(右侧)
+    concatenated.paste(second_img, (first_width, 0))
+    draw = ImageDraw.Draw(concatenated)
+    
+    # A. 画一条红色的分割线
+    line_width = max(2, int(total_width * 0.005)) # 根据图片大小动态调整线宽
+    draw.line([(first_width, 0), (first_width, total_height)], fill="red", width=line_width)
+    
+    # B. 准备字体 (尝试加载系统字体,为了防止中文乱码,我们主要用英文标签,模型读英文完全没问题)
+    # 字体大小动态设为图片宽度的 4%
+    font_size = int(total_width * 0.04)
+    try:
+        # 尝试加载常见字体(Windows/Linux兼容性尝试)
+        # 注意:如果你的环境是 Linux docker,可能需要指定具体的 ttf 路径,例如 /usr/share/fonts/...
+        font = ImageFont.truetype("arial.ttf", font_size)
+    except IOError:
+        try:
+            font = ImageFont.truetype("DejaVuSans.ttf", font_size)
+        except IOError:
+            # 如果都找不到,使用默认字体(通常很小,但总比报错好)
+            print("⚠️ 未找到系统字体,使用默认字体,可能较小")
+            font = ImageFont.load_default()
+
+    # C. 定义标签文本 (用英文更稳妥,Qwen识别英文非常准)
+    text_left = "REFERENCE (Original)"
+    text_right = "GENERATED (Flat Lay)"
+    
+    # D. 绘制文字(带描边,防止背景色干扰)
+    # 左侧文字位置
+    draw.text((20, 20), text_left, fill="red", font=font, stroke_width=2, stroke_fill="white")
+    
+    # 右侧文字位置 (起始点是第一张图宽度 + 偏移量)
+    draw.text((first_width + 20, 20), text_right, fill="red", font=font, stroke_width=2, stroke_fill="white")   
+    # 生成输出路径
+    if output_path is None:
+        base_name1 = os.path.splitext(os.path.basename(image1_path))[0]
+        base_name2 = os.path.splitext(os.path.basename(image2_path))[0]
+        output_dir = r"D:\线稿图\temp"
+        output_path = os.path.join(output_dir, f"{base_name1}_{base_name2}_concatenated.jpg")
+    
+    # 保存拼接后的图片
+    concatenated.save(output_path, quality=95)
+    
+    print(f"✅ 图片拼接完成: {output_path}")
+    print(f"   第一张图尺寸: {first_width}x{first_height}")
+    print(f"   第二张图原始尺寸: {Image.open(image2_path).size}")
+    print(f"   第二张图处理后尺寸: {second_img.size}")
+    print(f"   拼接后尺寸: {total_width}x{total_height}")
+    
+    return output_path
+
+
+if __name__ == "__main__":
+    # 示例用法
+    image1 = r"H:\data\线稿图\S1261A097.jpg"
+    image2 = r"D:\线稿图\平面图2\S1261A097.jpg"
+    
+    if os.path.exists(image1) and os.path.exists(image2):
+        horizontal_concatenate_images(image1, image2)
+    else:
+        print("请修改示例中的图片路径")
+

+ 95 - 0
scr/utils/image_io.py

@@ -0,0 +1,95 @@
+import io
+import hashlib
+from typing import List
+
+import numpy as np
+from PIL import Image
+
+try:
+    import torch
+except Exception:  # pragma: no cover - ComfyUI provides torch
+    torch = None
+
+
+def _ensure_torch_available():
+    if torch is None:
+        raise RuntimeError("PyTorch is required in ComfyUI runtime but was not found.")
+
+
+def tensor_to_pil_list(image_tensor) -> List[Image.Image]:
+    """Convert ComfyUI IMAGE tensor [B,H,W,C] float32(0..1) to list of PIL.Image (RGB).
+
+    Supports batch processing; returns one PIL image per batch.
+    """
+    _ensure_torch_available()
+
+    if image_tensor is None:
+        raise ValueError("image_tensor is None")
+
+    if not isinstance(image_tensor, torch.Tensor):
+        raise TypeError("Expected image_tensor to be a torch.Tensor")
+
+    if image_tensor.ndim != 4 or image_tensor.shape[-1] != 3:
+        raise ValueError(
+            f"Expected image tensor shape [B,H,W,3], got {tuple(image_tensor.shape)}"
+        )
+
+    images: List[Image.Image] = []
+    batch, height, width, channels = image_tensor.shape
+
+    image_tensor = image_tensor.detach().cpu().clamp(0.0, 1.0)
+    np_images = (image_tensor.numpy() * 255.0).astype(np.uint8)
+    for i in range(batch):
+        arr = np_images[i]
+        img = Image.fromarray(arr, mode="RGB")
+        images.append(img)
+    return images
+
+
+def pil_list_to_tensor(images: List[Image.Image]):
+    """Convert list of PIL.Image (RGB) to ComfyUI IMAGE tensor [B,H,W,C] float32(0..1)."""
+    _ensure_torch_available()
+
+    if not images:
+        raise ValueError("images list is empty")
+
+    tensors = []
+    for img in images:
+        if img.mode != "RGB":
+            img = img.convert("RGB")
+        arr = np.array(img).astype(np.float32) / 255.0
+        t = torch.from_numpy(arr)
+        tensors.append(t)
+
+    # Stack along batch dimension; ComfyUI expects [B,H,W,C]
+    batch_tensor = torch.stack(tensors, dim=0)
+    return batch_tensor
+
+
+def pil_to_png_bytes(img: Image.Image) -> bytes:
+    if img.mode != "RGB":
+        img = img.convert("RGB")
+    buf = io.BytesIO()
+    img.save(buf, format="PNG")
+    return buf.getvalue()
+
+
+def bytes_to_pil_image(data: bytes) -> Image.Image:
+    return Image.open(io.BytesIO(data)).convert("RGB")
+
+
+def sha256_bytes(data: bytes) -> str:
+    return hashlib.sha256(data).hexdigest()
+
+
+def hash_pil_image(img: Image.Image) -> str:
+    return sha256_bytes(pil_to_png_bytes(img))
+
+
+def hash_pil_images(images: List[Image.Image]) -> str:
+    hasher = hashlib.sha256()
+    for img in images:
+        hasher.update(pil_to_png_bytes(img))
+    return hasher.hexdigest()
+
+

+ 31 - 0
scr/utils/result_cache.py

@@ -0,0 +1,31 @@
+from collections import OrderedDict
+from threading import RLock
+from typing import Optional
+
+
+class ResultCache:
+    """Simple thread-safe LRU cache for storing small binary results (e.g., PNG bytes)."""
+
+    def __init__(self, max_items: int = 64):
+        self._lock = RLock()
+        self._store: OrderedDict[str, bytes] = OrderedDict()
+        self._max_items = max_items
+
+    def get(self, key: str) -> Optional[bytes]:
+        with self._lock:
+            value = self._store.get(key)
+            if value is not None:
+                self._store.move_to_end(key)
+            return value
+
+    def set(self, key: str, value: bytes) -> None:
+        with self._lock:
+            self._store[key] = value
+            self._store.move_to_end(key)
+            if len(self._store) > self._max_items:
+                self._store.popitem(last=False)
+
+
+GLOBAL_RESULT_CACHE = ResultCache(max_items=96)
+
+