Files
mkdocs-wiki/scripts/render_favicon.py

56 lines
1.6 KiB
Python

"""Rendert docs/assets/images/favicon.ico (16/32/48/64) und icon-192/icon-512.png.
Geometrie entspricht 1:1 favicon.svg (512-Koordinatensystem, lineare Skalierung).
Voraussetzung: Pillow (im uv-Venv, dev-Dependency).
Aufruf: uv run python scripts/render_favicon.py
"""
from pathlib import Path
from PIL import Image, ImageDraw
ROOT = Path(__file__).resolve().parent.parent
IMG = ROOT / "docs" / "assets" / "images"
BG = (0x26, 0x32, 0x38, 255) # Material Slate 900
FG = (0x4C, 0xAF, 0x50, 255) # Material Green 500
def draw(size: int) -> Image.Image:
im = Image.new("RGBA", (size, size), (0, 0, 0, 0))
d = ImageDraw.Draw(im)
d.rounded_rectangle([0, 0, size - 1, size - 1], radius=size // 5, fill=BG)
def s(v512: int) -> int:
return round(v512 * size / 512)
d.polygon(
[
(s(160), s(400)),
(s(160), s(150)),
(s(380), s(150)),
(s(380), s(280)),
(s(316), s(280)),
(s(316), s(215)),
(s(224), s(215)),
(s(224), s(400)),
],
fill=FG,
)
return im
def main() -> None:
draw(512).save(IMG / "icon-512.png")
draw(192).save(IMG / "icon-192.png")
sizes = [16, 32, 48, 64]
images = [draw(sz) for sz in sizes]
images[-1].save(
IMG / "favicon.ico",
format="ICO",
sizes=[(im.width, im.height) for im in images],
append_images=images[:-1],
)
print("OK:", ", ".join(p.name for p in
[IMG / "favicon.ico", IMG / "icon-192.png", IMG / "icon-512.png"]))
if __name__ == "__main__":
main()