Website fertig: lokale Bilder und Schrift, Über mich, Datenschutz, 404, SEO
- Logo, Fotos und Questrial liegen lokal (WebP, zwei Größen) – keine Drittanbieter mehr - Neue Seiten: Über mich (Aus- und Weiterbildungen), Datenschutz, 404 - Impressum nach DDG mit Aufsichtsbehörde (§ 11 TierSchG) - Favicon, Apple-Icon, Vorschaubild, Canonical/Open Graph, robots.txt, sitemap.xml, .htaccess - tools/optimize_images.py erzeugt die Web-Bilder aus tools/originals/ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
2a751eeac9
commit
e368a0b2cc
47 files changed
+803
-170
No files matched your search
@@ -0,0 +1,60 @@
|
||||
"""Erzeugt aus tools/originals/ die Web-Bilder in assets/img/ (WebP, zwei Größen) sowie Icons und Vorschaubild.
|
||||
|
||||
python3 tools/optimize_images.py
|
||||
"""
|
||||
import os
|
||||
from PIL import Image, ImageDraw
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
SRC = os.path.join(ROOT, "tools", "originals")
|
||||
OUT = os.path.join(ROOT, "assets", "img")
|
||||
os.makedirs(OUT, exist_ok=True)
|
||||
|
||||
CREAM = (252, 250, 244)
|
||||
PHOTOS = ["katha-abendlicht", "katha-heide", "hund-wald", "hund-rennt", "futternapf", "laden", "kofferraum"]
|
||||
|
||||
|
||||
def fit(img, longest):
|
||||
img = img.copy()
|
||||
img.thumbnail((longest, longest), Image.LANCZOS)
|
||||
return img
|
||||
|
||||
|
||||
def save_webp(img, name, quality=78):
|
||||
path = os.path.join(OUT, name)
|
||||
img.save(path, "WEBP", quality=quality, method=6)
|
||||
print(f"{os.path.getsize(path) / 1024:6.0f} KB {name} {img.size[0]}x{img.size[1]}")
|
||||
|
||||
|
||||
# Fotos: groß (1800) und klein (900) für Handy / halbe Kacheln
|
||||
for name in PHOTOS:
|
||||
img = Image.open(os.path.join(SRC, name + ".jpg")).convert("RGB")
|
||||
save_webp(fit(img, 1800), f"{name}.webp")
|
||||
save_webp(fit(img, 900), f"{name}-900.webp", quality=76)
|
||||
|
||||
# Logo und BARF-Teller mit Transparenz
|
||||
logo = Image.open(os.path.join(SRC, "logo.png")).convert("RGBA")
|
||||
save_webp(fit(logo, 640), "logo.webp", quality=90)
|
||||
plate = Image.open(os.path.join(SRC, "barf-teller.png")).convert("RGBA")
|
||||
save_webp(fit(plate, 900), "barf-teller.webp", quality=82)
|
||||
|
||||
# Apple-Touch-Icon: Logo auf Creme
|
||||
icon = Image.new("RGB", (180, 180), CREAM)
|
||||
small = fit(logo, 172)
|
||||
icon.paste(small, ((180 - small.width) // 2, (180 - small.height) // 2), small)
|
||||
icon.save(os.path.join(ROOT, "apple-touch-icon.png"))
|
||||
|
||||
# Vorschaubild für WhatsApp / Facebook (1200x630): Foto + Logo-Siegel
|
||||
og = Image.open(os.path.join(SRC, "katha-abendlicht.jpg")).convert("RGB")
|
||||
scale = 1200 / og.width
|
||||
og = og.resize((1200, round(og.height * scale)), Image.LANCZOS)
|
||||
top = max(0, (og.height - 630) // 2)
|
||||
og = og.crop((0, top, 1200, top + 630))
|
||||
d = 300
|
||||
seal = Image.new("RGBA", (d, d), (0, 0, 0, 0))
|
||||
ImageDraw.Draw(seal).ellipse((0, 0, d - 1, d - 1), fill=CREAM + (255,))
|
||||
lg = fit(logo, int(d * .94))
|
||||
seal.paste(lg, ((d - lg.width) // 2, (d - lg.height) // 2), lg)
|
||||
og.paste(seal, (1200 - d - 60, 50), seal) # oberhalb des Fotografen-Schriftzugs
|
||||
og.save(os.path.join(OUT, "vorschau.jpg"), quality=82)
|
||||
print("Icons und Vorschaubild erzeugt")
|
||||
Reference in new issue
Block a user