mirror of
https://github.com/freedoom/freedoom.git
synced 2025-09-01 22:25:46 -04:00
To support Python PIL 10.0.0 this change uses newer API textbbox() when available, and older API textsize() when not.
72 lines
2.1 KiB
Python
Executable file
72 lines
2.1 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
# encoding: utf-8
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
from PIL import Image, ImageFont, ImageDraw
|
|
import sys
|
|
import os
|
|
|
|
# create_caption.py <background_image> <title?> <phase?> <outfile>
|
|
|
|
font = ImageFont.load_default()
|
|
|
|
|
|
txt1 = "© 2001-2023"
|
|
txt2 = os.environ["VERSION"]
|
|
background_image = Image.open(sys.argv[1])
|
|
background_image.load()
|
|
background_image = background_image.convert("RGBA")
|
|
image = Image.new("RGBA", background_image.size, (0, 0, 0, 0))
|
|
draw = ImageDraw.Draw(image)
|
|
|
|
# Getting the text size is tricky since for newer PIL, such as 10.0.0, only
|
|
# textbbox() is supported, but for older PIL, such 7.2.0, only textsize()
|
|
# is supported. The solution is to default to the newer API, but fallback to
|
|
# the older one when it is not available.
|
|
try:
|
|
# This newer API returns a four item tuple. The "xy" kwarg is returned in
|
|
# the first two items, and last two items is the size needed, but with "xy"
|
|
# added, so passing "(0, 0)" returns the size needed.
|
|
txt1_size = draw.textbbox(xy=(0, 0), text=txt1, font=font)[2:]
|
|
txt2_size = draw.textbbox(xy=(0, 0), text=txt2, font=font)[2:]
|
|
except:
|
|
# This older API simply returns the size needed.
|
|
txt1_size = draw.textsize(txt1, font=font)
|
|
txt2_size = draw.textsize(txt2, font=font)
|
|
|
|
draw.text(
|
|
(5, int(image.height - txt1_size[1] - 5)),
|
|
txt1,
|
|
font=font,
|
|
fill=(255, 165, 0, 255),
|
|
)
|
|
draw.text(
|
|
(
|
|
int(image.width - txt2_size[0] - 10),
|
|
int(image.height - txt2_size[1] - 5),
|
|
),
|
|
txt2,
|
|
font=font,
|
|
fill=(255, 165, 0, 255),
|
|
)
|
|
|
|
if len(sys.argv) > 3:
|
|
# paste the other stuff onto the thing.
|
|
logo = Image.open(sys.argv[2])
|
|
logo.load()
|
|
phase = Image.open(sys.argv[3])
|
|
phase.load
|
|
image.paste(logo, ((int(image.width / 2) - int(logo.width / 2), 18)))
|
|
image.paste(
|
|
phase,
|
|
(
|
|
(int(image.width / 2) - int(phase.width / 2)),
|
|
int(image.height - phase.height - 30),
|
|
),
|
|
)
|
|
outfile_name = sys.argv[4]
|
|
else:
|
|
outfile_name = sys.argv[2]
|
|
|
|
image = Image.alpha_composite(background_image, image)
|
|
image.save(outfile_name)
|