How to rotate an image
- Drop your image into the zone above, or click to browse. JPG, PNG, and WebP are supported.
- Choose a preset rotation: 90° Left (counter-clockwise), 180° (upside down), or 90° Right (clockwise). Or enter a custom angle between 0 and 360 degrees.
- Select an output format — leave it on Same as input to keep the original format, or switch to JPG, PNG, or WebP.
- Click Rotate & download. The rotated image saves directly to your device.
Everything runs in your browser using the Canvas API.
No file is sent to a server — open DevTools (F12) → Network while rotating to verify zero upload requests.
When to rotate an image
- Correcting phone camera orientation — phones sometimes write EXIF orientation metadata that some apps ignore, displaying a portrait photo as landscape or upside down. Rotating the canvas data corrects this at the pixel level rather than relying on metadata that may be stripped.
- Fixing a scanned document — flatbed scanners often produce landscape images of portrait pages. A quick 90° rotation corrects the reading direction.
- Preparing images for a template — email templates, social media post editors, and document builders sometimes only accept images in a specific orientation. Rotate before importing.
- Creating artistic compositions — a slight custom-angle tilt (3°–5°) on a product photo or portrait adds a dynamic, editorial feel used in magazine and poster layouts.
- Correcting aerial and drone images — aerial shots from drones frequently have a heading offset. A custom angle corrects this for maps and orthophoto composites.
How it works under the hood
The browser decodes the image file using createImageBitmap(), which produces an uncompressed pixel grid. For 90°/180°/270° preset rotations, the canvas dimensions swap width and height as needed, then a CSS transform-equivalent canvas context transform is applied before drawing.
For custom angles, the output canvas must be larger than the original to avoid clipping the rotated corners. The required dimensions are computed with trigonometry: the new width is originalWidth × |cos θ| + originalHeight × |sin θ|, and the new height is originalWidth × |sin θ| + originalHeight × |cos θ|. The canvas context is then translated to the new centre, rotated, and the image drawn centred at the origin.
The result is encoded back to the chosen format using canvas.toBlob(). For PNG output, the encoding is lossless. For JPG and WebP, a quality of 0.92 is used — high enough to preserve all visible detail while avoiding unnecessary file size inflation.
Limits and what to expect
- Custom angles and PNG transparency: areas outside the original image bounds (the "corners" that appear after a non-right-angle rotation) are transparent on PNG output. On JPG output, those areas are white, since JPG does not support transparency.
- Quality with custom angles: 90°/180°/270° rotations on PNG are mathematically lossless — every pixel maps exactly. Custom angles require bilinear resampling (the browser fills rotated pixels by blending neighbours), which introduces minor softness at the pixel level, invisible at normal viewing sizes.
- EXIF metadata: the output image does not carry EXIF metadata, including the orientation tag. This is intentional — the rotation is baked into the pixel data, so no metadata hint is needed.
- Large images: very large images (20+ megapixels) may take a moment to process on older devices. The canvas limits on most browsers are 16,384 × 16,384 pixels.
- Browser support: Chrome 90+, Firefox 90+, Safari 15+, Edge 90+.
Privacy: what happens to your file
Your image is decoded in browser memory and rotated locally. Nothing is sent to a server. The rotated file is created from the canvas and downloaded directly to your device.
For personal or confidential photos — medical images, identity documents, private photos — this architecture means there is no third-party server involved at any step. Open the Network tab in DevTools while rotating to confirm zero outbound file transfers.