| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- import os
- import requests
- import base64
- import json
- import time
- from pathlib import Path
- def fix_old_photo(image_path, output_path="fixed_photo.png"):
- """
- 使用Gemini API修复老照片
-
- Args:
- image_path: 输入图片路径
- output_path: 输出图片路径
- """
- # 从环境变量获取API密钥
- api_key = os.getenv("GEMINI_API_KEY")
- if not api_key:
- raise ValueError("未找到GEMINI_API_KEY环境变量")
-
- # 读取图片文件并转换为base64
- try:
- with open(image_path, "rb") as image_file:
- image_data = base64.b64encode(image_file.read()).decode('utf-8')
- except FileNotFoundError:
- raise FileNotFoundError(f"找不到图片文件: {image_path}")
-
- # 获取图片的MIME类型
- file_extension = Path(image_path).suffix.lower()
- mime_type_map = {
- '.jpg': 'image/jpeg',
- '.jpeg': 'image/jpeg',
- '.png': 'image/png',
- '.gif': 'image/gif',
- '.webp': 'image/webp'
- }
- mime_type = mime_type_map.get(file_extension, 'image/jpeg')
-
- # 修复提示词
- prompt = """修复这张受损的老照片,去除所有折痕、裂痕、污渍和划痕,补全缺失的细节,提升清晰度,让画面自然完整。人物的面貌务必保持不变,在修复的基础上进行彩色化处理:人物的肤色柔和自然,毛衣呈现温暖的深色调,肤色健康自然,头发为黑色,衣服保持复古质感;去掉人物手里的烟;背景调整为教室,后面是黑板,前面是课桌"""
-
- # 构建请求数据
- request_data = {
- "contents": [{
- "parts": [
- {"text": prompt},
- {
- "inline_data": {
- "mime_type": mime_type,
- "data": image_data
- }
- }
- ]
- }],
- "generationConfig": {
- "temperature": 0.7,
- "candidateCount": 1,
- "maxOutputTokens": 2048,
- }
- }
-
- # 尝试不同的模型,避免图像生成模型(它们有更严格的配额限制)
- models = [
- "gemini-1.5-flash-latest",
- "gemini-1.5-flash",
- "gemini-1.5-pro-latest",
- "gemini-1.5-pro"
- ]
-
- headers = {
- "x-goog-api-key": api_key,
- "Content-Type": "application/json"
- }
-
- for model in models:
- url = f"https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent"
-
- try:
- print(f"正在尝试模型: {model}")
- response = requests.post(url, headers=headers, json=request_data, timeout=120)
-
- # 处理429错误(配额超限)
- if response.status_code == 429:
- error_data = response.json()
- print(f"模型 {model} 配额超限,错误信息:")
- print(json.dumps(error_data, indent=2, ensure_ascii=False))
-
- # 检查是否有重试建议
- if "error" in error_data and "details" in error_data["error"]:
- for detail in error_data["error"]["details"]:
- if detail.get("@type") == "type.googleapis.com/google.rpc.RetryInfo":
- retry_delay = detail.get("retryDelay", "30s")
- print(f"建议等待 {retry_delay} 后重试")
-
- continue
-
- # 处理其他HTTP错误
- if response.status_code != 200:
- print(f"HTTP状态码: {response.status_code}")
- print(f"响应内容: {response.text}")
- continue
-
- # 解析响应
- result = response.json()
- print("API响应成功!")
-
- # 提取文本内容(分析结果)
- if "candidates" in result and len(result["candidates"]) > 0:
- candidate = result["candidates"][0]
- if "content" in candidate and "parts" in candidate["content"]:
- for part in candidate["content"]["parts"]:
- if "text" in part:
- analysis_text = part["text"]
- print("\n=== 照片分析结果 ===")
- print(analysis_text)
-
- # 保存分析结果到文件
- analysis_file = output_path.replace('.png', '_analysis.txt')
- with open(analysis_file, 'w', encoding='utf-8') as f:
- f.write(analysis_text)
- print(f"\n分析结果已保存到: {analysis_file}")
- return True
-
- print("未找到有效的分析内容")
- return False
-
- except requests.exceptions.RequestException as e:
- print(f"模型 {model} 请求错误: {e}")
- continue
- except json.JSONDecodeError as e:
- print(f"模型 {model} JSON解析错误: {e}")
- continue
- except Exception as e:
- print(f"模型 {model} 未知错误: {e}")
- continue
-
- print("所有模型都尝试失败")
- return False
- def check_api_status():
- """
- 检查API状态和配额
- """
- api_key = os.getenv("GEMINI_API_KEY")
- if not api_key:
- print("未找到GEMINI_API_KEY环境变量")
- return False
-
- # 简单的测试请求
- test_data = {
- "contents": [{
- "parts": [{"text": "Hello, how are you?"}]
- }]
- }
-
- url = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent"
- headers = {
- "x-goog-api-key": api_key,
- "Content-Type": "application/json"
- }
-
- try:
- print("检查API状态...")
- response = requests.post(url, headers=headers, json=test_data, timeout=30)
-
- if response.status_code == 200:
- print("✅ API工作正常")
- return True
- elif response.status_code == 429:
- print("⚠️ API配额超限")
- error_data = response.json()
- if "error" in error_data:
- print(f"错误信息: {error_data['error']['message']}")
- return False
- else:
- print(f"❌ API错误,状态码: {response.status_code}")
- print(f"响应: {response.text}")
- return False
-
- except Exception as e:
- print(f"❌ API测试失败: {e}")
- return False
- def main():
- """主函数"""
- print("=== Gemini 照片分析工具 ===\n")
-
- # 检查API状态
- if not check_api_status():
- print("\n由于API配额限制,当前无法使用图像生成功能。")
- print("建议:")
- print("1. 等待一段时间后重试(通常几分钟到几小时)")
- print("2. 升级到付费版本获得更高的配额")
- print("3. 使用其他AI图像修复工具")
- return
-
- # 输入图片路径
- input_image = "./工大照片-1.jpg"
- output_analysis = "photo_analysis.txt"
-
- # 检查输入文件是否存在
- if not os.path.exists(input_image):
- print(f"错误: 找不到输入图片文件 {input_image}")
- print("请将您的老照片放在当前目录下,或修改input_image变量指向正确的路径")
- return
-
- print(f"正在分析图片: {input_image}")
-
- # 分析照片
- success = fix_old_photo(input_image, output_analysis)
-
- if success:
- print("\n✅ 照片分析完成!")
- print("由于API配额限制,当前只能提供分析报告。")
- print("您可以根据分析结果使用其他工具进行照片修复。")
- else:
- print("\n❌ 照片分析失败")
- if __name__ == "__main__":
- main()
|