WvdS Responsive Image Plugin
Responsive Image skaliert Bilder auf dem Server und liefert sie in der Größe aus, die die Seite tatsächlich braucht — mit Zwischenspeicher und wahlweise als eingebettete Base64-Ausgabe. Gedacht ist das Paket für Autoren, die ein Bild in einer bestimmten Größe einsetzen, ohne es vorher zu beschneiden, und für Verwalter, die Ladezeiten und Zwischenspeicher im Blick behalten.
Erste Schritte
Schnelleinstieg: Ein Bild in der gewünschten Größe einbinden — der kürzeste Weg zum ersten Ergebnis, in drei Schritten.
Häufige Aufgaben
| Was Sie wollen | Für wen | Wo Sie das tun | Anleitung |
|---|---|---|---|
| ein Bild in fester Größe einsetzen | Autor | Marke {{wk:image>…}} | Syntax |
| die Parameter nachschlagen | Autor | – | Parameter |
| ein Bild eingebettet statt verlinkt ausliefern | Autor | Base64-Ausgabe | Parameter |
| ein Bild in einem Baustein verwenden | Autor | – | Integration mit wksnippet |
| verstehen, warum ein Bild unverändert erscheint | Autor | – | Fehlerbehandlung |
| Zwischenspeicher und Grenzen einstellen | Verwaltung | Konfigurationsmanager | Konfiguration |
| die Auswirkung auf die Ladezeit einschätzen | Verwaltung | – | Performance |
Definition
Das wkimage Plugin ermöglicht base64-kodierte Bilder als Data-URI direkt im src-Attribut von <img>-Tags.
DokuWiki hat keinen eingebauten Mechanismus für base64-Inline-Bilder. Standardmäßig werden Bilder immer als URL-Referenzen eingebunden:
<!-- Standard DokuWiki --> <img src="/lib/exe/fetch.php?media=wiki:logo.png" /> <!-- Mit wkimage --> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA..." />
Das Plugin löst dieses Problem durch serverseitiges Rendering mit intelligentem Caching.
Kernfunktionen:
- base64-Inline-Ausgabe - Bilder direkt im HTML eingebettet
- Serverseitiges Resizing - Automatische Größenanpassung
- Format-Konvertierung - PNG/JPEG/GIF zu WebP
- Intelligentes Caching - Verarbeitete Bilder werden gecacht
- Helper-API - Programmatischer Zugriff für Templates und Plugins
- Inline-CSS Support -
styleParameter für komplexe Positionierung - wksnippet Integration - Verwendbar in HTML-Snippets
Anwendungsfälle
- Responsive Logos - Hochauflösende Quellbilder, die sich an Container anpassen
- Optimierte Thumbnails - Automatische Verkleinerung ohne manuelle Bildversionen
- Format-Konvertierung - JPEG zu WebP für kleinere Dateigrößen
- Offline-Dokumente - PDF-Export mit eingebetteten Bildern
- Template-Logos - Flat Template nutzt wkimage für Logo-Rendering
- Reduzierte HTTP-Requests - Keine separaten Bild-Downloads nötig
- Bild-Overlays - Komplexe Positionierung mit
styleParameter - Wiederverwendbare Snippets - Integration mit wksnippet für HTML-Bausteine
Syntax
{{wk:image>mediaId|parameter1=wert1|parameter2=wert2}}
Minimalbeispiel
{{wk:image>wiki:logo.png}}
Vollständiges Beispiel
{{wk:image>wiki:logo.png|width=100%|maxwidth=600|quality=85|format=webp|cache=1w|alt=Firmenlogo|class=logo-responsive|style=border-radius:8px|lazy=1}}
Parameter
Pflichtparameter
| Parameter | Typ | Beschreibung |
|---|---|---|
| mediaId | string | DokuWiki Media-ID des Quellbildes. Format: namespace:dateiname.ext |
Größen-Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
width | string | auto | CSS-Breite. Unterstützt px, %, em, vw. Beispiel: width=100% |
height | string | auto | CSS-Höhe. Unterstützt px, %, em, vh. Beispiel: height=200px |
maxwidth | integer | 1200 | Maximale Pixel-Breite für Resize. Das Bild wird nie größer als dieser Wert skaliert. |
maxheight | integer | null | Maximale Pixel-Höhe für Resize. Optional, hält Seitenverhältnis. |
maxwidth × maxheight Pixel unter Beibehaltung des Seitenverhältnisses. Die width/height Parameter sind reine CSS-Angaben und beeinflussen nicht die tatsächliche Bildgröße.
Qualitäts-Parameter
| Parameter | Typ | Standard | Gültige Werte | Beschreibung |
|---|---|---|---|---|
quality | integer | 85 | 10-100 | JPEG/WebP-Kompressionsqualität. Höher = besser, aber größer. |
format | string | auto | jpeg, png, gif, webp | Ausgabeformat. Bei auto wird das Quellformat beibehalten. |
- webp - Beste Kompression, moderne Browser
- jpeg - Fotos, Farbverläufe
- png - Transparenz, scharfe Kanten, Logos
- gif - Einfache Grafiken, Animationen (keine Resize-Unterstützung für Animationen)
Cache-Parameter
| Parameter | Typ | Standard | Gültige Werte | Beschreibung |
|---|---|---|---|---|
cache | string | 1d | 1h, 6h, 1d, 1w, 1m | Cache-Dauer für das verarbeitete Bild. |
| Kürzel | Bedeutung |
|---|---|
h | Stunden |
d | Tage |
w | Wochen |
m | Monate (30 Tage) |
HTML-Attribute
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
alt | string | (leer) | Alternativer Text für Barrierefreiheit. Sollte immer gesetzt werden! |
class | string | wkimage | Zusätzliche CSS-Klassen. Mehrere mit Leerzeichen trennen. |
style | string | (leer) | Neu in 1.2.0: Inline-CSS für individuelle Positionierung und Styling. |
lazy | boolean | 1 | Lazy Loading aktivieren. 1 = aktiviert, 0 = deaktiviert. |
inline | boolean | 1 | Base64-Inline-Ausgabe. 1 = Data-URI, 0 = externe URL (zukünftig). |
Beispiele
Beispiel 1: Responsives Logo
Anforderung: Logo soll sich an die Containerbreite anpassen, aber nie größer als 300px werden.
{{wk:image>wiki:logo_hires.png|width=100%|maxwidth=300|alt=WvdS Logo}}
Ergebnis:
- Quellbild (z.B. 1200×480) wird auf 300×120 skaliert
- CSS
width: 100%macht es responsiv max-width: 300pxverhindert Vergrößerung über 300px
Beispiel 2: WebP-Konvertierung für Fotos
Anforderung: JPEG-Foto optimieren für schnellere Ladezeit.
{{wk:image>fotos:team.jpg|maxwidth=800|quality=80|format=webp|alt=Unser Team}}
Ergebnis:
- Konvertiert JPEG zu WebP (ca. 30% kleiner)
- Skaliert auf maximal 800px Breite
- Qualität 80% für guten Kompromiss
Beispiel 3: Thumbnail-Galerie
Anforderung: Einheitliche Thumbnails für Bildergalerie.
| {{wk:image>galerie:bild1.jpg|maxwidth=150|maxheight=150|alt=Bild 1}} | {{wk:image>galerie:bild2.jpg|maxwidth=150|maxheight=150|alt=Bild 2}} |
Beispiel 4: Hero-Banner mit Langzeit-Cache
Anforderung: Großes Banner-Bild, das sich selten ändert.
{{wk:image>design:hero-banner.png|width=100%|maxwidth=1920|quality=90|cache=1m|alt=Willkommen}}
Beispiel 5: Bild-Overlay mit style-Parameter
Anforderung: Zwei Bilder übereinander positionieren (z.B. Laptop mit Tablet davor).
<div style="position: relative; display: inline-block;"> {{wk:image>de:laptop.png|maxwidth=400|alt=Laptop|style=display:block}} {{wk:image>de:tablet.png|maxwidth=180|alt=Tablet|style=position:absolute;right:-30px;bottom:10px;transform:rotate(-5deg);box-shadow:0 4px 15px rgba(0,0,0,0.3)}} </div>
Ergebnis:
- Laptop als Basis-Bild (
display:block) - Tablet absolut positioniert, leicht gedreht mit Schatten
- Beide Bilder als base64 inline (keine HTTP-Requests)
Funktionsweise
Verarbeitungs-Pipeline
1. Syntax-Parsing
└── Extrahiert mediaId und Parameter aus {{wk:image>...}}
2. Quellbild laden
└── Liest Datei aus data/media/{namespace}/{datei}
└── Validiert Bildformat (PNG, JPEG, GIF, WebP)
3. Cache-Prüfung
└── Generiert Hash: MD5(pfad + mtime + breite + höhe + qualität + format)
└── Prüft data/cache/wkimage/{hash}.{format}
└── Bei Cache-Hit: Lädt gecachtes Bild
4. Bildverarbeitung (bei Cache-Miss)
└── imagecreatefrom{format}() - Lädt Quellbild
└── imagecreatetruecolor() - Erstellt Zielbild
└── imagecopyresampled() - Hochwertige Skalierung
└── image{format}() - Speichert in Zielformat
5. Cache-Speicherung
└── Schreibt verarbeitetes Bild nach data/cache/wkimage/
6. HTML-Ausgabe
└── Generiert <img src="data:image/{mime};base64,{daten}" .../>
Cache-Verzeichnis
Gecachte Bilder werden gespeichert in:
data/cache/wkimage/
Dateinamen-Format: {MD5-Hash}.{format}
Konfiguration
Admin-Einstellungen
Über Admin → Konfiguration → wkimage:
| Einstellung | Typ | Standard | Beschreibung |
|---|---|---|---|
defaultQuality | Zahl | 85 | Standard-Qualität wenn nicht angegeben |
defaultCache | Text | 1d | Standard-Cache-Dauer |
defaultMaxWidth | Zahl | 1200 | Standard maximale Breite |
enableWebp | An/Aus | An | WebP-Unterstützung aktivieren |
lazyLoad | An/Aus | An | Lazy Loading standardmäßig aktivieren |
Fehlerbehandlung
Fehlermeldungen
| Fehler | Ursache | Lösung |
|---|---|---|
Image not found: {mediaId} | Media-Datei existiert nicht | Pfad prüfen, Datei hochladen |
Invalid image: {mediaId} | Datei ist kein gültiges Bild | Bildformat prüfen, neu hochladen |
Image processing failed | GD-Bibliothek Fehler | PHP GD-Extension prüfen, Speicher erhöhen |
Voraussetzungen
- PHP GD-Extension - Muss aktiviert sein
- WebP-Unterstützung - Für
format=webpbenötigt (PHP 7.1+ mit libwebp) - Schreibrechte - Für
data/cache/wkimage/
Performance
Empfehlungen
| Szenario | Empfohlene Einstellungen |
| Logos, Icons | maxwidth=300, format=png, cache=1w |
| Fotos | maxwidth=800, quality=80, format=webp, cache=1d |
| Hero-Banner | maxwidth=1920, quality=85, cache=1m |
| Thumbnails | maxwidth=150, quality=75, cache=1w |
Speicherverbrauch
- 1920×1080 PNG: ~8 MB RAM
- 4000×3000 JPEG: ~48 MB RAM
Bei Speicherproblemen memory_limit in php.ini erhöhen.
Thread-Sicherheit
Das Plugin ist thread-safe. Parallele Anfragen für dasselbe Bild können temporär doppelte Verarbeitung auslösen, aber der Cache wird atomar geschrieben.
Integration mit wksnippet
Neu in Version 1.2.0: Das wk:image Tag kann direkt in WvdS Snippet Plugin-Snippets verwendet werden.
Funktionsweise
Das wksnippet-Plugin verarbeitet {{wk:image>...}} Tags innerhalb von Snippet-Dateien automatisch über den wkimage-Helper.
Beispiel: Hero-Images Snippet
Datei: lib/plugins/wksnippet/snippets/hero_images.html
<div class="hero-devices" style="position: relative; display: inline-block; margin: 20px 0;"> {{wk:image>de:laptop.png|maxwidth=400|alt=Laptop|style=display:block}} {{wk:image>de:tablet.png|maxwidth=180|alt=Tablet|style=position:absolute;right:-30px;bottom:10px;transform:rotate(-5deg);box-shadow:0 4px 15px rgba(0,0,0,0.3)}} </div>
Verwendung in Wiki-Seite:
{{wk:snippet>hero_images}}
Vorteile
| Aspekt | Ohne wkimage | Mit wkimage |
| Bild-Optimierung | Keine (Original-Größe) | Resize auf maxwidth, Caching |
| HTTP-Requests | 2 separate Requests | 0 (base64 inline) |
| Wartbarkeit | HTML-Pfade hardcoded | DokuWiki Media-IDs |
| Offline-Fähigkeit | Nein | Ja (eingebettet) |
Versionshinweise
| Version | Datum | Änderungen |
|---|---|---|
| 1.2.0 | 2026-01-26 | style Parameter für Inline-CSS, Integration mit wksnippet |
| 1.1.0 | 2026-01-08 | Helper-API für programmatischen Zugriff aus Templates und Plugins |
| 1.0.0 | 2026-01-06 | Erstveröffentlichung |
Siehe auch
- WvdS Snippet Plugin - Wiederverwendbare HTML-Snippets (unterstützt wk:image Tags)
- WvdS.DokuWiki.Flat Template - Template nutzt wkimage für Logo-Rendering
- Vorschau beim Teilen - Open Graph Meta-Tags (nutzt Bilder)
Technische Referenz
Klasse: syntax_plugin_wkimage
Datei: lib/plugins/wkimage/syntax.php
| Methode | Beschreibung |
|---|---|
getType() | Gibt substitution zurück |
getSort() | Gibt 319 zurück (Priorität) |
connectTo($mode) | Registriert Pattern {{wk:image>[^}]+}} |
handle($match, …) | Parst Syntax, extrahiert Parameter |
render($mode, …) | Generiert HTML-Ausgabe |
Private Methoden
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
calculateDimensions() | $origW, $origH, $opts | array | Berechnet Zielgröße |
processImage() | $file, $mime, $w, $h, $q, $fmt | string | Verarbeitet Bild |
getCacheKey() | $file, $w, $h, $q, $fmt | string | Generiert Cache-Hash |
buildHtml() | $data, $fmt, $opts, $w, $h | string | Erstellt HTML-Output |
Klasse: helper_plugin_wkimage
Datei: lib/plugins/wkimage/helper.php
Der Helper ermöglicht programmatischen Zugriff auf die Bildverarbeitung für Templates und Plugins.
Verwendung
// Helper laden $wkimage = plugin_load('helper', 'wkimage'); // Bild aus Wiki-Media rendern $html = $wkimage->renderImage('wiki', 'wiki:logo.png', array( 'maxwidth' => 300, 'quality' => 90, 'alt' => 'Logo', 'class' => 'my-logo', )); // Bild aus Template-Verzeichnis $html = $wkimage->renderImage('template', 'logo.png', array( 'maxwidth' => 300, )); // Bild aus absolutem Dateipfad $html = $wkimage->renderImage('file', '/path/to/image.jpg', array( 'maxwidth' => 800, 'format' => 'webp', ));
Methode: renderImage()
| Parameter | Typ | Beschreibung |
|---|---|---|
$source | string | Quelle: wiki, template, file |
$path | string | Pfad je nach Quelle |
$options | array | Optionale Rendering-Parameter |
Options-Parameter
| Option | Typ | Standard | Beschreibung |
|---|---|---|---|
maxwidth | int | 300 | Maximale Breite in Pixel |
maxheight | int | null | Maximale Höhe in Pixel |
quality | int | 85 | Bildqualität (10-100) |
format | string | auto | Ausgabeformat (jpeg, png, webp) |
class | string | '' | CSS-Klassen (wkimage wird automatisch hinzugefügt) |
alt | string | '' | Alt-Text |
style | string | '' | Neu: Inline-CSS für Positionierung und Styling |
cache | string | '1w' | Cache-Dauer |
loading=„lazy“ und decoding=„async“ hinzu.
Rückgabe
Gibt einen vollständigen <img>-Tag mit base64 Data-URI zurück:
<img src="data:image/png;base64,iVBORw0KGgoAAAA..." width="300" height="120" alt="Logo" class="my-logo"/>
Bei Fehlern wird ein HTML-Kommentar zurückgegeben:
<!-- wkimage: file not found: wiki:missing.png -->
Beispiel: Flat Template Logo
Das Flat Template nutzt den Helper für Logo-Rendering:
// In lib/tpl/flat/lang_helper.php function tpl_renderLogo() { $wkimage = plugin_load('helper', 'wkimage'); if ($wkimage) { return $wkimage->renderImage('wiki', $logoPath, array( 'maxwidth' => $maxWidth, 'quality' => $quality, 'alt' => $siteTitle, 'class' => 'logo-img', )); } // Fallback ohne wkimage return '<img src="..." />'; }
<wk:audit stack=„doku“ title=„wkimage Plugin“>
<wk:include ref="code:qualitaet" critical="true">[x][x][x][x]</wk:include> <wk:include ref="stacks:dokuwiki-php">[x][x][x][x][x]</wk:include> <wk:include ref="sicherheit:kritis" critical="true">[x][x][x][-][-]</wk:include>
</wk:audit>
DISCUSSION
Paketangaben
Plugin: wkimage
Version: 1.2.0
Namespace: lib/plugins/wkimage/
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Lizenz: GPL 2