56 lines
1.6 KiB
Python
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()
|