diff --git a/README.md b/README.md index dfefc82..ad08026 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,11 @@ Preis-Thumbnails). Neue Porträts im selben Format ablegen und in `src/data/salo laufen beim Scrollen seitlich durch, auf dem Handy wird gewischt. Neues Bild: als WebP (900 px breit) in `src/assets/gallery/` ablegen und in `moments` in `Gallery.tsx` eintragen (Titel + Seitenverhältnis). +**Körnung:** Alle Fotos haben einen Filmkorn-Look – Hero fein (Variante A), alle übrigen Fotos wie Film +ISO 800 (Variante B). Die unbearbeiteten Originale liegen in `design/original/`. Neue oder geänderte Fotos +dort ablegen (gleicher Pfad wie in `src/assets/`) und `python3 scripts/grain.py` ausführen – das Skript +schreibt die gekörnten Versionen nach `src/assets/`. + **Direktbuchung:** Jede Leistung trägt ihre Setmore-ID (`id`). Wird bei Setmore eine Leistung neu angelegt, bekommt sie eine neue ID. Sie steht im Buchungslink der Leistung auf der Setmore-Seite hinter `products=`. diff --git a/design/original/gallery/blond.webp b/design/original/gallery/blond.webp new file mode 100644 index 0000000..efe5530 Binary files /dev/null and b/design/original/gallery/blond.webp differ diff --git a/design/original/gallery/crew.webp b/design/original/gallery/crew.webp new file mode 100644 index 0000000..cf3f43b Binary files /dev/null and b/design/original/gallery/crew.webp differ diff --git a/design/original/gallery/fade-bart.webp b/design/original/gallery/fade-bart.webp new file mode 100644 index 0000000..9c18cd6 Binary files /dev/null and b/design/original/gallery/fade-bart.webp differ diff --git a/design/original/gallery/platin.webp b/design/original/gallery/platin.webp new file mode 100644 index 0000000..00a1e70 Binary files /dev/null and b/design/original/gallery/platin.webp differ diff --git a/design/original/gallery/twists.webp b/design/original/gallery/twists.webp new file mode 100644 index 0000000..eda55f4 Binary files /dev/null and b/design/original/gallery/twists.webp differ diff --git a/design/original/photos/emblem-breit-900.webp b/design/original/photos/emblem-breit-900.webp new file mode 100644 index 0000000..8b57af8 Binary files /dev/null and b/design/original/photos/emblem-breit-900.webp differ diff --git a/design/original/photos/hero-1000.webp b/design/original/photos/hero-1000.webp new file mode 100644 index 0000000..20843e2 Binary files /dev/null and b/design/original/photos/hero-1000.webp differ diff --git a/design/original/photos/hero-detail.webp b/design/original/photos/hero-detail.webp new file mode 100644 index 0000000..22210a4 Binary files /dev/null and b/design/original/photos/hero-detail.webp differ diff --git a/design/original/photos/hero-mobile.webp b/design/original/photos/hero-mobile.webp new file mode 100644 index 0000000..b1fc291 Binary files /dev/null and b/design/original/photos/hero-mobile.webp differ diff --git a/design/original/photos/hero.webp b/design/original/photos/hero.webp new file mode 100644 index 0000000..9730fe7 Binary files /dev/null and b/design/original/photos/hero.webp differ diff --git a/design/original/team/ahmad-thumb.webp b/design/original/team/ahmad-thumb.webp new file mode 100644 index 0000000..5d768ad Binary files /dev/null and b/design/original/team/ahmad-thumb.webp differ diff --git a/design/original/team/ahmad.webp b/design/original/team/ahmad.webp new file mode 100644 index 0000000..cc6969e Binary files /dev/null and b/design/original/team/ahmad.webp differ diff --git a/design/original/team/ali-thumb.webp b/design/original/team/ali-thumb.webp new file mode 100644 index 0000000..5c8218e Binary files /dev/null and b/design/original/team/ali-thumb.webp differ diff --git a/design/original/team/ali.webp b/design/original/team/ali.webp new file mode 100644 index 0000000..f03759a Binary files /dev/null and b/design/original/team/ali.webp differ diff --git a/design/original/team/amin-thumb.webp b/design/original/team/amin-thumb.webp new file mode 100644 index 0000000..809aeca Binary files /dev/null and b/design/original/team/amin-thumb.webp differ diff --git a/design/original/team/amin.webp b/design/original/team/amin.webp new file mode 100644 index 0000000..ac668fa Binary files /dev/null and b/design/original/team/amin.webp differ diff --git a/design/original/team/atena-thumb.webp b/design/original/team/atena-thumb.webp new file mode 100644 index 0000000..ef0cab9 Binary files /dev/null and b/design/original/team/atena-thumb.webp differ diff --git a/design/original/team/atena.webp b/design/original/team/atena.webp new file mode 100644 index 0000000..8269cfd Binary files /dev/null and b/design/original/team/atena.webp differ diff --git a/design/original/team/mo-thumb.webp b/design/original/team/mo-thumb.webp new file mode 100644 index 0000000..e5386dc Binary files /dev/null and b/design/original/team/mo-thumb.webp differ diff --git a/design/original/team/mo.webp b/design/original/team/mo.webp new file mode 100644 index 0000000..fa311fe Binary files /dev/null and b/design/original/team/mo.webp differ diff --git a/design/original/team/younes-thumb.webp b/design/original/team/younes-thumb.webp new file mode 100644 index 0000000..181dee1 Binary files /dev/null and b/design/original/team/younes-thumb.webp differ diff --git a/design/original/team/younes.webp b/design/original/team/younes.webp new file mode 100644 index 0000000..fc4c829 Binary files /dev/null and b/design/original/team/younes.webp differ diff --git a/public/og.jpg b/public/og.jpg index 83b0422..ba1f03b 100644 Binary files a/public/og.jpg and b/public/og.jpg differ diff --git a/scripts/grain.py b/scripts/grain.py new file mode 100644 index 0000000..7e9b6bd --- /dev/null +++ b/scripts/grain.py @@ -0,0 +1,70 @@ +"""Filmkorn auf die Website-Fotos rechnen. + +Liest die unbearbeiteten Bilder aus design/original/ und schreibt die gekörnten Versionen +nach src/assets/. Hero: Variante A (fein), alle anderen Fotos: Variante B (Film, ISO 800). + + pip install numpy pillow + python3 scripts/grain.py +""" +from pathlib import Path + +import numpy as np +from PIL import Image, ImageFilter + +ROOT = Path(__file__).resolve().parent.parent +SRC = ROOT / 'design' / 'original' +DST = ROOT / 'src' / 'assets' + +VARIANTS = { + # fein & dezent + 'A': dict(amount=0.016, size=1.2), + # Film, ISO 800: sichtbares, leicht farbiges Korn, etwas angehobenes Schwarz, leicht entsättigt + 'B': dict(amount=0.028, size=1.5, color=0.15, lift=0.03, contrast=1.05, sat=0.92), +} + +HERO = {'photos/hero.webp', 'photos/hero-1000.webp', 'photos/hero-mobile.webp'} +LUMA = np.array([0.2126, 0.7152, 0.0722], np.float32) + + +def noise(rng, h, w, size, color): + """Gauß-Rauschen, auf Korngröße weichgezeichnet und wieder auf Standardabweichung 1 normiert.""" + def one(): + n = rng.normal(0, 1, (h, w)).astype(np.float32) + if size > 1: + im = Image.fromarray((n * 40 + 128).clip(0, 255).astype(np.uint8)) + n = (np.asarray(im.filter(ImageFilter.GaussianBlur(size * 0.5)), np.float32) - 128) / 40 + n /= n.std() + 1e-6 + return n + + mono = one() + if not color: + return np.stack([mono] * 3, -1) + return np.stack([mono + color * one() for _ in range(3)], -1) + + +def grain(img, rng, amount, size, color=0.0, lift=0.0, contrast=1.0, sat=1.0): + a = np.asarray(img.convert('RGB'), np.float32) / 255 + h, w, _ = a.shape + a = (a - 0.5) * contrast + 0.5 + lum = a @ LUMA + a = lum[..., None] + (a - lum[..., None]) * sat + a = lift + a * (1 - lift) + # Korn vor allem in den Mitteltönen, wie bei Film + lum = np.clip(a @ LUMA, 0, 1) + weight = 4 * lum * (1 - lum) + 0.35 + a = a + noise(rng, h, w, size, color) * amount * weight[..., None] + return Image.fromarray((np.clip(a, 0, 1) * 255).astype(np.uint8)) + + +def main(): + for i, src in enumerate(sorted(SRC.rglob('*.webp'))): + rel = src.relative_to(SRC).as_posix() + variant = 'A' if rel in HERO else 'B' + out = grain(Image.open(src), np.random.default_rng(i + 1), **VARIANTS[variant]) + dst = DST / rel + out.save(dst, 'WEBP', quality=82, method=6) + print(f'{variant} {rel:28} {src.stat().st_size // 1024:4} KB -> {dst.stat().st_size // 1024:4} KB') + + +if __name__ == '__main__': + main() diff --git a/src/assets/gallery/blond.webp b/src/assets/gallery/blond.webp index efe5530..10eb6e4 100644 Binary files a/src/assets/gallery/blond.webp and b/src/assets/gallery/blond.webp differ diff --git a/src/assets/gallery/crew.webp b/src/assets/gallery/crew.webp index cf3f43b..586c372 100644 Binary files a/src/assets/gallery/crew.webp and b/src/assets/gallery/crew.webp differ diff --git a/src/assets/gallery/fade-bart.webp b/src/assets/gallery/fade-bart.webp index 9c18cd6..3f32d2e 100644 Binary files a/src/assets/gallery/fade-bart.webp and b/src/assets/gallery/fade-bart.webp differ diff --git a/src/assets/gallery/platin.webp b/src/assets/gallery/platin.webp index 00a1e70..b392504 100644 Binary files a/src/assets/gallery/platin.webp and b/src/assets/gallery/platin.webp differ diff --git a/src/assets/gallery/twists.webp b/src/assets/gallery/twists.webp index eda55f4..a4952c3 100644 Binary files a/src/assets/gallery/twists.webp and b/src/assets/gallery/twists.webp differ diff --git a/src/assets/photos/emblem-breit-900.webp b/src/assets/photos/emblem-breit-900.webp index 8b57af8..6c9ced8 100644 Binary files a/src/assets/photos/emblem-breit-900.webp and b/src/assets/photos/emblem-breit-900.webp differ diff --git a/src/assets/photos/hero-1000.webp b/src/assets/photos/hero-1000.webp index 20843e2..7c1d37f 100644 Binary files a/src/assets/photos/hero-1000.webp and b/src/assets/photos/hero-1000.webp differ diff --git a/src/assets/photos/hero-detail.webp b/src/assets/photos/hero-detail.webp index 22210a4..f3f6957 100644 Binary files a/src/assets/photos/hero-detail.webp and b/src/assets/photos/hero-detail.webp differ diff --git a/src/assets/photos/hero-mobile.webp b/src/assets/photos/hero-mobile.webp index b1fc291..91907d0 100644 Binary files a/src/assets/photos/hero-mobile.webp and b/src/assets/photos/hero-mobile.webp differ diff --git a/src/assets/photos/hero.webp b/src/assets/photos/hero.webp index 9730fe7..2cc9fb4 100644 Binary files a/src/assets/photos/hero.webp and b/src/assets/photos/hero.webp differ diff --git a/src/assets/team/ahmad-thumb.webp b/src/assets/team/ahmad-thumb.webp index 5d768ad..d8e3c09 100644 Binary files a/src/assets/team/ahmad-thumb.webp and b/src/assets/team/ahmad-thumb.webp differ diff --git a/src/assets/team/ahmad.webp b/src/assets/team/ahmad.webp index cc6969e..fee435b 100644 Binary files a/src/assets/team/ahmad.webp and b/src/assets/team/ahmad.webp differ diff --git a/src/assets/team/ali-thumb.webp b/src/assets/team/ali-thumb.webp index 5c8218e..a4465a6 100644 Binary files a/src/assets/team/ali-thumb.webp and b/src/assets/team/ali-thumb.webp differ diff --git a/src/assets/team/ali.webp b/src/assets/team/ali.webp index f03759a..fc4db68 100644 Binary files a/src/assets/team/ali.webp and b/src/assets/team/ali.webp differ diff --git a/src/assets/team/amin-thumb.webp b/src/assets/team/amin-thumb.webp index 809aeca..dcd89aa 100644 Binary files a/src/assets/team/amin-thumb.webp and b/src/assets/team/amin-thumb.webp differ diff --git a/src/assets/team/amin.webp b/src/assets/team/amin.webp index ac668fa..d3f02f0 100644 Binary files a/src/assets/team/amin.webp and b/src/assets/team/amin.webp differ diff --git a/src/assets/team/atena-thumb.webp b/src/assets/team/atena-thumb.webp index ef0cab9..1bcec3c 100644 Binary files a/src/assets/team/atena-thumb.webp and b/src/assets/team/atena-thumb.webp differ diff --git a/src/assets/team/atena.webp b/src/assets/team/atena.webp index 8269cfd..d3af236 100644 Binary files a/src/assets/team/atena.webp and b/src/assets/team/atena.webp differ diff --git a/src/assets/team/mo-thumb.webp b/src/assets/team/mo-thumb.webp index e5386dc..89a3258 100644 Binary files a/src/assets/team/mo-thumb.webp and b/src/assets/team/mo-thumb.webp differ diff --git a/src/assets/team/mo.webp b/src/assets/team/mo.webp index fa311fe..c043b58 100644 Binary files a/src/assets/team/mo.webp and b/src/assets/team/mo.webp differ diff --git a/src/assets/team/younes-thumb.webp b/src/assets/team/younes-thumb.webp index 181dee1..babe7fc 100644 Binary files a/src/assets/team/younes-thumb.webp and b/src/assets/team/younes-thumb.webp differ diff --git a/src/assets/team/younes.webp b/src/assets/team/younes.webp index fc4c829..1dd5749 100644 Binary files a/src/assets/team/younes.webp and b/src/assets/team/younes.webp differ