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')
|