File size: 3,553 Bytes
8dbd049
 
 
 
 
 
 
 
 
 
 
fc94a64
 
8dbd049
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import requests
import os
import time

# --- 配置 ---

# 您的 API 端点基础 URL
api_base_url = "https://blueskyxn-imagemagickapi-hfs.hf.space"

# 转换参数: 格式/模式/设置
target_format = "avif"  # avif, webp, jpeg, png, gif, heif
mode = "lossless"          # lossy, lossless
setting = 0            # 0-100 (有损模式为质量, 无损模式为压缩速度)

# 构建完整的 API URL
api_url = f"{api_base_url}/convert/{target_format}/{mode}/{setting}"

# 您要测试的本地图片路径
input_image_path = r"/Volumes/TP4000PRO/582434E54A64FCB0285EFABF390AC3DB.jpg"

# 转换后的文件保存路径 (自动替换扩展名)
output_image_path = os.path.splitext(input_image_path)[0] + f".{target_format}"

# ----------------

# 检查输入文件是否存在
if not os.path.exists(input_image_path):
    print(f"错误: 输入文件未找到: {input_image_path}")
    exit()

print(f"开始处理文件: {input_image_path}")
try:
    print(f"文件大小: {os.path.getsize(input_image_path)/1024/1024:.2f} MB")
except OSError as e:
    print(f"无法访问文件: {e}")
    exit()
    
start_time = time.time()

# 准备上传的文件
# 键 "file" 必须与您 main.py 中 FastAPI 的参数名一致
# (file: UploadFile = File(...))
file_handle = open(input_image_path, "rb")
files = {
    "file": (
        os.path.basename(input_image_path),  # 发送原始文件名
        file_handle,                         # 文件句柄
        "image/jpeg"                         # 文件的 MIME 类型
    )
}

try:
    # 发送 POST 请求
    print(f"正在发送请求到 Magick API: {api_url}")
    # 注意:这个端点不需要 "data" 参数,只需要 "files"
    response = requests.post(api_url, files=files)
    
    # --- 处理响应 ---
    if response.status_code == 200:
        # 检查返回的是否是目标格式的图像
        expected_content_type = f'image/{target_format}'
        if target_format == 'jpeg':
            expected_content_type = 'image/jpeg'

        actual_content_type = response.headers.get('content-type')
        if actual_content_type == expected_content_type or actual_content_type.startswith('image/'):
            # 保存处理后的图像
            with open(output_image_path, "wb") as f:
                f.write(response.content)

            end_time = time.time()
            print("\n--- 转换成功! ---")
            print(f"总耗时: {end_time - start_time:.2f} 秒")
            print(f"结果已保存到: {output_image_path}")
            print(f"输出文件大小: {os.path.getsize(output_image_path)/1024/1024:.2f} MB")
        else:
            print(f"处理失败! 服务器返回了 200 OK,但内容类型不匹配。")
            print(f"期望的内容类型: {expected_content_type}")
            print(f"返回的内容类型: {actual_content_type}")
            print(f"响应内容 (前500字节): {response.text[:500]}...")

    else:
        # --- 处理错误 ---
        print(f"\n--- 处理失败! ---")
        print(f"状态码: {response.status_code}")
        try:
            # 尝试解析 FastAPI 返回的 JSON 错误详情
            error_details = response.json()
            print(f"错误详情: {error_details.get('detail', '无详情')}")
        except requests.exceptions.JSONDecodeError:
            # 如果返回的不是 JSON (例如 502 Bad Gateway)
            print(f"响应内容 (前500字节): {response.text[:500]}...")

finally:
    # 确保关闭文件句柄
    file_handle.close()
    print("\n测试完成。")