Image Resizer / Cropper
Resize, crop, rotate and flip any image to exact pixels or social presets — processed on this device, never uploaded.
Drop an image here — it is read on this device, never uploaded.
No drag and drop needed — the button opens this device's file picker.
PNG, JPEG, WebP, GIF, AVIF or SVG · up to 20 MB
You can also paste an image from the clipboard anywhere on this page — screenshots work.
On phones clipboard paste is limited — the picker button does the same job.
Load an image to see the output size.
Load an image and press Resize image — the resized output appears here.
Press ? for shortcuts
Do it offline:$ sips -Z 800 photo.jpg --out photo-800.jpg
How to use it
- Drop an image on the stage, pick one with the button, or paste a copied screenshot straight from the clipboard — PNG, JPEG, WebP, GIF, AVIF and SVG all decode here.
- Choose a mode: Exact size stretches to the width and height you type, Fit within scales to sit inside the box, Fill covers the box and center-crops the overflow, Percent scales both sides at once.
- Or skip the arithmetic: pick a preset — every row carries its platform's documented dimensions — and the width and height fields fill themselves.
- Turn on Crop to trim first: drag the rectangle or its corner handles, type coordinates into the crop fields, or nudge with the arrow keys — 1 px per press, 10 with Shift.
- Check the live output line, press Resize image (or ⌘/Ctrl + Enter), then Download image — the filename carries the real output size.
Load a photo or graphic, then resize, crop, rotate or flip it to exact pixels, a percentage, or one of twelve cited social-media presets, and export PNG, JPEG or WebP. Every pixel is processed by this browser on this device — keep the DevTools Network panel open while you edit and the request log stays empty from drop to download. Sources up to 20 MB and 10,000 px per side are accepted.
How it works
The whole tool is a plan-then-draw pipeline. Your settings never touch pixels directly: they compile into an ordered list of canvas steps — crop, then rotate, then flip, then one or more scaling draws — with every dimension resolved by integer math up front (fractions go through Math.round, never truncation, so 50 percent of 1,599 px is 800, not 799). The page shows you the resolved output size before anything renders, and the same plan replays identically in a background worker or on the main thread.
Phone cameras usually store rotation as metadata instead of rotating pixels, so a naive canvas draw shows portraits lying sideways. Decoding here requests imageOrientation: "from-image", which makes the browser apply the stored orientation before the first draw — the dimensions you see are the upright ones, and every crop coordinate refers to the image as you actually view it.
Shrinking far in a single draw looks bad for a measurable reason: bilinear resampling reads a small neighborhood around each output pixel, so past a 2× reduction whole source pixels fall between the samples and fine detail aliases into noise. When a plan shrinks to half or less on both axes, the scale step decomposes into iterative halvings — 4,032 px falls to 2,016, then 1,008, then the exact target — so every pass stays inside the filter's window; an exact-size stretch that squeezes only one axis draws in a single pass instead. The output line counts these passes for you.
A canvas export is a brand-new file encoded from raw pixels, and that cuts both ways. Nothing of the original container survives — EXIF orientation, GPS position, camera model, color-profile tags — because the encoder never sees the original bytes, only the drawn bitmap. If the location stamp in a photo worried you, the export is clean of it; if you needed the capture data, read it out of the original before resizing. The warning under the plan states this on every run rather than only when it surprises you.
Examples
1600×1200 photo → exact 800×600scale 800×600
= 800×600 pxExactly half on both axes is one clean draw — a 2× reduction sits on the resampling filter's boundary, so no halving chain is needed. With the aspect lock on you can type just one field and the other derives.
4032×3024 camera photo → fit the OG presetscale 2016×1512
scale 1008×756
scale 840×630
= 840×630 pxFit within a 1200×630 link-preview box keeps the 4:3 aspect: the height is the binding side, so the result is 840×630, not 1200×630. The 4.8× reduction decomposes into two halvings plus the exact final draw.
3000×2000 → rotate 90° and scale to 50%rotate 90°
scale 1000×1500
= 1000×1500 pxRotation happens before the target resolves: a quarter turn swaps the frame to 2000×3000, and 50 percent of that is 1000×1500. The percentage always applies to what you will actually export.
1920×1080 frame → crop, then fill a 400×400 avatarcrop 600×600 at (550, 100)
scale 400×400
= 400×400 pxThe edge case: a user crop of 900×600 at (400, 100) combined with Fill. Covering a square from a 3:2 region must trim the sides, and the plan folds that centered trim INTO the crop step — one 600×600 read at (550, 100), one draw, no wasted intermediate canvas.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Upscaling cannot add detail
Ask for more pixels than the source has and the plan still runs — but the warning opens with exactly that sentence, because the new pixels are interpolated from existing ones. A 100×100 logo blown to 400×400 is soft everywhere; when you need real detail, go back to the original artwork or a vector.
JPEG flattens transparency onto white
The JPEG format has no alpha channel, so transparent regions must land on something. Here that something is a white underlay, drawn before the image on the final pass, and the plan says so whenever JPEG is selected. Keep PNG or WebP when the transparency matters.
WebP export depends on the browser's encoder
Canvas encoding is feature-detected per host: this page asks the canvas for a WebP and checks what actually comes back. Where the encoder is missing the option is disabled with a note — never a silent PNG renamed to .webp.
Why the 80-megapixel cap exists
A decoded bitmap costs four bytes per pixel, so an 80 MP image is roughly a 320 MB buffer before any intermediate canvases — past what a browser tab holds reliably. Sides are capped at 10,000 px for the same reason. Both refusals print the number they measured.
The A4 preset is print arithmetic, not magic
ISO 216 sets A4 at 210×297 mm; at 300 dots per inch that is 2480×3508 px, rounded from 2480.3 and 3507.9. Screens ignore DPI entirely — the figure only tells a printer how densely to lay the pixels down, so this preset is about having enough of them.
SVG sources rasterize at the first draw
A vector has no pixels until a draw call makes some, so the plan treats an SVG like any raster: the first canvas draw rasterizes it, and any halving passes after that resample the drawn bitmap. What differs is where it runs — image elements do not load inside background workers, so vector jobs stay on the main thread. The export is a raster in whichever format you chose.
Common errors
The crop rectangle leaves the image: 600×600 at (600, 300) does not fit inside 1000×800 px.- Crop coordinates are source-space pixels, so x plus width must stay inside the real image — here 600 + 600 needs 1,200 px of a 1,000 px frame. On the page every edit clamps to the frame — drags, nudges and typed coordinates alike — so this refusal is the engine's own backstop: each plan re-checks the rectangle against the image's true upright dimensions before anything draws.
The output must be between 1 and 10,000 px per side — this plan resolves to 12,000×630 px.- The cap applies to the RESOLVED output, which is why the message names both figures. A percentage can trip it too: 300 percent of a 4,000 px side is 12,000. Halve the target or scale in two sessions if you genuinely need something that large.
This file is larger than the 20 MB limit for this tool. For big photos use the CLI: sips -Z 800 photo.jpg --out photo-800.jpg- The byte gate runs before any decode starts — files that heavy are nearly always photographs carrying more pixels than any web target uses. The printed macOS line resizes locally with the same aspect-preserving behavior; on Linux, ImageMagick's convert -resize does the equivalent.
FAQ
Is my photo uploaded while it resizes?
No. Decoding, cropping, scaling and encoding all execute in your browser — the worker that does the drawing runs on your machine. You can verify rather than trust: keep the DevTools Network panel open through a full resize and download, and watch it record no requests.
Does resizing reduce image quality?
Downscaling discards pixels by definition, but it is done here the careful way: reductions past 2× on both axes step through iterative halvings so edges survive instead of aliasing, and the final draw lands on your exact dimensions. Quality loss you can control is the JPEG/WebP quality slider — PNG is lossless.
Is EXIF metadata kept in the exported image?
No — a canvas export encodes fresh pixels, so camera model, GPS position and the rest are not copied over. That is a privacy upside as often as a loss, and the tool states it on every plan. To read those fields first, run the original through the EXIF viewer listed under related tools.
What are the maximum file and image sizes?
Three gates, all printed when they refuse: 20 MB of file bytes, 10,000 px on either side, and 80 megapixels in total. Outputs are capped at 10,000 px per side as well, and the percent mode accepts 1 to 400.
Which export format should I pick?
PNG for graphics, screenshots and anything with transparency or hard edges — it is lossless. JPEG for photographs headed somewhere size-sensitive; it flattens transparency onto white. WebP compresses photos smaller than JPEG at similar quality, when this browser can encode it — the option disables itself where it cannot.
Can I crop and resize in one pass?
Yes — that is the normal flow. The crop runs first in source coordinates, then rotation, flips and scaling apply to the cropped region. Combined with Fill mode, the cover trim even merges into the same crop step, so the pipeline stays one read and one scaled draw.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Resize with the current options — the plan line shows what you will get first.
- ⌘/Ctrl + S
- Download the resized image. On this page the shortcut saves your output, not the page itself.
- Arrow keys
- Move the crop rectangle 1 px while it or a corner handle has focus; on a handle they resize instead.
- Shift + Arrow keys
- The same crop moves and resizes at 10 px per press.
- t
- Cycle the color theme (ignored while typing in a field).
- ? or ⌘/Ctrl + /
- Open the keyboard shortcut overlay.
- Esc
- Close the topmost dialog — the loaded image and options stay put.