aboutsummaryrefslogtreecommitdiff
path: root/make_album_art.py
blob: ea821aad48d248fe35635af6f5e2a7b8b60ab269 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import argparse

from PIL import Image, ImageDraw

from epdify import epdify, get_bounded_font

parser = argparse.ArgumentParser()
parser.add_argument("--font-face", default="fira")
parser.add_argument("--text-padding", default=20, type=int)
parser.add_argument("--text-padding-additional-right", default=60, type=int)
parser.add_argument("--dither-palette", default="perceived")
parser.add_argument("--final-palette", default="native")
parser.add_argument("-o", "--output-filename")
parser.add_argument("artist")
parser.add_argument("album")
parser.add_argument("cover_filename")
args = parser.parse_args()

# open cover image and resize to target size
# don't crop, assume input image is reasonable close to being square
cover_img = Image.open(args.cover_filename)
cover_img = cover_img.resize((480, 480), resample=Image.Resampling.LANCZOS, reducing_gap=3)

# find the optimal size for the album and artist names in the given font face
text_width = 480 - (args.text_padding * 2) - args.text_padding_additional_right
album_font = get_bounded_font(args.font_face, "bold", args.album, 60, 35, text_width)
artist_font = get_bounded_font(args.font_face, "regular", args.artist, min(55, album_font.size - 5), 30, text_width)
print(f"{album_font.size} {artist_font.size} : {args.artist} - {args.album}")

# draw the album and artist names
text_img = Image.new("RGB", (480, 480), color="white")
draw = ImageDraw.Draw(text_img)
draw.text(
    (args.text_padding, 320 - (artist_font.size + args.text_padding)),
    args.album,
    font=album_font,
    fill="black",
    anchor="ld",
)
draw.text(
    (args.text_padding, 320 - (artist_font.size + args.text_padding)),
    args.artist,
    font=artist_font,
    fill="black",
    anchor="la",
)
text_img = text_img.rotate(90)

# compose the final image, dither, and save
img = Image.new("RGB", (800, 480))
img.paste(cover_img, (0,0))
img.paste(text_img, (480, 0))
img = epdify(img, args.dither_palette, args.final_palette)
if args.output_filename is None:
    output_filename=f"{args.artist} - {args.album}.cover.bmp"
else:
    output_filename = args.output_filename
img.save(output_filename, 'bmp')