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.
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.
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.
Das Paket konzentriert sich auf die Verarbeitungsschritte, die vor dem eigentlichen Upload relevant sind, und bleibt dabei unabhängig von Frameworks und Backend-Infrastruktur.
Ein Browser-File wird an den Optimizer übergeben und als Browser-File zurückgegeben, das direkt von einer bestehenden Upload-Pipeline verwendet werden kann.
Bilder werden direkt im Browser dekodiert, skaliert und enkodiert. Das Paket selbst lädt keine Dateien zu einem externen Dienst hoch.
Rechenintensive Bildverarbeitung läuft außerhalb des Hauptthreads, damit die Benutzeroberfläche während der Optimierung reaktionsfähig bleibt.
JPEG-, PNG- und WebP-Verarbeitung basiert auf browserkompatiblen WebAssembly-Codecs, die in den Worker-Build eingebunden sind.
Bilder und Nicht-Bilddateien können gemeinsam verarbeitet werden, während die ursprüngliche Reihenfolge der Dateiauswahl erhalten bleibt.
Für JPEG- und WebP-Ausgaben kann nach einer geeigneten Qualitätsstufe gesucht werden, wenn eine ungefähre Zieldateigröße erreicht werden soll.
Die Batch-Verarbeitung begrenzt die Anzahl aktiver Bild-Worker, um unnötige CPU- und Speicherbelastung zu vermeiden.
AbortSignal-Unterstützung und Lifecycle-Callbacks ermöglichen das Abbrechen laufender Verarbeitung und die Darstellung sinnvoller Statusinformationen in der UI.
Jede Verarbeitung liefert Metadaten zu Original und Ausgabe, Einsparungen, Kompressionsinformationen und Laufzeiten zurück.
Der interaktive Playground zeigt echte browserseitige Verarbeitung mit konfigurierbaren Output-Modi, Qualität, Resize-Limits, Zielgröße und Batch-Concurrency.
Images are optimized locally. Other file types can remain unchanged in the same batch.
JPEG · PNG · WebP · native HEIC / HEIF where supportedDer Optimizer folgt einem klaren Verarbeitungsablauf, während die eigentliche Upload-Implementierung vollständig unter Kontrolle der Anwendung bleibt.
Die Eingabe wird als unterstütztes Bild, nicht unterstütztes Bild oder Passthrough-Datei klassifiziert. Dabei werden MIME-Informationen und, soweit sinnvoll, Dateisignaturen verwendet.
Unterstützte Bilder werden innerhalb des Workers mit dem passenden Codec oder nativen Browser-Funktionen dekodiert.
Optionale maximale Breiten- und Höhenwerte werden unter Beibehaltung des Seitenverhältnisses angewendet, ohne Bilder unnötig hochzuskalieren.
Das Bild wird entsprechend dem konfigurierten Output-Modus, Format, der Qualität und einer optionalen Zielgrößen-Strategie enkodiert.
Der Optimizer entscheidet, ob die erzeugte Ausgabe das Original ersetzen soll, und gibt das finale File zusammen mit detaillierten Metadaten zurück.
jamit-image-optimizer wird als ESM-Paket mit TypeScript-Deklarationen ausgeliefert und kann mit dem bereits im Projekt verwendeten Paketmanager installiert werden.
pnpm add jamit-image-optimizernpm install jamit-image-optimizerDas 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.
optimizeImage() eignet sich für einzelne unterstützte Bilder, die vor dem Upload skaliert, komprimiert oder konvertiert werden sollen.
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);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.
const result = await optimizeImage(file, {
mode: 'auto',
});
const formData = new FormData();
formData.append('file', result.file);
await fetch('/upload', {
method: 'POST',
body: formData,
});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.
Unterstützte Bilder werden mit kontrollierter Parallelverarbeitung verarbeitet, während die Reihenfolge der Ausgabedateien der ursprünglichen Auswahl entspricht.
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);PDFs, Videos, Textdateien und andere Nicht-Bilddateien können unverändert im selben Batch bleiben, während unterstützte Bilder optimiert werden.
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,
});
}Drei Output-Modi decken das Beibehalten des Originalformats, eine explizite Konvertierung und automatische Optimierung ab, ohne Anwendungen auf eine einzige Strategie festzulegen.
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.
const result = await optimizeImage(file, {
mode: 'original',
quality: 0.8,
});JPEG, PNG oder WebP können gezielt ausgewählt werden, wenn die Anwendung ein bestimmtes Ausgabeformat benötigt.
const result = await optimizeImage(file, {
mode: 'format',
format: 'webp',
quality: 0.85,
});Im Auto-Modus wird WebP als Optimierungskandidat geprüft und nur verwendet, wenn die erzeugte Ausgabe tatsächlich einen Vorteil bietet.
const result = await optimizeImage(file, {
mode: 'auto',
quality: 0.85,
});Resize-Limits und qualitätsbasierte Kompression können kombiniert werden, um große Kamerabilder zu reduzieren, bevor sie Netzwerkbandbreite verbrauchen.
Es kann eine maximale Breite, maximale Höhe oder beides definiert werden. Das Bild wird innerhalb dieser Grenzen verkleinert, ohne absichtliches Upscaling.
const result = await optimizeImage(file, {
resize: {
maxWidth: 1920,
maxHeight: 1920,
},
});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.
const result = await optimizeImage(file, {
quality: 0.9,
targetSize: 500 * 1024,
minQuality: 0.5,
});
console.log(result.compression.targetReached);Status-Callbacks und AbortSignal-Unterstützung machen den Optimizer für interaktive Upload-Oberflächen geeignet und nicht nur für Hintergrundprozesse.
Lifecycle-Updates wie Dekodieren, Skalieren, Enkodieren und Finalisieren können genutzt werden, um sinnvolle Verarbeitungszustände in der Oberfläche anzuzeigen.
await optimizeImage(file, {
onStatus(status) {
console.log(status.stage);
},
});Mit einem AbortSignal kann eine aktive Verarbeitung gestoppt werden. Laufende Worker werden beendet, anstatt unnötig im Hintergrund weiterzuarbeiten.
const controller = new AbortController();
const promise = processFiles(files, {
concurrency: 2,
signal: controller.signal,
});
controller.abort();
await promise;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.
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.
const result = await optimizeImage(file, {
limits: {
maxInputBytes: 20 * 1024 * 1024,
maxPixels: 12_000_000,
maxDimension: 8192,
},
});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.
import {
isImageOptimizerError,
optimizeImage,
} from 'jamit-image-optimizer';
try {
await optimizeImage(file);
} catch (error) {
if (isImageOptimizerError(error)) {
console.error(error.code);
console.error(error.message);
}
}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.
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.
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.
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.
Implementierung, Browser-Tests, Worker-Pipeline und öffentliche API können direkt im Repository eingesehen werden. Dort können auch Issues gemeldet werden.