Bildoptimierung im Browser

jamit-image-optimizer

Eine framework-unabhängige und vollständig typisierte Bibliothek zur Bildoptimierung für Browser-Uploads. Bilder werden lokal skaliert, komprimiert und konvertiert, bevor sie die eigentliche Upload-Pipeline erreichen.

Basierend auf Browser-File-Objekten, Web Workers und WebAssembly, mit Unterstützung für Mixed-File-Batches, kontrollierte Parallelverarbeitung, Zielgrößen-Optimierung und detaillierte Verarbeitungsmetadaten.

Warum das Paket existiert

Bilder optimieren, bevor der Upload beginnt

Große Bilder erhöhen Upload-Zeiten, Bandbreitenverbrauch und Speicherbedarf. jamit-image-optimizer ergänzt eine bestehende Upload-Lösung um eine dedizierte Bildverarbeitung, ohne selbst die Kontrolle über den Upload zu übernehmen.

Das Paket akzeptiert normale Browser-File-Objekte und gibt ebenfalls normale File-Objekte zurück. Dadurch bleibt es mit FormData, Signed URLs, Multipart-Uploads und eigenen Backend-APIs kompatibel.

Kernfunktionen

Eine vollständige Optimierungspipeline im Browser

Das Paket konzentriert sich auf die Verarbeitungsschritte, die vor dem eigentlichen Upload relevant sind, und bleibt dabei unabhängig von Frameworks und Backend-Infrastruktur.

File-to-File-Verarbeitung

Ein Browser-File wird an den Optimizer übergeben und als Browser-File zurückgegeben, das direkt von einer bestehenden Upload-Pipeline verwendet werden kann.

Lokale Verarbeitung

Bilder werden direkt im Browser dekodiert, skaliert und enkodiert. Das Paket selbst lädt keine Dateien zu einem externen Dienst hoch.

Web Workers

Rechenintensive Bildverarbeitung läuft außerhalb des Hauptthreads, damit die Benutzeroberfläche während der Optimierung reaktionsfähig bleibt.

WebAssembly-Codecs

JPEG-, PNG- und WebP-Verarbeitung basiert auf browserkompatiblen WebAssembly-Codecs, die in den Worker-Build eingebunden sind.

Mixed-File-Batches

Bilder und Nicht-Bilddateien können gemeinsam verarbeitet werden, während die ursprüngliche Reihenfolge der Dateiauswahl erhalten bleibt.

Zielgrößen-Optimierung

Für JPEG- und WebP-Ausgaben kann nach einer geeigneten Qualitätsstufe gesucht werden, wenn eine ungefähre Zieldateigröße erreicht werden soll.

Kontrollierte Parallelverarbeitung

Die Batch-Verarbeitung begrenzt die Anzahl aktiver Bild-Worker, um unnötige CPU- und Speicherbelastung zu vermeiden.

Abbruch und Status-Events

AbortSignal-Unterstützung und Lifecycle-Callbacks ermöglichen das Abbrechen laufender Verarbeitung und die Darstellung sinnvoller Statusinformationen in der UI.

Detaillierte Ergebnisse

Jede Verarbeitung liefert Metadaten zu Original und Ausgabe, Einsparungen, Kompressionsinformationen und Laufzeiten zurück.

Interaktive Demo

Den Optimizer direkt im Browser ausprobieren

Der interaktive Playground zeigt echte browserseitige Verarbeitung mit konfigurierbaren Output-Modi, Qualität, Resize-Limits, Zielgröße und Batch-Concurrency.

Ready
1

Select files

Drop files here

Images are optimized locally. Other file types can remain unchanged in the same batch.

JPEG · PNG · WebP · native HEIC / HEIF where supported
2

Optimization settings

Verarbeitungspipeline

Von der ausgewählten Datei bis zum upload-fertigen Ergebnis

Der Optimizer folgt einem klaren Verarbeitungsablauf, während die eigentliche Upload-Implementierung vollständig unter Kontrolle der Anwendung bleibt.

Klassifizieren

Die Eingabe wird als unterstütztes Bild, nicht unterstütztes Bild oder Passthrough-Datei klassifiziert. Dabei werden MIME-Informationen und, soweit sinnvoll, Dateisignaturen verwendet.

Dekodieren

Unterstützte Bilder werden innerhalb des Workers mit dem passenden Codec oder nativen Browser-Funktionen dekodiert.

Skalieren

Optionale maximale Breiten- und Höhenwerte werden unter Beibehaltung des Seitenverhältnisses angewendet, ohne Bilder unnötig hochzuskalieren.

Enkodieren

Das Bild wird entsprechend dem konfigurierten Output-Modus, Format, der Qualität und einer optionalen Zielgrößen-Strategie enkodiert.

Finalisieren

Der Optimizer entscheidet, ob die erzeugte Ausgabe das Original ersetzen soll, und gibt das finale File zusammen mit detaillierten Metadaten zurück.

Installation

Ein Paket zum Frontend hinzufügen

jamit-image-optimizer wird als ESM-Paket mit TypeScript-Deklarationen ausgeliefert und kann mit dem bereits im Projekt verwendeten Paketmanager installiert werden.

