Resizing is the most common image operation outside of compression. Web pages need responsive sizes; profile photos need square crops; thumbnails need tight bounding boxes. This tool runs entirely in your browser via Canvas — drop files, set dimensions, download. Multi-file workflows produce a zip.
How resizing works
The image is decoded with createImageBitmap() into a bitmap, drawn onto a canvas at target dimensions with imageSmoothingEnabled: true and imageSmoothingQuality: 'high' (browser-implementation Lanczos / similar), then re-encoded with canvas.toBlob in the source format at quality 92.
The resampling filter matters more than people realise. Chromium’s high-quality mode uses a Lanczos filter, which preserves edges better than the default bilinear. Firefox and Safari use similar high-quality filters when explicitly requested. Without imageSmoothingQuality: 'high', you’d get the default bilinear filter — fine for small downscales, fuzzy for big ones.
Three resize modes
Pixels mode sets explicit width × height. Good for fixed-size outputs (200×200 avatar, 1200×600 banner). Aspect-lock derives the second dimension from the first, preserving source ratio.
Percentage mode scales both dimensions by the same factor (50% = half-size, 200% = double-size). Aspect always preserved.
Fit-within mode scales to fit inside a max-width × max-height box, preserving aspect ratio. Never enlarges — if the source is already smaller than the box, it stays unchanged. The most useful mode for “make sure no dimension exceeds X” workflows.
Example: thumbnail batch
A folder of 20 product photos, each 4032×3024 from a phone camera (~3 MB each, 60 MB total). Drop them all, fit-within mode, max 800×800. Result: 20 thumbnails averaging 80 KB each in a 1.6 MB zip — 30× total reduction.
Example: avatar from a portrait
A 1200×1600 portrait, want a 200×200 square avatar. Pixels mode, 200×200, aspect lock OFF (since you’re explicitly squashing). Get a 200×200 image with the subject’s proportions stretched. To preserve aspect, you’d need to crop first — see the image cropper for that.
Example: making a banner half-size
A 2400×800 banner, want 1200×400 for mobile. Percentage mode, 50%. Done.
When to combine with other tools
- Need a different format too? Resize first, then run through the format converter.
- Want to compress as well? Resize first, then through the compressor — combined output is much smaller.
- Need square crops with subject preservation? Use the cropper before the resizer.
Common mistakes
Pixels mode on mixed-size batches. Stretches portraits and squashes landscapes. Use fit-within for mixed-aspect input.
Trying to upscale dramatically. Bilinear / Lanczos resampling can’t invent detail. A 200×200 input upscaled to 1000×1000 looks blurry no matter the filter. For real upscaling, use an AI upscaler (super-resolution).
Forgetting aspect lock for pixels mode. Without it, changing width doesn’t change height — and vice versa — so you end up with stretched images. Lock is on by default.
Resizing PNG screenshots to JPEG dimensions. The output stays PNG (since source was PNG). If you wanted JPEG, change format separately.
What this tool does not do
It doesn’t change format. Output stays in the source’s format. Use the image format converter to switch.
It doesn’t crop. To select a region of the source, use the image cropper first, then resize the crop.
It doesn’t rotate. EXIF orientation flags are respected by createImageBitmap automatically; manual rotation isn’t supported here.
It doesn’t batch-tag with custom names. Output filenames follow <original>-WxH.<ext>. For custom naming patterns, scripting is your friend.
It doesn’t upload anywhere. Resize and zip both run client-side.