DEV Community

Cover image for Optimization of images with FastAPI
Nelson Hernández
Nelson Hernández

Posted on • Updated on

Optimization of images with FastAPI

In this example we will see how to upload images and use background tasks to generate resolutions for different
devices

Dependencies

pip3 install fastapi uvicorn Pillow
Enter fullscreen mode Exit fullscreen mode

Background Tasks

You can define background tasks to be run after returning a response.

from fastapi import FastAPI, UploadFile, File, BackgroundTasks
from fastapi.responses import JSONResponse
from os import getcwd
from PIL import Image

app = FastAPI()

PATH_FILES = getcwd() + "/"


# RESIZE IMAGES FOR DIFFERENT DEVICES

def resize_image(filename: str):
    sizes = [{
        "width": 1280,
        "height": 720
    }, {
        "width": 640,
        "height": 480
    }]

    for size in sizes:
        size_defined = size['width'], size['height']

        image = Image.open(PATH_FILES + filename, mode="r")
        image.thumbnail(size_defined)
        image.save(PATH_FILES + str(size['height']) + "_" + filename)
    print("success")


@app.post("/upload/file")
async def upload_file(background_tasks: BackgroundTasks, file: UploadFile = File(...)):

    # SAVE FILE ORIGINAL
    with open(PATH_FILES + file.filename, "wb") as myfile:
        content = await file.read()
        myfile.write(content)
        myfile.close()

    # RESIZE IMAGES
    background_tasks.add_task(resize_image, filename=file.filename)
    return JSONResponse(content={"message": "success"})
Enter fullscreen mode Exit fullscreen mode

Output

dogs.jpg # Original Image

720_dogs.jpg # Resolution 1280 x 720

480_dogs.jpg # Resolution 640 x 480
Enter fullscreen mode Exit fullscreen mode

Example in GitHub Gist

https://gist.github.com/nelsoncode019/35910eff9c09ca015cfb4748be345133

Top comments (0)