pnpm

Shell
pnpm add jamit-image-optimizer

npm

Shell
npm install jamit-image-optimizer

Das veröffentlichte Paket benötigt keine zusätzlichen Runtime-Abhängigkeiten in der konsumierenden Anwendung. Die vom Worker verwendeten Codecs sind bereits in den Paket-Build eingebunden.

Single-Image-API

Mit optimizeImage() starten

optimizeImage() eignet sich für einzelne unterstützte Bilder, die vor dem Upload skaliert, komprimiert oder konvertiert werden sollen.

TypeScript
import { optimizeImage } from 'jamit-image-optimizer';

const result = await optimizeImage(file, {
  mode: 'auto',
  quality: 0.85,
  resize: {
    maxWidth: 1920,
    maxHeight: 1920,
  },
});

console.log(result.file);
console.log(result.savings.percent);
Upload-unabhängig

Die bestehende Upload-Implementierung behalten

Der Optimizer sendet selbst keine Dateien. Das zurückgegebene File kann mit FormData, fetch, Axios, Signed URLs, Multipart-Uploads oder einer eigenen Backend-Integration verwendet werden.

TypeScript
const result = await optimizeImage(file, {
  mode: 'auto',
});

const formData = new FormData();

formData.append('file', result.file);

await fetch('/upload', {
  method: 'POST',
  body: formData,
});
Batch-Verarbeitung

Reale Upload-Auswahlen verarbeiten

processFiles() ist für Upload-Oberflächen gedacht, bei denen mehrere Dateien ausgewählt werden und der Batch sowohl Bilder als auch andere Dateitypen enthalten kann.

processFiles()

Mehrere Dateien optimieren

Unterstützte Bilder werden mit kontrollierter Parallelverarbeitung verarbeitet, während die Reihenfolge der Ausgabedateien der ursprünglichen Auswahl entspricht.

TypeScript
import { processFiles } from 'jamit-image-optimizer';

const result = await processFiles(files, {
  mode: 'auto',
  quality: 0.85,
  resize: {
    maxWidth: 1920,
    maxHeight: 1920,
  },
  concurrency: 2,
});

await uploadFiles(result.files);
Mixed files

Bilder und Passthrough-Dateien gemeinsam

PDFs, Videos, Textdateien und andere Nicht-Bilddateien können unverändert im selben Batch bleiben, während unterstützte Bilder optimiert werden.

TypeScript
const result = await processFiles([
  photo,
  contractPdf,
  screenshot,
  video,
]);

for (const item of result.items) {
  console.log({
    name: item.originalFile.name,
    kind: item.kind,
    outcome: item.outcome,
  });
}
Output-Strategie

Festlegen, wie das finale Bildformat bestimmt wird

Drei Output-Modi decken das Beibehalten des Originalformats, eine explizite Konvertierung und automatische Optimierung ab, ohne Anwendungen auf eine einzige Strategie festzulegen.

original

Originalformat beibehalten

Der Optimizer behält das Ausgangsformat bei, sofern dafür ein Encoder verfügbar ist, und führt Resize oder Kompression ohne absichtliche Formatkonvertierung durch.

TypeScript
const result = await optimizeImage(file, {
  mode: 'original',
  quality: 0.8,
});
format

Explizites Format anfordern

JPEG, PNG oder WebP können gezielt ausgewählt werden, wenn die Anwendung ein bestimmtes Ausgabeformat benötigt.

TypeScript
const result = await optimizeImage(file, {
  mode: 'format',
  format: 'webp',
  quality: 0.85,
});
auto

Vorteilhafte Ausgabe automatisch wählen

Im Auto-Modus wird WebP als Optimierungskandidat geprüft und nur verwendet, wenn die erzeugte Ausgabe tatsächlich einen Vorteil bietet.

TypeScript
const result = await optimizeImage(file, {
  mode: 'auto',
  quality: 0.85,
});
Resize und Kompression

Bilddimensionen und Dateigröße kontrollieren

Resize-Limits und qualitätsbasierte Kompression können kombiniert werden, um große Kamerabilder zu reduzieren, bevor sie Netzwerkbandbreite verbrauchen.

Skalieren ohne das Seitenverhältnis zu verändern

Es kann eine maximale Breite, maximale Höhe oder beides definiert werden. Das Bild wird innerhalb dieser Grenzen verkleinert, ohne absichtliches Upscaling.

TypeScript
const result = await optimizeImage(file, {
  resize: {
    maxWidth: 1920,
    maxHeight: 1920,
  },
});

Auf eine Zielgröße optimieren

Bei qualitätsbasierten Ausgabeformaten kann der Optimizer über eine begrenzte Qualitätssuche versuchen, eine gewünschte Dateigröße zu erreichen und dabei eine definierte Mindestqualität einzuhalten.

TypeScript
const result = await optimizeImage(file, {
  quality: 0.9,
  targetSize: 500 * 1024,
  minQuality: 0.5,
});

console.log(result.compression.targetReached);
Lifecycle-Steuerung

Die Verarbeitung mit der Benutzeroberfläche verbinden

