|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Bulk Image Converter |
| 4 | +date: 2026-08-21 14:34:37 |
| 5 | +excerpt: How I built a browser-based bulk image converter that converts multiple images at once — no uploads, no server, fully client-side. |
| 6 | +categories: image react javascript canvas browser website |
| 7 | +--- |
| 8 | + |
| 9 | +How I built a [bulk image converter](https://remarkablemark.org/bulk-image-converter/) that converts multiple images in your browser. |
| 10 | + |
| 11 | +## Motivation |
| 12 | + |
| 13 | +Most bulk image converters online require uploading files to a server. That raises privacy concerns, especially for sensitive images. Bandwidth costs add up for large batches and free services often have ads or limit file counts. |
| 14 | + |
| 15 | +**Bulk Image Converter** sidesteps all of that by processing images entirely in the browser using the HTML Canvas API. |
| 16 | + |
| 17 | +## Features |
| 18 | + |
| 19 | +- **Drag-and-drop or click to upload** multiple images at once. |
| 20 | +- **Batch conversion** to WebP, JPEG, PNG, or AVIF. |
| 21 | +- **Quality control** with a slider for lossy formats (WebP, JPEG, AVIF). |
| 22 | +- **ZIP download** of all converted images in one click. |
| 23 | +- **Per-file status** tracking (pending, converting, done, error). |
| 24 | + |
| 25 | +## How It Works |
| 26 | + |
| 27 | +1. **Upload images** — drag-and-drop or click to browse. |
| 28 | +2. **Select a format** — select from WebP (default), JPEG, PNG, or AVIF. |
| 29 | +3. **Adjust quality** — a slider appears for lossy formats (PNG is always lossless). |
| 30 | +4. **Convert & download** — all images are converted in parallel and archived into a single ZIP file. |
| 31 | + |
| 32 | +## Technical Decisions |
| 33 | + |
| 34 | +### Canvas API |
| 35 | + |
| 36 | +Each image is loaded into an `HTMLImageElement`, drawn to a `HTMLCanvasElement`, and exported via `canvas.toBlob()` with the target MIME type and quality. |
| 37 | + |
| 38 | +### JSZip |
| 39 | + |
| 40 | +The converted blobs are bundled into a ZIP file using [JSZip](https://stuk.github.io/jszip/). The ZIP is generated in memory and downloaded via a temporary `<a>` element with `URL.createObjectURL()`. |
| 41 | + |
| 42 | +## Try It |
| 43 | + |
| 44 | +You can try the [Bulk Image Converter](https://remarkablemark.org/bulk-image-converter/) or check out the [source code](https://github.com/remarkablemark/bulk-image-converter). |
0 commit comments