Files
DP/AI改图-双图.py

224 lines
7.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
双图合成处理 - 基于 multi_image_merge 方法
使用 Gemini 3 Pro Image Preview 模型进行双图创意合成
特点:
- 支持本地图片和网络图片 URL 两种输入方式
- 支持自定义提示词
- 创意合成、场景融合
使用方法:
1. 安装依赖pip install openai requests
2. 在下方配置区填入您的 API Key
3. 修改文件底部的参数变量
4. 运行python 双图合成处理.py
获取 API Keyhttps://api.laozhang.ai/token
"""
import base64
import re
import os
from openai import OpenAI
# ========== 配置区(请填入您的 API Key==========
API_KEY = "sk-KZ9TGgZAWnzY1T3c90B277F72e184c26A53f22440e08E86e" # 替换为您的 API Key
BASE_URL = "https://api.laozhang.ai/v1"
# 模型选择
MODEL = "gemini-3-pro-image-preview" # 最新版,支持更高质量
# MODEL = "gemini-2.5-flash-image" # 稳定版,价格更低($0.025 vs $0.05
# ================================================
def extract_and_save_image(content: str, filename: str) -> bool:
"""从响应内容中提取 base64 图片并保存"""
# 匹配 markdown 格式的 base64 图片
match = re.search(r'!\[.*?\]\((data:image/\w+;base64,([^)]+))\)', content)
if match:
base64_data = match.group(2)
# 确保 base64 填充正确
padding = 4 - len(base64_data) % 4
if padding != 4:
base64_data += '=' * padding
image_data = base64.b64decode(base64_data)
with open(filename, 'wb') as f:
f.write(image_data)
return True
return False
def is_url(path: str) -> bool:
"""判断路径是否为 URL"""
return path.startswith('http://') or path.startswith('https://')
def multi_image_merge(image1_path: str, image2_path: str, prompt: str, output_filename: str = None) -> bool:
"""
多图合成
参数:
image1_path: 第一张图片路径(本地文件路径或 URL
image2_path: 第二张图片路径(本地文件路径或 URL
prompt: 合成提示词
output_filename: 输出文件名(可选)
返回: 是否成功
"""
print("\n" + "="*60)
print("🎨 双图合成处理")
print("="*60)
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
# 构建 content 数组
content = [{"type": "text", "text": prompt}]
# 处理第一张图片
if is_url(image1_path):
# 网络图片 URL
content.append({"type": "image_url", "image_url": {"url": image1_path}})
print(f"🖼️ 图片1 (URL): {image1_path[:50]}...")
else:
# 本地图片 Base64
if not os.path.exists(image1_path):
print(f"❌ 错误图片1不存在: {image1_path}")
return False
with open(image1_path, "rb") as f:
image1_b64 = base64.b64encode(f.read()).decode("utf-8")
content.append({
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image1_b64}"
}
})
print(f"🖼️ 图片1 (本地): {image1_path}")
# 处理第二张图片
if is_url(image2_path):
# 网络图片 URL
content.append({"type": "image_url", "image_url": {"url": image2_path}})
print(f"🖼️ 图片2 (URL): {image2_path[:50]}...")
else:
# 本地图片 Base64
if not os.path.exists(image2_path):
print(f"❌ 错误图片2不存在: {image2_path}")
return False
with open(image2_path, "rb") as f:
image2_b64 = base64.b64encode(f.read()).decode("utf-8")
content.append({
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image2_b64}"
}
})
print(f"🖼️ 图片2 (本地): {image2_path}")
print(f"📝 提示词: {prompt}")
print("📡 发送请求...")
try:
response = client.chat.completions.create(
model=MODEL,
messages=[
{
"role": "user",
"content": content
}
]
)
result_content = response.choices[0].message.content
# 确定输出文件名
if output_filename:
output_file = output_filename
else:
output_file = "result_multi_merge.png"
if extract_and_save_image(result_content, output_file):
print(f"✅ 成功!图片已保存: {output_file}")
return True
else:
print(f"⚠️ 未找到图片数据")
return False
except Exception as e:
print(f"❌ 错误: {str(e)}")
return False
def main():
"""主函数"""
print("="*60)
print("🎨 双图合成处理")
print(f"模型: {MODEL}")
print("="*60)
# 检查 API Key
if API_KEY == "sk-YOUR_API_KEY" or not API_KEY:
print("\n❌ 请先配置您的 API Key")
print(" 获取地址: https://api.laozhang.ai/token")
print(" 然后修改脚本顶部的 API_KEY 变量")
return
# 检查图片是否存在(仅本地文件)
if not is_url(IMAGE1_PATH) and not os.path.exists(IMAGE1_PATH):
print(f"\n❌ 错误图片1文件不存在: {IMAGE1_PATH}")
print(" 请检查文件路径是否正确")
return
if not is_url(IMAGE2_PATH) and not os.path.exists(IMAGE2_PATH):
print(f"\n❌ 错误图片2文件不存在: {IMAGE2_PATH}")
print(" 请检查文件路径是否正确")
return
print(f"\n📋 配置信息:")
print(f" 图片1: {IMAGE1_PATH}")
print(f" 图片2: {IMAGE2_PATH}")
print(f" 提示词: {PROMPT}")
print()
# 执行合成
result = multi_image_merge(
image1_path=IMAGE1_PATH,
image2_path=IMAGE2_PATH,
prompt=PROMPT,
output_filename=OUTPUT_FILENAME
)
if result:
print("\n" + "="*60)
print("🎉 合成完成!")
print("="*60)
else:
print("\n" + "="*60)
print("❌ 合成失败,请检查错误信息")
print("="*60)
# ========== 参数配置区(请修改以下参数)==========
# 1. 第一张图片路径(支持本地文件路径或网络 URL
IMAGE1_PATH = "5.png" # 本地文件示例: "1.png" 或 "C:/images/photo1.jpg"
# IMAGE1_PATH = "https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=800&q=80" # URL 示例
# 2. 第二张图片路径(支持本地文件路径或网络 URL
IMAGE2_PATH = "6.png" # 本地文件示例: "2.png" 或 "C:/images/photo2.jpg"
# IMAGE2_PATH = "https://images.unsplash.com/photo-1560806887-1e4cd0b6cbd6?w=800&q=80" # URL 示例
# 3. 合成提示词(描述如何合成这两张图片)
PROMPT = "把第2张图的衣股花型图案替换成图1的花型图案" # 修改为您想要的合成效果描述
# 4. 输出文件名(可选,留空则使用默认名称)
OUTPUT_FILENAME = None # 例如: "合成结果.png" 或 None使用默认名称
# ================================================
if __name__ == "__main__":
main()