Skip to content

Image Cropper

Drop an image or click to browse

Runs in your browser — nothing is uploaded.

Estimates for educational purposes — not financial, medical, or legal advice. See terms.

Cropping is the second-most-common image operation after resizing — useful for trimming unwanted edges, framing a subject, or producing a fixed-aspect output for an avatar / video thumbnail / social post. This tool runs entirely in your browser via Canvas, with drag handles and aspect-ratio presets.

How cropping works

The image renders in a flexible surface that scales to fit available width while preserving its source aspect ratio. The crop rectangle is overlaid on top — you drag inside to move it, drag the eight handles to resize. All math runs in source-pixel coordinates (the actual image dimensions), with display coordinates only used for input events.

When an aspect ratio is locked, every drag is followed by an aspect-correction step that adjusts width or height to match the target ratio while keeping the rectangle centred. The final output uses canvas.drawImage(source, sx, sy, sw, sh, 0, 0, dw, dh) where (sx, sy, sw, sh) is the source rectangle and (dw, dh) is the output canvas size — a 1:1 mapping with no resampling.

Aspect ratio presets

PresetRatioCommon use
FreeanyTrimming dead space, custom shapes
1:1squareProfile photos, Instagram square posts
4:3classicOld film cameras, monitors, basic cards
3:235mmDSLR / mirrorless camera native ratio
16:9widescreenVideo thumbnails, modern monitors, hero banners
9:16verticalStories, Reels, TikTok, mobile-first hero images

Example: square avatar from a portrait

A 1200×1600 portrait shot. Pick 1:1, the rectangle initialises at 1200×1200 centred (max-square in the source). Drag it to position the subject’s face in the frame. Crop. Output is exactly 1200×1200 PNG/JPEG.

Example: 16:9 hero from a wide source

A 4000×2500 landscape shot, want a 16:9 hero banner. Pick 16:9, drag the rectangle to frame the subject, crop. Output preserves the full source resolution within the cropped region — no resampling, no quality loss beyond JPEG re-encoding.

Example: trimming whitespace around a screenshot

A screenshot of a UI panel surrounded by 50px of empty browser chrome. Pick Free, drag handles to tight-fit around the panel, crop. Output is exactly the panel pixels, in the source format.

When to combine with other tools

  • Need a specific output size? Crop first, then run through the resizer.
  • Need a different format? Crop first, then run through the format converter (or just rely on the cropper preserving source format).
  • Need the cropped image to be smaller? Crop first, then through the compressor.

Common mistakes

Confusing crop with resize. Cropping selects a region of the source at full source resolution. Resizing changes the dimensions of the whole image. To shrink a cropped region, crop first, then resize.

Switching aspect ratio mid-crop expecting the rectangle to stay the same shape. Switching to a different ratio forces the rectangle to a new shape — width or height shrinks to match. The center is preserved but dimensions change.

Cropping a JPEG and expecting bit-exact output. Canvas re-encoding is lossy. If bit-exact crop matters (archival, legal), use jpegtran-style tools that operate on the JPEG bitstream directly.

Trying to drag handles outside the source bounds. The crop rectangle is clamped to source bounds — handles can’t pull past the source edges. To get a bigger output, you need a bigger source.

What this tool does not do

It doesn’t resize. The output dimensions equal the cropped region’s source-pixel dimensions. To shrink, use the image resizer.

It doesn’t rotate or flip. EXIF orientation is respected by createImageBitmap automatically; manual rotation isn’t supported.

It doesn’t batch-crop. One file at a time, since each crop is interactive.

It doesn’t upload anywhere. All cropping runs client-side via Canvas. To convert the cropped output to a different format, the image format converter is the follow-up; to compress it further, the image compressor drops the file size without changing dimensions.

Frequently asked questions

How do the handles work?

Eight handles on the crop rectangle: four corners (resize both axes — diagonal), four edges (resize one axis). Drag inside the rectangle to move it. The center of the rectangle is preserved when you switch aspect-ratio presets, so the framing stays roughly the same. Touch and pen input work the same as mouse — pointer events handle all three uniformly.

Why does the rectangle shrink when I switch aspect ratios?

Because the new ratio constrains one dimension. If you had a 4:3 rectangle and switched to 1:1, the width or height has to drop to match the new shape — preserving area would push the rectangle outside the source bounds. The tool shrinks while keeping the center fixed, so the visual crop framing stays close to what you set up. To get a bigger 1:1 crop, drag a corner to enlarge after switching.

What's the difference between Free and a numeric ratio?

Free aspect lets you drag any dimension independently — corners and edges work without constraint. A numeric ratio (1:1, 4:3, 16:9, 9:16, 3:2) locks the rectangle to that exact width:height proportion, even when you resize. Use a ratio when the output has a known shape (square avatars, 16:9 video thumbnails, vertical 9:16 social posts). Use Free when you're cropping out unwanted edges and the result shape doesn't matter.

Does the output preserve original resolution?

Yes. The on-screen surface scales the image to fit the available width, but the crop is computed in *source* pixel coordinates and the canvas is sized to exactly the cropped pixel dimensions. So if you crop a 1000×1000 region out of a 4032×3024 source, the output is 1000×1000 — not whatever the on-screen rectangle measured in CSS pixels.

Why does cropping a JPEG produce a slightly different image even at the same dimensions?

Because cropping re-encodes through canvas: decode source JPEG → render to RGB on canvas → re-encode as JPEG via canvas.toBlob. Each lossy round-trip adds artefacts. The tool uses quality 92 (good default) but it's not byte-identical to the original. For lossless crop on a JPEG you'd need a tool that operates on the JPEG bitstream directly (jpegtran), which can crop on 8×8 block boundaries without recompression. For everyday cropping, the canvas path is fine.