ArWall / app.py
lelouch0110's picture
Update app.py
34adbbb verified
import os
from datetime import datetime
from typing import List
from PIL import Image
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import FileResponse
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware
from wall_service import color_wall
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Autorise toutes les origines
allow_credentials=True,
allow_methods=["*"], # Autorise toutes les méthodes
allow_headers=["*"], # Autorise tous les en-têtes
)
# Dossier où les images seront sauvegardées
UPLOAD_DIRECTORY = "galerie"
MODIFIED_IMAGES_DIR = "galerie_modifiees"
# Créer le dossier s'il n'existe pas
if not os.path.exists(UPLOAD_DIRECTORY):
os.makedirs(UPLOAD_DIRECTORY)
if not os.path.exists(MODIFIED_IMAGES_DIR):
os.makedirs(MODIFIED_IMAGES_DIR)
@app.post("/upload/")
async def upload_image(file: UploadFile = File(...)):
try:
# Générer un nom unique pour éviter les conflits
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_extension = os.path.splitext(file.filename)[1]
new_filename = f"{timestamp}_{file.filename}"
file_path = os.path.join(UPLOAD_DIRECTORY, new_filename)
# Sauvegarder le fichier localement
with open(file_path, "wb") as buffer:
buffer.write(await file.read())
# Retourner le chemin du fichier pour d'autres traitements
return JSONResponse(content={"message": "Image uploaded successfully", "file_path": file_path})
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)
# Modèle Pydantic pour valider les données entrantes
class TextureRequest(BaseModel):
file_path: str
color_rgb: List[int]
alpha: float
@app.post("/apply_texture/")
async def apply_texture(request: TextureRequest):
try:
# Récupérer les données de la requête
file_path = request.file_path
color_rgb = tuple(request.color_rgb)
alpha = request.alpha
# Vérifier si le fichier existe (exemple)
if not os.path.exists(file_path):
raise HTTPException(status_code=404, detail="File not found")
# Appliquer la texture
modified_image, original_image = color_wall(file_path, color_rgb, alpha)
# Convertir en image PIL
pil_image = Image.fromarray(modified_image)
# Réduire la taille de 33%
new_size = (original_image.shape[1] // 3, original_image.shape[0] // 3)
output_image = pil_image.resize(new_size, Image.LANCZOS)
# Générer un nom unique pour le fichier
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_name = f"modified_image_{timestamp}.jpg"
file_path = os.path.join(MODIFIED_IMAGES_DIR, file_name)
# Sauvegarder l'image modifiée
output_image.save(file_path, quality=90)
# Retourner le chemin du fichier pour d'autres traitements
return FileResponse(path=file_path, media_type="image/jpg")
except Exception as e:
return JSONResponse(content={"error": str(e)}, status_code=500)