Hoy os comparto una pequeña función que permite reescalar imágenes usando nearest neighbor y directamente desde el servidor.

Con esto reduciremos el coste computacional del front a la hora de reescalar imágenes.
Recomiendo usarlo para estilo pixel art. Aunque es posible que funcione con otras imágenes o tengas que cambiar el algoritmo de reescalado.
Primero instalamos pillow:
pip install pillow
Y ahora creamos un endpoint que se encarga de devolver la imagen reescalada:
from fastapi import Query
from PIL import Image
from io import BytesIO
from fastapi.responses import Response
@user.get("/image/{nombre_imagen:path}", status_code=status.HTTP_200_OK)
def get_imagen_accesorios(nombre_imagen: str, w: int = Query(None), h: int = Query(None)):
imagen_folder = "images/public"
imagen_png = os.path.join(imagen_folder, nombre_imagen + ".png")
imagen_jpg = os.path.join(imagen_folder, nombre_imagen + ".jpg")
if os.path.isfile(imagen_png):
imagen_path = imagen_png
media_type = "image/png"
elif os.path.isfile(imagen_jpg):
imagen_path = imagen_jpg
media_type = "image/jpeg"
else:
raise HTTPException(status_code=404, detail="Error, no existe la imagen.")
img = Image.open(imagen_path)
# Si se solicitan dimensiones, aplicar escalado nearest neighbor
if w and h:
img = img.resize((w, h), Image.NEAREST)
buf = BytesIO()
img.save(buf, format="PNG")
buf.seek(0)
return Response(content=buf.getvalue(), media_type=media_type, headers={
"Cache-Control": "public, max-age=31536000"
})
En este caso como puedes ver, necesitas guardar tus imagenes en formato .jpg o .png en el directorio images/public
Por parámetro le pasarás el path de la imagen sin la extensión y además el tamaño deseado.
GET /image-accesorios/cortina?w=256&h=256

Ingeniero en Informática, Investigador, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.