1. #Ver2
  2. from flask import Flask, request, render_template_string
  3. from openai import OpenAI
  4. from PIL import Image
  5. import numpy as np
  6. import io
  7. import base64
  8. import os
  9. # === OpenAIクライアント設定 ===
  10. # 安全に環境変数から読み込む方法(または直接書いてもOK)
  11. client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY") or "あなたのOpenAI keyをここに入力")
  12. app = Flask(__name__)
  13. # === HTMLテンプレート ===
  14. HTML_PAGE = """
  15. <!doctype html>
  16. <html>
  17. <head>
  18.     <title>パーソナルカラー診断(手の写真)</title>
  19. </head>
  20. <body>
  21.     <h1>パーソナルカラー診断</h1>
  22.     <p>あなたの手の写真をアップロードしてください。(個人情報が載らないようにしてください)</p>
  23.     <form method="POST" enctype="multipart/form-data">
  24.         <input type="file" name="image" accept="image/*" required>
  25.         <input type="submit" value="診断する">
  26.     </form>
  27.     {% if result %}
  28.         <h2>診断結果</h2>
  29.         <p>{{ result|safe }}</p>
  30.     {% endif %}
  31. </body>
  32. </html>
  33. """
  34. @app.route("/", methods=["GET", "POST"])
  35. def index():
  36.     result = None
  37.     if request.method == "POST":
  38.         file = request.files["image"]
  39.         image_bytes = file.read()
  40.         # === 画像から平均色を抽出 ===
  41.         image = Image.open(io.BytesIO(image_bytes))
  42.         image = image.convert("RGB").resize((100, 100)) # 小さくして平均化
  43.         pixels = np.array(image).reshape(-1, 3)
  44.         avg_color = pixels.mean(axis=0)
  45.         r, g, b = [int(x) for x in avg_color]
  46.         # === GPTへのプロンプト ===
  47.         prompt = (
  48.             f"次のRGB平均値は R={r}, G={g}, B={b} です。"
  49.             "この色の傾向から、一般的なパーソナルカラー分類(スプリング、サマー、オータム、ウィンター)のうち、"
  50.             "どのタイプに近いかを推測してください。"
  51.             "また、その理由と、似合いやすい色・避けた方が良い色を具体的に説明してください。"
  52.         )
  53.         # === OpenAI API呼び出し ===
  54.         response = client.chat.completions.create(
  55.             model="gpt-4o-mini",
  56.             messages=[
  57.                 {"role": "user", "content": prompt}
  58.             ]
  59.         )
  60.         result = response.choices[0].message.content
  61.     return render_template_string(HTML_PAGE, result=result)
  62. if __name__ == "__main__":
  63.     app.run(debug=True)