Drop a stack of images and they are all compressed on your device, zipped, and handed back — nothing uploaded.
Drop a stack of images and they are all compressed on your device, zipped, and handed back — nothing uploaded.
Drop multiple images at once, pick one operation (DPI / resize / compress / convert / strip), and download all results as a ZIP. GhostImage processes files sequentially through a single Web Worker and reports per-file success or failure. Aggregate decoded-pixel budget capped at 200 MB to prevent mobile-tab out-of-memory crashes.
Drop your images
Drag multiple files onto the dropzone. GhostImage shows the file list with per-file size and dimensions.
Pick the operation
Choose one of DPI / Resize / Compress / Convert / Strip Metadata. Op-specific settings appear inline.
Process and download
Click Process. Per-file progress shows as each completes. When all done, a Download button produces a ZIP of all successful results — failures are listed by name with their reason.
Why sequential and not parallel?
v1 uses a single Web Worker singleton — postMessage queues serialize ops anyway. True parallelism would require multiple worker instances and is on the v1.1 list. The single-worker tradeoff is simpler lifecycle and lower mobile memory pressure.
Can I apply different settings per file?
Not in v1. All selected files get one settings bundle. If you need per-file ops, run them one at a time on the leaf pages.
What's the maximum batch size?
The aggregate decoded-pixel budget caps at ~200 MB (roughly 50 megapixels × 4 bytes). Drops exceeding the budget are refused before processing starts. Streaming-to-disk batches via the WICG File System Access API are on the v1.1 list.
What if one file fails?
The batch keeps going. Failed files appear in the result list with a short reason code; successful files end up in the ZIP. R6 is structurally enforced — per-file errors are wrapped in a discriminated result so they never abort the loop.
Every GhostImage tool runs entirely in your browser. Your file is never uploaded — there's no upload endpoint to send it to.