Building an Image Conversion and Serving API with FastAPI

Introduction: In this blog post, we will explore how to create a powerful FastAPI application that serves images and allows image conversion from base64-encoded data. By following this step-by-step guide, you will be able to set up a functional image API with FastAPI. We’ll cover both the image conversion function and an additional API endpoint to showcase the capabilities of FastAPI.

Prerequisites: Before you start, make sure you have the following prerequisites installed:

  1. Python

  2. FastAPI

  3. uvicorn

  4. HTTPie (optional, for testing the API)

Step 1: Set up the FastAPI Application Let’s start by setting up a FastAPI application and importing the required modules.

# main.py
import os
import uuid
import base64
from fastapi import FastAPI
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles

app = FastAPI()

Step 2: Define the Image Conversion Function

We’ll create an image conversion function Image_Converter that takes a base64-encoded image, decodes it, and saves it as a JPG file. Additionally, the function will return the URL of the converted image.

# main.py

...

async def Image_Converter(Hax_Value):
    random_name = str(uuid.uuid4())
    decodeit = open(f"Server/static/{random_name}.jpg", 'wb')
    decodeit.write(base64.b64decode(Hax_Value))
    decodeit.close()
    img_path = "http://localhost:8000/images?id=Server%2Fstatic%2F" + str(random_name) + ".jpg"
    return img_path

Step 3: Set Up the Image Serving Endpoint

Now, let’s define an endpoint /images that will receive the image ID and return the corresponding image file.

# main.py

...

@app.post("/convert_image", tags=["IMAGE"])
async def convert_image(Hax_Value: str):
    img_path = await Image_Converter(Hax_Value)
    return {"converted_image_url": img_path}

Step 4: Create an Additional API Endpoint

For demonstration purposes, let’s create an additional endpoint /convert_image that will receive a base64-encoded image and use the Image_Converter function to convert and return the URL of the converted image.

# main.py

...

@app.post("/convert_image", tags=["IMAGE"])
async def convert_image(Hax_Value: str):
    img_path = await Image_Converter(Hax_Value)
    return {"converted_image_url": img_path}

Step 5: Mount the Static Files Directory

Now, let’s mount the directory containing the static files (images) to the /Static endpoint so that they can be served by the FastAPI application.

# main.py

...

IMAGEDIR = os.getcwd()

app.mount("/Static", StaticFiles(directory="Server"), name="Static")

Step 6: Run the FastAPI Application

Finally, we can run the FastAPI application using uvicorn.

uvicorn main:app --reload

Conclusion:

Congratulations! You have successfully built an Image Conversion and Serving API with FastAPI. The /convert_image endpoint allows you to convert base64-encoded images to JPG files and return the URL of the converted image. The /images endpoint serves the converted images stored in the /Static directory.

This example demonstrates the power and simplicity of FastAPI, making it an excellent choice for building APIs with Python. With FastAPI, you can easily create APIs for various applications, including image processing, machine learning, data analysis, and more. Feel free to customize and extend this example to suit your specific requirements and explore more features offered by FastAPI. Happy coding!