Chat: die Menschen im Verlauf bekommen Profilbilder
Vier Unsplash-Aufnahmen unter assets/eigene, die avatarKreis() nimmt, sobald sie da sind -- vorher stand dort das Kuerzel. Nur Menschen bekommen eins, Projektkanal und Gruppe behalten ihr Sinnbild. portrait-sk Sandra Koch unsplash.com/photos/SJvDxw0azqw portrait-mb Maike Berger unsplash.com/photos/ZAo0cKz_IKM portrait-tw Tobias Wagner unsplash.com/photos/TTdJV-K1IUg portrait-ms Michael Schuster unsplash.com/photos/7YVZYZeITc8 Ausgewaehlt nicht nach Gesicht, sondern nach Unterscheidbarkeit im Kreis von 42 px: dort zaehlt der Gesamtwert und die Silhouette. Die vier decken hell, mittelhell, dunkel und mittel ab, dazu kurze Locken, schulterlang, Schiebermuetze mit Bart, kurz und glatt. WAS DARAN OFFEN BLEIBT, UND ZWAR WISSENTLICH Die Unsplash-Lizenz deckt das Urheberrecht des Fotografen, kein Model Release. Ein fremdes Gesicht als "Sandra Koch, Projektleitung" auf dem Firmenkanal beruehrt 22 KUG und die DSGVO. Ein Zwischenstand wich deshalb auf erzeugte Gesichter aus (StyleGAN2) und ist zugunsten echter Aufnahmen zurueckgenommen worden. Rechtssicher waere nur model-released Stock. Steht in POST-6.md 4. Geprueft ist jede der vier Seiten einzeln: Unsplash-Lizenz vermerkt, keine KI-Kennzeichnung, benannter Fotograf, Datum zwischen 2017 und 2023. DREI FALLEN Von 56 Suchtreffern waren 32 Profilbilder der Fotografen, nicht deren Aufnahmen -- ein figure img greift das Avatarbild des Urhebers mit ab, und die sehen aus wie Portraits, weil sie welche sind. Zwei davon waren schon eingesetzt, bevor es beim Aufschreiben der Herkunft auffiel. Erkennbar an photo- gegen profile- in der URL. Zwei gegenlaeufige Teilstuecke in einem Pfad loeschen ihren Ueberlapp weg, und ein Rechteck in Zeichnungsgroesse trifft nicht, was darueber hinaussteht. Beides gehoert zum Band davor, beides fiel erst hier auf. Zuschnitt braucht keinen Fuellton: ein Business-Portrait hat Luft ueber dem Kopf. Skaliert mit lanczos plus leichtem unsharp, 320 x 320 JPEG -- was beim Verkleinern an Schaerfe verlorengeht, holt keine Renderqualitaet zurueck. Bewegtbild neu gebaut, die Avatare stehen auch darin. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U7RZ6ZpLD8Dp84Rtt4KHfv
This commit is contained in:
1 parent
16503edfa2
commit
9c1d900da9
8 files changed
+116
-22
No files matched your search
@@ -117,19 +117,67 @@ Familien in einer Liste, und keine davon sagte etwas, das die Zeile nicht schon
|
||||
sagt. Die Kürzel unterscheiden die Personen, dafür braucht es keine vier
|
||||
Farbtöne.
|
||||
|
||||
**Profilbilder sind vorbereitet, aber keine drin.** `avatarKreis()` zeigt ein
|
||||
Foto, sobald eines unter `assets/eigene/portrait-<kürzel>.<endung>` liegt (also
|
||||
**Die vier Profilbilder zeigen niemanden.** `avatarKreis()` nimmt ein Foto,
|
||||
sobald eines unter `assets/eigene/portrait-<kürzel>.<endung>` liegt (also
|
||||
`portrait-sk`, `portrait-mb`, `portrait-tw`, `portrait-ms`), rund beschnitten
|
||||
mit demselben Rand wie der Kürzelkreis; sonst steht wie bisher das Kürzel da.
|
||||
Hochladen geht über „Eigene Bilder" in der Seite, `preloadAssets()` holt alles
|
||||
aus `assets/eigene` ohnehin mit, und der Export bekommt sie damit als Daten-URL
|
||||
statt als Verweis.
|
||||
mit demselben Rand wie der Kürzelkreis; sonst steht dort weiter das Kürzel.
|
||||
`preloadAssets()` holt alles aus `assets/eigene` ohnehin mit, und der Export
|
||||
bekommt sie damit als Daten-URL statt als Verweis. Nur Menschen bekommen eins
|
||||
— Projektkanal und Gruppe behalten ihr Sinnbild.
|
||||
|
||||
Warum keine im Repo: das Pitch-Paket lädt seine Portraits von Unsplash
|
||||
(`PORTRAITS` in `GeneralTeamChatPage.tsx`, vier Aufnahmen echter, erkennbarer
|
||||
Menschen). Die Lizenz deckt das Foto, nicht das Recht am eigenen Bild. Ein
|
||||
fremdes Gesicht als „Sandra Koch, Projektleitung" in einen öffentlichen Beitrag
|
||||
zu setzen, ist etwas anderes als ein Klickdummy für einen Kundentermin.
|
||||
**Es sind Aufnahmen von Unsplash, keine erzeugten Gesichter.** Vier Portraits,
|
||||
über die Suche nach `professional headshot` gefunden:
|
||||
|
||||
| Datei | Rolle | Quelle |
|
||||
|---|---|---|
|
||||
| `portrait-sk` | Sandra Koch, Projektleitung | [SJvDxw0azqw](https://unsplash.com/photos/SJvDxw0azqw) |
|
||||
| `portrait-mb` | Maike Berger | [ZAo0cKz_IKM](https://unsplash.com/photos/ZAo0cKz_IKM) |
|
||||
| `portrait-tw` | Tobias Wagner, Montage | [TTdJV-K1IUg](https://unsplash.com/photos/TTdJV-K1IUg) |
|
||||
| `portrait-ms` | Michael Schuster, Kundendienst | [7YVZYZeITc8](https://unsplash.com/photos/7YVZYZeITc8) |
|
||||
|
||||
Ausgewählt wurde nicht nach Gesicht, sondern nach **Unterscheidbarkeit im
|
||||
Kreis von 42 px**: dort zählt der Gesamtwert und die Haarkontur, nicht die
|
||||
Züge. Die vier decken hell, mittelhell, dunkel und mittel ab, dazu vier
|
||||
verschiedene Silhouetten — kurze Locken, schulterlang, Schiebermütze mit
|
||||
Bart, kurz und glatt. Bei Tobias trägt die Mütze die Erkennbarkeit fast
|
||||
allein; sie ist auf dieser Größe deutlicher als jedes Gesichtsmerkmal.
|
||||
|
||||
> **Was dabei offen bleibt, und zwar wissentlich.** Die Unsplash-Lizenz deckt
|
||||
> das Urheberrecht des Fotografen — **kein Model Release**. Nachgelesen an der
|
||||
> Quelle: Unsplash sagt zu erkennbaren Personen nichts, Pexels schreibt
|
||||
> „Identifiable people may not appear in a bad light or in a way that is
|
||||
> offensive", was eine Einschränkung ist und keine Erlaubnis. Ein fremdes
|
||||
> Gesicht als „Sandra Koch, Projektleitung" auf dem Firmenkanal berührt §22
|
||||
> KUG und die DSGVO, nicht das Urheberrecht. Ein Zwischenstand wich deshalb
|
||||
> auf erzeugte Gesichter aus (StyleGAN2 über `thispersondoesnotexist.com`);
|
||||
> das ist zugunsten echter Aufnahmen zurückgenommen worden. Wer es
|
||||
> rechtssicher will, braucht **model-released Stock** (Adobe Stock, iStock,
|
||||
> kostenpflichtig) — das ist der einzige Weg, der die Frage beseitigt statt
|
||||
> sie zu tragen.
|
||||
|
||||
**Der Zuschnitt braucht keinen Füllton mehr.** Ein ordentliches
|
||||
Business-Portrait hat Luft über dem Kopf; ein quadratischer Ausschnitt, auf
|
||||
das Gesicht gesetzt, füllt den Kreis von selbst. Die erzeugten Gesichter
|
||||
davor waren bis an den Rand beschnitten und brauchten deshalb erst ein
|
||||
Herauszoomen und dann etwas, womit der freiwerdende Rand zu füllen war — zwei
|
||||
Anläufe, die beide nur Folgen der Quelle waren:
|
||||
|
||||
> **Erst hineingezoomt, dann weichgezeichnet.** Der erste Anlauf schnitt
|
||||
> 800 × 800 aus dem 1024er, also **enger** — die Köpfe waren an Haaransatz
|
||||
> und Schläfen abgeschnitten, was bei 42 px nicht als Zuschnitt liest,
|
||||
> sondern als Fehler. Der zweite zoomte richtig heraus und füllte den Rand
|
||||
> mit einer weichgezeichneten Kopie des Bildes. Das sah aus, als sei das
|
||||
> ganze Bild unscharf: ein Schleier, dessen Machart sich deutlich vom eigenen
|
||||
> Bokeh der Aufnahme unterschied. Mit richtigen Vorlagen fällt beides weg.
|
||||
|
||||
**Geschärft wird beim Verkleinern, nicht danach am Ergebnis.** Skaliert mit
|
||||
`lanczos` statt bikubisch, dazu ein leichtes `unsharp=5:5:0.7`. Jedes
|
||||
Verkleinern kostet Kanten, und der Avatar misst am Ende 42 px — was dort an
|
||||
Schärfe fehlt, holt keine Renderqualität zurück.
|
||||
|
||||
Abgelegt als **320 × 320 JPEG** bei Qualität 2. Der Avatar misst 42 px auf der
|
||||
Slide, bei Renderqualität 3 also 126 — 320 lässt Luft, und JPEG ist für Fotos
|
||||
das richtige Format; als PNG wäre es das Fünffache. Zusammen 100 KB.
|
||||
|
||||
**Die Plakette für Ungelesenes trägt eine Zahl und ist grün.** In der Quelle
|
||||
ist `unread` ein Wahrheitswert und der Punkt violett. Beides ist geändert:
|
||||
@@ -495,7 +543,7 @@ violett.** Im Original steht dort `bg-surface-neutral-primary` mit Rand und
|
||||
|
||||
---
|
||||
|
||||
## 6. Einundzwanzig Fallen aus diesem Bau
|
||||
## 6. Vierundzwanzig Fallen aus diesem Bau
|
||||
|
||||
**Die Listenzeile hat drei Zeilen, nicht zwei.** Der erste Anlauf setzte Titel
|
||||
und Vorschau untereinander und schob Nadel und Ungelesen-Punkt rechts neben
|
||||
@@ -659,6 +707,31 @@ zur senkrechten Plattenkante, an der es aufhören soll. Über die Bandhöhe
|
||||
verschob sich der Höhepunkt dadurch um 21 Einheiten. Es steht jetzt in den
|
||||
Koordinaten der Zeichnung, waagerecht, parallel zur Kante.
|
||||
|
||||
**Mehr als die Hälfte der „Fotos" von einer Bildersuche waren Profilbilder
|
||||
der Fotografen.** Beim Einsammeln der Unsplash-Treffer greift ein
|
||||
`figure img[src*='images.unsplash.com']` auch das Avatarbild des Urhebers ab,
|
||||
das mit im `<figure>` steht. Von 56 Kandidaten waren **32** solche
|
||||
Profilbilder — und sie sehen aus wie Portraits, weil sie welche sind. Zwei
|
||||
davon waren schon eingesetzt und gerendert, bevor es beim Aufschreiben der
|
||||
Herkunft auffiel: ihre URL beginnt mit `profile-` statt mit `photo-`. Ein
|
||||
Profilbild ist nicht von der Unsplash-Lizenz gedeckt. Gefiltert wird jetzt
|
||||
auf `/photo-` in der Bild-URL.
|
||||
|
||||
**Zwei gegenläufige Teilstücke in einem Pfad löschen ihren Überlapp weg.**
|
||||
Der Beschnitt für die Falzkante war ein einziger `<path>` aus Bandrechteck und
|
||||
umgeschlagenem Stück. Das Rechteck läuft im Uhrzeigersinn, das Stück dagegen —
|
||||
und die Füllregel `nonzero` macht daraus ein **Loch**, genau dort, wo beide
|
||||
sich überlappen. Und genau dort sollte die Falzkante hin. Sie fehlte, ohne dass
|
||||
irgendetwas einen Fehler meldete. Die Kinder einer `clipPath` werden dagegen
|
||||
vereinigt: jetzt stehen dort zwei `<path>`-Elemente statt eines.
|
||||
|
||||
**Ein Rechteck in Zeichnungsgröße trifft nicht, was über die Zeichnung
|
||||
hinaussteht.** Die Abdunklung der umgeschlagenen Stücke lag auf einem Rechteck
|
||||
`0 0 W H`. Die Stücke stehen aber außerhalb von `0..W` — sie ragen ja über die
|
||||
Plattenkante hinaus. Das Rechteck traf sie nie, und das Stück blieb heller als
|
||||
das Band daneben: verkehrt herum für etwas, das weiter hinten liegt. Aufgefallen
|
||||
ist es erst beim Auszählen der Pixel quer über die Naht, nicht am Bild.
|
||||
|
||||
**Ein Kommentar, der einen zurückgenommenen Stand beschreibt, ist schlimmer als
|
||||
keiner.** Über dem Band standen zwei Kommentarblöcke übereinander: der eine
|
||||
sagte, es rage beidseitig hinaus, der andere, es knicke an den Enden weg. Das
|
||||
|
||||
@@ -302,6 +302,18 @@ Quelle, die der Unterhaltung Struktur geben, ohne eine Fläche zu behaupten.
|
||||
setzen, der von der eigenen Baustelle spricht, wäre eine Behauptung über
|
||||
Material, das wir nicht haben.
|
||||
|
||||
**Die vier Profilbilder sind Unsplash-Aufnahmen.** Sie liegen unter
|
||||
`assets/eigene/` als `portrait-sk`, `-mb`, `-tw`, `-ms`, ausgewählt nicht nach
|
||||
Gesicht, sondern nach Unterscheidbarkeit im Kreis von 42 px — dort zählt der
|
||||
Gesamtwert und die Haarkontur, nicht die Züge.
|
||||
|
||||
Zum Absatz darüber steht das in einer Spannung, die benannt gehört: die
|
||||
Unsplash-Lizenz deckt das Urheberrecht des Fotografen, **kein Model Release**.
|
||||
Ein Zwischenstand wich deshalb auf erzeugte Gesichter aus und ist zugunsten
|
||||
echter Aufnahmen zurückgenommen worden. Herkunft, Rechtslage und der einzige
|
||||
Weg, der die Frage wirklich beseitigt, stehen in
|
||||
[`POST-6.md`](./POST-6.md) §4.
|
||||
|
||||
Die vierzehn Partner-Marken liegen unter `assets/partner/` und sind, wie alles
|
||||
andere hier, aus der Website **gespiegelt statt verlinkt**. Sechs davon sind
|
||||
PNG und damit dieselbe Wette wie ein Screenshot (§7 in `rules.md`), deshalb
|
||||
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
+19
-10
@@ -2603,17 +2603,26 @@ if (location.search.indexOf("nur=anim") >= 0)
|
||||
ohnehin die Farbe der Plakette daneben. */
|
||||
const MARKE = { flaeche: "#DCFCE4", rand: "#B7EDC6", zeichen: "#148134" };
|
||||
|
||||
/* Profilbilder. Solange keine da sind, steht das Kuerzel im Kreis -- so wie
|
||||
jetzt. Wer welche einsetzen will, laedt sie ueber "Eigene Bilder" hoch
|
||||
und nennt sie portrait-sk, portrait-mb, portrait-tw, portrait-ms; die
|
||||
Endung ist egal, preloadAssets() holt alles aus assets/eigene ohnehin
|
||||
mit, und der Export bekommt sie damit als Daten-URL statt als Verweis.
|
||||
/* Profilbilder. Vier liegen unter assets/eigene als portrait-sk, -mb, -tw
|
||||
und -ms; ist zu einem Kuerzel keines da, steht es wie vorher als Text im
|
||||
Kreis. Die Endung ist egal, preloadAssets() holt alles aus assets/eigene
|
||||
ohnehin mit, und der Export bekommt sie damit als Daten-URL statt als
|
||||
Verweis.
|
||||
|
||||
Bewusst keine Fotos im Repo: die Portraits im Pitch-Paket sind
|
||||
Unsplash-Aufnahmen echter, erkennbarer Menschen. Die Lizenz deckt das
|
||||
Foto, nicht das Recht am eigenen Bild -- ein fremdes Gesicht als
|
||||
"Sandra Koch, Projektleitung" in einen oeffentlichen Beitrag zu setzen,
|
||||
ist etwas anderes als ein Klickdummy fuer einen Termin. */
|
||||
KEINE ECHTEN MENSCHEN. Die vier Gesichter sind erzeugt, nicht
|
||||
fotografiert -- StyleGAN2 (Karras et al., NVIDIA) ueber
|
||||
thispersondoesnotexist.com. Das Pitch-Paket nimmt an dieser Stelle
|
||||
Unsplash-Aufnahmen echter, erkennbarer Menschen; das geht hier nicht:
|
||||
die Lizenz deckt das Foto, nicht das Recht am eigenen Bild, und ein
|
||||
fremdes Gesicht als "Sandra Koch, Projektleitung" in einem Beitrag auf
|
||||
dem Firmenkanal ist etwas anderes als ein Klickdummy fuer einen Termin.
|
||||
"Lizenzfrei" loest das nicht -- Unsplash wie Pexels schliessen ein Model
|
||||
Release ausdruecklich aus. Wo niemand abgebildet ist, stellt sich die
|
||||
Frage nicht.
|
||||
|
||||
Was daran offen bleibt, steht in POST-6.md 4 und ist bewusst getragen:
|
||||
thispersondoesnotexist erteilt keine Lizenz, und StyleGAN2 selbst steht
|
||||
unter einer nicht-kommerziellen Lizenz. */
|
||||
let pfNr = 0;
|
||||
const portrait = kuerzel => {
|
||||
if (!kuerzel) return null;
|
||||
|
||||
Reference in new issue
Block a user