When you'd use this
When you need an exact pixel width and height — Instagram upload sizes (1:1, 4:5, Story 9:16), X / Twitter posts (16:9), Open Graph cards (1200×630), or a 3×4 ID photo. Where image-compress aims at file size, this aims at dimensions.
Contain · cover · stretch
Three modes, distinguished by how they handle aspect ratio.
- Contain — keeps the source ratio, scaled to fit within the target. A tall photo resized to 1080×1080 ends up around 810×1080 — one side shorter than the target.
- Cover — keeps the ratio, fills the target, and crops the center to match exact dimensions. Best for portraits and centered subjects.
- Stretch — ignores the ratio. The result has the exact target pixels but distorts when the ratios differ.
Presets
Seven common sizes are pre-loaded — Instagram 1:1, 4:5, 9:16, X / Twitter 16:9, OG 1.91:1, ID photo 3×4 (295×413), and a 256-pixel avatar. The "Custom" entry takes any width and height. Lock the ratio and changing one dimension updates the other to match the original aspect.
Local processing
Resampling runs through @jsquash/resize Lanczos3 (WASM), cropping through OffscreenCanvas. Decode, resample, crop, and encode all execute in the browser — neither the source nor the result is sent to a server. Up to 50 files can sit in the queue, and two Web Workers run in parallel so large images don't freeze the UI.
When this isn't the right tool
- Print-resolution work — print shops usually want the untouched original or specific DPI specs. Screen-pixel resize is a different job.
- HEIC (iPhone photos) — the browser can't decode them. Export to JPG first.
- Animated GIFs — only the first frame survives; motion is dropped.
- Face-centered crops — cover mode always crops the geometric center. If the face sits high in the frame, it can be clipped after the crop.
Originals stay on the page
Resampling runs through @jsquash/resize (Lanczos3) WASM, cropping through OffscreenCanvas. Both execute in the browser — neither original nor resized output is sent to a server. EXIF metadata is dropped during decode.