223015b phase 3: psychovisualitaet-grafik demo (kap2 folie 14 'luminanz vor chrominanz'). zwei-spalten-vergleich: links 4:4:4 ohne subsampling (Y/Cb/Cr alle 100%, datenmenge 100%) vs rechts 4:2:0 JPEG/H.264 standard (Y 100%, Cb/Cr 25%, datenmenge 50%). beide spalten zeigen identisches sunset-bild — das auge sieht den unterschied nicht weil farb-auflösung nicht so scharf wahrgenommen wird wie helligkeit. verdict 'halbe datenmenge, identisches bild — JPEG/H.264/H.265/WebP reduzieren alle die farb-auflösung auf ein viertel. was wir nicht scharf sehen muss man nicht scharf speichern'
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Psychovisualität — Luminanz vor Chrominanz</title>
|
||||
<style>
|
||||
:root {
|
||||
--dark: #1a1a2e;
|
||||
--muted: #6b7280;
|
||||
--soft: #f8fafc;
|
||||
--border: #cbd5e1;
|
||||
--hl: #d63384;
|
||||
--full: #2563eb;
|
||||
--reduced: #7c3aed;
|
||||
--y: #1a1a2e;
|
||||
--cb: #2563eb;
|
||||
--cr: #ef4444;
|
||||
--bar-bg: #e2e8f0;
|
||||
}
|
||||
html, body { margin: 0; padding: 0; background: #fff; font-family: system-ui, -apple-system, sans-serif; color: var(--dark); }
|
||||
body { padding: 30px 40px; }
|
||||
h1 { text-align: center; margin: 0 0 6px; font-size: 1.75rem; }
|
||||
.sub { text-align: center; color: var(--muted); margin-bottom: 24px; font-size: 1.05rem; }
|
||||
.sub strong { color: var(--dark); }
|
||||
|
||||
.compare {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 22px;
|
||||
max-width: 1180px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.col {
|
||||
border: 2px solid;
|
||||
border-radius: 12px;
|
||||
padding: 16px 20px;
|
||||
background: #fff;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.col.full { border-color: var(--full); }
|
||||
.col.reduced { border-color: var(--reduced); }
|
||||
|
||||
.col-head { display: flex; justify-content: space-between; align-items: baseline; }
|
||||
.col-tag {
|
||||
font-size: 0.72rem;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.12em;
|
||||
color: var(--muted);
|
||||
}
|
||||
.col-name { font-size: 1.25rem; font-weight: 700; }
|
||||
.col.full .col-name { color: var(--full); }
|
||||
.col.reduced .col-name { color: var(--reduced); }
|
||||
.col-format {
|
||||
font-family: ui-monospace, monospace;
|
||||
font-size: 0.82rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.preview {
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
.preview svg { display: block; }
|
||||
|
||||
.channels {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.channel { display: grid; grid-template-columns: 90px 1fr 60px; gap: 8px; align-items: center; font-size: 0.85rem; }
|
||||
.channel-label {
|
||||
font-family: ui-monospace, monospace;
|
||||
font-weight: 700;
|
||||
}
|
||||
.channel-bar { height: 14px; background: var(--bar-bg); border-radius: 3px; overflow: hidden; }
|
||||
.channel-bar .fill { height: 100%; border-radius: 3px; }
|
||||
.channel-bar .fill.y { background: var(--y); }
|
||||
.channel-bar .fill.cb { background: var(--cb); }
|
||||
.channel-bar .fill.cr { background: var(--cr); }
|
||||
.channel-pct {
|
||||
font-family: ui-monospace, monospace;
|
||||
font-size: 0.78rem;
|
||||
color: var(--muted);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.summary-line {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
background: var(--soft);
|
||||
border-radius: 6px;
|
||||
padding: 6px 12px;
|
||||
font-family: ui-monospace, monospace;
|
||||
font-size: 0.85rem;
|
||||
color: var(--dark);
|
||||
}
|
||||
.summary-line strong { color: var(--hl); }
|
||||
|
||||
.verdict {
|
||||
margin-top: 22px;
|
||||
max-width: 1180px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
border: 2px solid var(--hl);
|
||||
border-radius: 12px;
|
||||
padding: 14px 22px;
|
||||
}
|
||||
.verdict-q { font-size: 1.1rem; font-weight: 700; color: var(--hl); }
|
||||
.verdict-a { font-size: 0.93rem; color: var(--dark); margin-top: 4px; }
|
||||
.verdict-a strong { color: var(--hl); }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Psychovisualität — Luminanz vor Chrominanz</h1>
|
||||
<div class="sub">Das Auge sieht <strong>Helligkeit</strong> scharf. <strong>Farbe</strong> darf grob bleiben — und das Bild sieht trotzdem identisch aus.</div>
|
||||
|
||||
<div class="compare">
|
||||
|
||||
<div class="col full">
|
||||
<div class="col-head">
|
||||
<span class="col-name">Ohne Subsampling</span>
|
||||
<span class="col-tag">4:4:4</span>
|
||||
</div>
|
||||
<div class="col-format">jedes Pixel speichert Y · Cb · Cr in voller Auflösung</div>
|
||||
|
||||
<svg class="preview" viewBox="0 0 320 130" preserveAspectRatio="xMidYMid slice">
|
||||
<defs>
|
||||
<linearGradient id="full-sky" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#fde68a"/>
|
||||
<stop offset="55%" stop-color="#fb923c"/>
|
||||
<stop offset="100%" stop-color="#7c3aed"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect x="0" y="0" width="320" height="130" fill="url(#full-sky)"/>
|
||||
<circle cx="230" cy="50" r="22" fill="#fef3c7"/>
|
||||
<path d="M0,90 L40,75 L90,87 L140,68 L190,82 L240,66 L290,80 L320,72 L320,130 L0,130 Z" fill="#1e1b4b"/>
|
||||
<path d="M0,108 L60,100 L120,108 L180,98 L240,106 L300,98 L320,103 L320,130 L0,130 Z" fill="#0f172a" opacity="0.7"/>
|
||||
</svg>
|
||||
|
||||
<div class="channels">
|
||||
<div class="channel">
|
||||
<span class="channel-label">Y</span>
|
||||
<div class="channel-bar"><div class="fill y" style="width:100%"></div></div>
|
||||
<span class="channel-pct">100 %</span>
|
||||
</div>
|
||||
<div class="channel">
|
||||
<span class="channel-label">Cb</span>
|
||||
<div class="channel-bar"><div class="fill cb" style="width:100%"></div></div>
|
||||
<span class="channel-pct">100 %</span>
|
||||
</div>
|
||||
<div class="channel">
|
||||
<span class="channel-label">Cr</span>
|
||||
<div class="channel-bar"><div class="fill cr" style="width:100%"></div></div>
|
||||
<span class="channel-pct">100 %</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="summary-line">
|
||||
<span>Datenmenge:</span>
|
||||
<span><strong>100 %</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col reduced">
|
||||
<div class="col-head">
|
||||
<span class="col-name">JPEG · H.264 Standard</span>
|
||||
<span class="col-tag">4:2:0</span>
|
||||
</div>
|
||||
<div class="col-format">Y voll · Cb & Cr nur in 2×2-Pixel-Blöcken</div>
|
||||
|
||||
<svg class="preview" viewBox="0 0 320 130" preserveAspectRatio="xMidYMid slice">
|
||||
<defs>
|
||||
<linearGradient id="red-sky" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#fde68a"/>
|
||||
<stop offset="55%" stop-color="#fb923c"/>
|
||||
<stop offset="100%" stop-color="#7c3aed"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<rect x="0" y="0" width="320" height="130" fill="url(#red-sky)"/>
|
||||
<circle cx="230" cy="50" r="22" fill="#fef3c7"/>
|
||||
<path d="M0,90 L40,75 L90,87 L140,68 L190,82 L240,66 L290,80 L320,72 L320,130 L0,130 Z" fill="#1e1b4b"/>
|
||||
<path d="M0,108 L60,100 L120,108 L180,98 L240,106 L300,98 L320,103 L320,130 L0,130 Z" fill="#0f172a" opacity="0.7"/>
|
||||
</svg>
|
||||
|
||||
<div class="channels">
|
||||
<div class="channel">
|
||||
<span class="channel-label">Y</span>
|
||||
<div class="channel-bar"><div class="fill y" style="width:100%"></div></div>
|
||||
<span class="channel-pct">100 %</span>
|
||||
</div>
|
||||
<div class="channel">
|
||||
<span class="channel-label">Cb</span>
|
||||
<div class="channel-bar"><div class="fill cb" style="width:25%"></div></div>
|
||||
<span class="channel-pct">25 %</span>
|
||||
</div>
|
||||
<div class="channel">
|
||||
<span class="channel-label">Cr</span>
|
||||
<div class="channel-bar"><div class="fill cr" style="width:25%"></div></div>
|
||||
<span class="channel-pct">25 %</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="summary-line">
|
||||
<span>Datenmenge:</span>
|
||||
<span><strong>50 %</strong></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="verdict">
|
||||
<div class="verdict-q">Halbe Datenmenge. Identisches Bild — für dein Auge.</div>
|
||||
<div class="verdict-a">JPEG, H.264, H.265, WebP — alle reduzieren die Farb-Auflösung auf <strong>ein Viertel</strong>. Das ist Psychovisualität: was wir nicht scharf sehen, muss man nicht scharf speichern.</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 76 KiB |
Reference in New Issue
Block a user