138 lines
4.4 KiB
Python
138 lines
4.4 KiB
Python
import http.client
|
|
import json
|
|
import base64
|
|
import time
|
|
|
|
conn = http.client.HTTPSConnection("api.vectorengine.ai")
|
|
|
|
|
|
with open("./assets/girl.png", "rb") as f:
|
|
girl_data = base64.b64encode(f.read()).decode('utf-8')
|
|
|
|
with open("./assets/boy.jpg", "rb") as f:
|
|
boy_data = base64.b64encode(f.read()).decode('utf-8')
|
|
|
|
payload = json.dumps({
|
|
"contents": [
|
|
{
|
|
"role": "user",
|
|
"parts": [
|
|
{
|
|
"text": "'Picture 1 shows a girl, and Picture 2 shows a boy. Generate a photo of them hugging."
|
|
},
|
|
{
|
|
"inline_data": {
|
|
"mime_type": "image/png",
|
|
"data": girl_data
|
|
}
|
|
},
|
|
{
|
|
"inline_data": {
|
|
"mime_type": "image/jpeg",
|
|
"data": boy_data
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"generationConfig": {
|
|
"responseModalities": [
|
|
"TEXT",
|
|
"IMAGE"
|
|
],
|
|
"imageConfig": {
|
|
"aspectRatio": "2:3",
|
|
"imageSize": "1K"
|
|
}
|
|
}
|
|
})
|
|
headers = {
|
|
'Authorization': 'Bearer sk-RZBLe4v8MolmD3fwOd6vdRTCaj7PohDhf4f44UNgWHEAA4zF',
|
|
'Content-Type': 'application/json'
|
|
}
|
|
|
|
# 记录开始时间
|
|
print("开始生成图片...")
|
|
start_time = time.time()
|
|
|
|
conn.request("POST", "/v1beta/models/gemini-3-pro-image-preview:generateContent?key=sk-RZBLe4v8MolmD3fwOd6vdRTCaj7PohDhf4f44UNgWHEAA4zF", payload, headers)
|
|
res = conn.getresponse()
|
|
data = res.read()
|
|
|
|
# 记录结束时间并计算耗时
|
|
end_time = time.time()
|
|
generation_time = end_time - start_time
|
|
|
|
print(f"✓ 图片生成完成!")
|
|
print(f"⏱️ 总耗时: {generation_time:.2f} 秒 ({generation_time:.3f}s)")
|
|
|
|
# 解析响应
|
|
response_json = json.loads(data.decode("utf-8"))
|
|
#print("响应内容:", json.dumps(response_json, indent=2, ensure_ascii=False))
|
|
|
|
# 提取并保存图片
|
|
saved_images = 0
|
|
try:
|
|
# 根据 API 响应结构提取图片数据(可能需要根据实际响应调整路径)
|
|
candidates = response_json.get("candidates", [])
|
|
print(f"\n候选数量: {len(candidates)}")
|
|
|
|
for i, candidate in enumerate(candidates):
|
|
print(f"\n处理候选 {i}:")
|
|
print(f"候选结构: {list(candidate.keys())}")
|
|
|
|
content = candidate.get("content", {})
|
|
print(f"内容结构: {list(content.keys())}")
|
|
|
|
parts = content.get("parts", [])
|
|
print(f"Parts 数量: {len(parts)}")
|
|
|
|
for j, part in enumerate(parts):
|
|
print(f"\nPart {j} 的键: {list(part.keys())}")
|
|
|
|
# 检查不同的可能字段名
|
|
if "inline_data" in part:
|
|
print("找到 inline_data!")
|
|
img_base64 = part["inline_data"]["data"]
|
|
mime_type = part["inline_data"].get("mime_type", "image/jpeg")
|
|
elif "inlineData" in part:
|
|
print("找到 inlineData!")
|
|
img_base64 = part["inlineData"]["data"]
|
|
mime_type = part["inlineData"].get("mimeType", "image/jpeg")
|
|
elif "data" in part:
|
|
print("找到 data 字段!")
|
|
img_base64 = part["data"]
|
|
mime_type = part.get("mimeType", part.get("mime_type", "image/jpeg"))
|
|
else:
|
|
print(f"未找到图片数据,part 内容: {part}")
|
|
continue
|
|
|
|
# 解码 base64 并保存图片
|
|
img_bytes = base64.b64decode(img_base64)
|
|
|
|
# 根据 mime_type 确定文件扩展名
|
|
ext = "jpg" if "jpeg" in mime_type.lower() else mime_type.split("/")[-1]
|
|
output_path = f"./assets/output_image_{i}_{j}.{ext}"
|
|
|
|
with open(output_path, "wb") as f:
|
|
f.write(img_bytes)
|
|
|
|
# 计算图片大小
|
|
img_size_kb = len(img_bytes) / 1024
|
|
print(f"✓ 图片已保存到: {output_path}")
|
|
print(f" 文件大小: {img_size_kb:.2f} KB")
|
|
saved_images += 1
|
|
|
|
# 显示总结信息
|
|
print(f"\n{'='*50}")
|
|
print(f"📊 生成总结:")
|
|
print(f" - 成功生成并保存: {saved_images} 张图片")
|
|
print(f" - 总耗时: {generation_time:.2f} 秒")
|
|
if saved_images > 0:
|
|
print(f" - 平均每张耗时: {generation_time/saved_images:.2f} 秒")
|
|
print(f"{'='*50}")
|
|
|
|
except Exception as e:
|
|
print(f"\n❌ 提取图片时出错: {e}")
|
|
import traceback
|
|
traceback.print_exc() |