Status-Callbacks und AbortSignal-Unterstützung machen den Optimizer für interaktive Upload-Oberflächen geeignet und nicht nur für Hintergrundprozesse.

Verarbeitungsphasen beobachten

Lifecycle-Updates wie Dekodieren, Skalieren, Enkodieren und Finalisieren können genutzt werden, um sinnvolle Verarbeitungszustände in der Oberfläche anzuzeigen.

TypeScript
await optimizeImage(file, {
  onStatus(status) {
    console.log(status.stage);
  },
});

Laufende Verarbeitung abbrechen

Mit einem AbortSignal kann eine aktive Verarbeitung gestoppt werden. Laufende Worker werden beendet, anstatt unnötig im Hintergrund weiterzuarbeiten.

TypeScript
const controller = new AbortController();

const promise = processFiles(files, {
  concurrency: 2,
  signal: controller.signal,
});

controller.abort();

await promise;
HEIC / HEIF

Native Dekodierung nutzen, wenn der Browser sie bereitstellt

Die Unterstützung für HEIC- und HEIF-Eingaben basiert bewusst auf den nativen Dekodierungsfähigkeiten des Browsers und Betriebssystems. Das Paket bringt keinen eigenen HEVC-Decoder mit.

Wenn die Umgebung die Datei dekodieren kann, kann sie in ein enkodierbares Ausgabeformat wie WebP, JPEG oder PNG konvertiert werden. Ist keine native Dekodierung verfügbar, meldet das Paket den nicht unterstützten Codec-Pfad, anstatt eine Verarbeitung vorzutäuschen.

Ressourcenschutz

Deterministische Verarbeitungslimits definieren

Komprimierte Bilder können beim Dekodieren erheblich mehr Speicher benötigen. Konfigurierbare Grenzen für Eingabegröße, Pixelanzahl und Dimensionen helfen dabei, unerwartet teure browserseitige Verarbeitung zu vermeiden.

TypeScript
const result = await optimizeImage(file, {
  limits: {
    maxInputBytes: 20 * 1024 * 1024,
    maxPixels: 12_000_000,
    maxDimension: 8192,
  },
});
Typisierte Fehler

Fehler über stabile Error-Codes behandeln

ImageOptimizerError stellt typisierte Fehlercodes für Situationen wie ungültige Optionen, nicht verfügbare Codecs, nicht unterstützte Ausgabeformate, überschrittene Ressourcenlimits, Worker-Fehler und abgebrochene Vorgänge bereit.

TypeScript
import {
  isImageOptimizerError,
  optimizeImage,
} from 'jamit-image-optimizer';

try {
  await optimizeImage(file);
} catch (error) {
  if (isImageOptimizerError(error)) {
    console.error(error.code);
    console.error(error.message);
  }
}
Framework-unabhängig

Denselben Core in verschiedenen Frontend-Stacks verwenden

Die öffentliche API besteht aus reinem TypeScript und arbeitet mit Browser-File-Objekten. Vue-, Nuxt-, React-, Next.js-, Svelte- und Vanilla-TypeScript-Anwendungen können dasselbe Paket ohne framework-spezifischen Adapter verwenden.

  • Vanilla TypeScript
  • Vue
  • Nuxt
  • React
  • Next.js
  • Svelte
Lokal entwickelt

Der Optimizer lädt deine Bilder nicht hoch

Die Bildverarbeitung findet lokal im Browser statt, bis die umgebende Anwendung entscheidet, was mit dem zurückgegebenen File geschehen soll.

jamit-image-optimizer sendet keine Bilder, Dateinamen, Optimierungsmetadaten oder Verarbeitungstelemetrie an einen JamIT-Dienst. Die eigene Upload- oder Analytics-Infrastruktur der Anwendung bleibt davon getrennt.

Browser-Funktionen

Für moderne Browser-Umgebungen entwickelt

Die Verarbeitungs-API benötigt moderne Browser-Funktionen. Die Dekodierung von HEIC und HEIF hängt zusätzlich von der nativen Codec-Unterstützung des jeweiligen Browsers und Betriebssystems ab.

  • File API
  • Web Workers
  • WebAssembly
  • JPEG / PNG / WebP
  • Native HEIC / HEIF where available
Paketstatus

Veröffentlicht und bereit zur Integration

Die erste öffentliche Version enthält Einzelbild-Optimierung, Mixed-File-Batch-Verarbeitung, JPEG-, PNG- und WebP-Codecs, Resize- und Qualitätssteuerung, Zielgrößen-Optimierung, native HEIC/HEIF-Dekodierung sofern verfügbar, kontrollierte Parallelverarbeitung, Abort-Unterstützung und detaillierte Ergebnis-Metadaten.

Das Paket ist auf npm veröffentlicht. Quellcode, Tests und der Entwicklungs-Playground sind öffentlich auf GitHub verfügbar.

Veröffentlicht
Open Source

Den Quellcode auf GitHub ansehen

Implementierung, Browser-Tests, Worker-Pipeline und öffentliche API können direkt im Repository eingesehen werden. Dort können auch Issues gemeldet werden.

GitHub-Repository öffnen