Inspirational Quotes Image Generator in Python

2 min read • Jun 12, 2023

If you browse Pinterest, Instagram, or type “inspirational quotes Pinterest” in your browser, you’ll get tons of results, like these:

example results

I decided to automate the process of creating these images with Python using the Pillow library.

It’s also my Harvard’s CS50P course final project (check out my CS50P review).

How does it work? 🤔

Short video demo:

and a graphic diagram of the process:

diagram of the process

Main functions explained

  1. I used the Pexels API to fetch images for the background. We can use the download_background() and get_backgrounds() functions to download one random picture with a matching query. I decided to go with “nature”.
main.py
def get_backgrounds(page: int = 1):
params = {
"query": "nature",
"orientation": "portrait",
"page": page,
"per_page": "40",
}
return requests.get(
"https://api.pexels.com/v1/search", params=params, headers=HEADERS
).json()
def download_background(page: int = 1):
# Get list of images
images = get_backgrounds(page).get("photos")
if not images:
raise Exception("API Error")
# Choose random one
img_id = random.choice(images)["id"]
download_url = f"https://www.pexels.com/photo/{img_id}/download"
print(f"Downloading image: {download_url.removesuffix('/download')}")
# Download it
response = requests.get(
download_url,
headers=HEADERS,
)
with open(BACKGROUND, "wb") as f:
f.write(response.content)
  1. After getting the background image, we need to edit it. We will resize the background and darken it using edit_background() to prevent the image and text from blending together.
main.py
def edit_background():
# Resize background
img = Image.open(BACKGROUND)
img = img.resize((W, H))
# Change brightness
enhancer = ImageEnhance.Brightness(img)
img = enhancer.enhance(0.55)
img.save(BACKGROUND)
  1. Now it’s time to get the quote and its author. They’re stored in a CSV file (quotes.csv). We just have to get a random one with the get_quote() function.
main.py
def get_quote():
# Get number of quotes and choose random one
with open(QUOTES_FILE) as f:
reader = csv.DictReader(f)
rand_quote_num = random.randint(0, len(list(reader)) - 1)
# Choose random quote
with open(QUOTES_FILE) as f:
reader = csv.DictReader(f)
for i, row in enumerate(reader):
if rand_quote_num == i:
return row["Quote"], row["Author"] if row["Author"] else "Unknown"
  1. The last step is to insert the quote using the Pillow library. The toughest part is fitting the text onto the image. Quotes have different lengths, so we have to change the font size based on its length. I achieved it with the help of helper functions inside the ImageText class (img_utils.py file).

The entire source code is available here on GitHub if you want to check it out. 😀


SHARE: