from PIL import Image, ImageDraw, ImageFont from pathlib import Path out_dir = r"C:\Users\mzhan\AppData\Local\osu!\Songs\1145452 Unknown Artist - Spelunker" def empty(path): im = Image.new("RGBA", (1, 1)) im.save(path) hitcircle = Image.new("RGBA", (128, 128)) draw = ImageDraw.Draw(hitcircle) draw.ellipse((5, 5, 118 + 5, 118 + 5), fill="white") hitcircleoverlay = Image.new("RGBA", (128, 128)) draw = ImageDraw.Draw(hitcircleoverlay) draw.ellipse((5, 5, 118 + 5, 118 + 5), outline="white", width=8) approachcircle = Image.new("RGBA", (126, 126)) draw2 = ImageDraw.Draw(approachcircle) size = 4 draw2.ellipse((size, size, 118 + size, 118 + size), outline="white", width=6) scorebarbg = Image.new("RGBA", (400, 40)) draw4 = ImageDraw.Draw(scorebarbg) draw4.rectangle((0, 10, 400, 40), fill="yellow") scorebarcolor = Image.new("RGBA", (390, 40)) draw5 = ImageDraw.Draw(scorebarcolor) draw5.rectangle((0, 4, 400, 20), fill="orange") def get_text_dimensions(text_string, font): # https://stackoverflow.com/a/46220683/9263761 ascent, descent = font.getmetrics() text_width = font.getmask(text_string).getbbox()[2] text_height = font.getmask(text_string).getbbox()[3] + descent return (text_width, text_height) def thefont(size=None): if size is None: size = 48 return ImageFont.FreeTypeFont(r"C:\WINDOWS\FONTS\SIMFANG.TTF", size) def gentext(text, path, font=None, size=None, **kwargs): if font is None: font = thefont(size=size) width, height = get_text_dimensions(text, font) height += 2 im = Image.new("RGBA", (width, height)) draw3 = ImageDraw.Draw(im) draw3.fontmode = "1" draw3.text((0, 0), text, font=font, **kwargs) im.save(path) def gen2text(text, path, font=None, size=None, **kwargs): if size is None: size = 48 p = Path(path) gentext(text, p, font=font, **kwargs) pname = p.name.rstrip(".png") p2 = p.with_name(pname + "@2x.png") gentext(text, p2, font=font, size=size * 2, **kwargs) # Scorebar set scorebarbg.save(f"{out_dir}/scorebar-bg.png") scorebarcolor.save(f"{out_dir}/scorebar-colour.png") # Hitcircle set hitcircle.save(f"{out_dir}/hitcircle.png") hitcircleoverlay.save(f"{out_dir}/hitcircleoverlay.png") hitcircleoverlay.save(f"{out_dir}/sliderstartcircleoverlay.png") empty(f"{out_dir}/sliderendcircleoverlay.png") approachcircle.save(f"{out_dir}/approachcircle.png") hitcircle.save(f"{out_dir}/sliderstartcircle.png") # Hitcircle number set for i in range(10): gentext(str(i), f"{out_dir}/default-{i}.png", fill="white") # Hitburst set gentext("Zzz", f"{out_dir}/hit0.png") gentext("300", f"{out_dir}/hit300.png", fill="cyan") gentext("300", f"{out_dir}/hit300g.png", fill="cyan") gentext("300", f"{out_dir}/hit300k.png", fill="cyan") gentext("100", f"{out_dir}/hit100.png", fill="#22ee22") gentext("100", f"{out_dir}/hit100k.png", fill="#22ee22") gentext("50", f"{out_dir}/hit50.png", fill="gray") # gen2text("無謀な……", f"{out_dir}/hit100k.png") # gen2text("え?俺勝っちゃったの?", f"{out_dir}/hit300g.png") # gen2text("ヤッフー!!", f"{out_dir}/hit300k.png")