Reescalar una imagen pixel art con nearest neighbor usando python y pillow

Tiempo de lectura: < 1 minuto

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

Cuenca agua - pexels

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

Deja un comentario