PB Image Compressor: Technische Deep Dive

AI & Innovatie · Door Peter · 3 min leestijd
PB Image Compressor: Technische Deep Dive

Ontdek hoe we een krachtige, volledig geautomatiseerde beeldcompressie-tool hebben gebouwd die gemiddeld 93-95% bestandsgrootte reduceert met behoud van visuele kwaliteit.

PB Image Compressor — hoe het werkt

De PB Image Compressor is een tool die we hebben gebouwd om grote beelden snel en gecontroleerd web-klaar te maken. Geen magie, geen shortcuts — gewoon een solide technische setup die doet wat ’ie moet doen. Hieronder leggen we uit hoe hij in elkaar zit en waarom we deze keuzes hebben gemaakt.

De technologie

Sharp.js — het hart van de compressor

Voor beeldverwerking gebruiken we Sharp, een snelle Node.js library gebaseerd op libvips. In de praktijk is dit meerdere keren sneller dan ImageMagick of GraphicsMagick, en vooral veel efficiënter met geheugen.

Sharp ondersteunt onder andere JPEG, PNG, WebP, AVIF en TIFF, en biedt alles wat je nodig hebt: resizen, croppen, roteren, verscherpen, blurren.

Waarom Sharp:

  • Snel — C++ core met Node.js bindings
    Geheugenefficiënt — werkt met streams, geen zware buffers
    Volledig — één API voor alle bewerkingen

mozJPEG — betere JPEG’s, kleiner bestand

Voor JPEG-output gebruiken we mozJPEG, de encoder van Mozilla. Die levert gemiddeld 10–15% kleinere bestanden op bij dezelfde visuele kwaliteit.

Onze standaardinstellingen:

{
quality: 85,
mozjpeg: true,
chromaSubsampling: '4:4:4',
trellisQuantisation: true,
overshootDeringing: true
}

Kort gezegd: maximale kleurinformatie, minimale artifacts, zonder zichtbaar kwaliteitsverlies.

Backend architectuur

Express API

De compressie draait via één POST-endpoint:

/api/image-compressor/compress

De flow is simpel en bewust lineair:

  1. Multer ontvangt de upload (multipart/form-data)
    Validatie checkt type en grootte (max. 15 MB)
    Sharp verwerkt het beeld volledig in geheugen
    Response stuurt de gecomprimeerde data terug

Alles in-memory

Belangrijk ontwerpbesluit: we schrijven nooit bestanden weg naar disk.

const inputBuffer = req.file.buffer;
const outputBuffer = await sharp(inputBuffer)
.jpeg({ quality: 85, mozjpeg: true })
.toBuffer();

Voordelen:

  • Privacy — niets blijft achter op de server
    Snelheid — geen disk I/O
    Schaalbaar — geen cleanup, geen tijdelijke opslag

Frontend

React + TypeScript

De frontend is gebouwd met React 18 en TypeScript. Geen over-engineering, wel type-veilig en voorspelbaar.

Drag & drop

Native HTML5 drag & drop, rechtstreeks gekoppeld aan de workflow:

const handleDrop = (e: React.DragEvent) => {
e.preventDefault();
const file = e.dataTransfer.files[0];
if (validateFile(file)) {
compressAndDownload(file);
}
};

Upload = start. Geen extra knoppen, geen stappen ertussen.

Volledig automatische flow

  • Upload start automatisch de compressie
    Na validatie loopt alles door
    Download begint vanzelf
    Visuele feedback laat zien wanneer het klaar is

Zo min mogelijk nadenken, zo veel mogelijk doorwerken.

Live systeemlogs

Tijdens het proces tonen we real-time logs, zodat zichtbaar is wat er gebeurt:

const addLog = (message: string) => {
setDisplayedLogs(prev => [...prev, > ${message}]);
};

Transparant en handig bij testen of debuggen.

Data fetching met TanStack Query

Configuratie en server state lopen via TanStack Query:

useQuery({
queryKey: ["/api/image-compressor/config"],
staleTime: 1000 * 60 * 5
});

Slim gecached, weinig requests, stabiel gedrag.

CMS & configuratie

Database (Drizzle + PostgreSQL)

Instellingen worden opgeslagen in PostgreSQL via Drizzle ORM:

export const imageCompressorConfig = pgTable(
"image_compressor_config",
{
id: varchar("id").primaryKey(),
title: varchar("title", { length: 255 }),
description: text("description"),
maxFileSizeMb: integer("max_file_size_mb").default(15)
}
);

CMS-pagina

Via /cms/image-compressor kunnen labels, teksten en limieten aangepast worden. Opslaan = direct live. Geen deploy nodig.

Theming

Dark / light mode

De tool volgt het globale PB-thema en ondersteunt dark en light mode:

function getColors(isLight: boolean) {
return {
bg: isLight ? '#fdfcfb' : '#050505',
surface: isLight ? '#f4f2ef' : 'rgba(23,23,23,0.3)',
text: isLight ? '#1a1a1a' : '#e5e5e5'
};
}

Consistent, rustig, geen losse stijlen.

Performance

In productie zien we stabiel:

  • 93–95% kleinere bestanden
    < 2 seconden verwerking tot ±10 MB
    Geen zichtbaar kwaliteitsverlies

Precies wat we wilden.

Tot slot

De PB Image Compressor is geen gimmick, maar een degelijke tool gebouwd op bewezen technologie. Sharp en mozJPEG doen het zware werk, React en TypeScript houden de frontend strak, en het in-memory ontwerp zorgt voor snelheid en privacy.

Wil je ’m proberen:
/image-compressor

Zonder uitleg nodig. Upload → klaar.
X Peet

Peter
Peter
Creative Directors
Oprichters van Studio PB.NL met 20 jaar ervaring in fashion, e-commerce en AI-gedreven innovatie. Samen bouwen we aan de toekomst van creatieve technologie.