Just File Tools

Image Rotate / Flip

Rotate by 90° or flip horizontally / vertically — output preserves format

Drop an image — JPG, PNG, WebP, GIF (single frame). HEIC: use the HEIC to JPG tool first.

Max file size: 50MB

Files are processed in your browser. Nothing is uploaded.

How to Image Rotate / Flip Online

Rotate an image by 90° or flip horizontally/vertically — output preserves the original format.

  1. Drag an image into the drop zone, or click to choose one. JPG, PNG, WebP, and single-frame GIF all work. (For HEIC, run it through the HEIC → JPG tool first.)
  2. Click 'Rotate 90° left' or 'Rotate 90° right' to spin the image in 90° increments. Each click adds to the current rotation.
  3. Toggle 'Flip horizontal' or 'Flip vertical' to mirror the image. These compose with rotation.
  4. Watch the preview update live — what you see is exactly what gets downloaded.
  5. Click 'Reset' to return to the original orientation.
  6. Click 'Download' to save the transformed image. The filename gets a `-rotated` suffix.

About Image Rotate / Flip

Rotating an image is one of the simplest operations in image processing, and it is also the operation people most often want to undo a phone's autorotation mishap, fix a scanned document that came out sideways, or prepare an asset for a layout that needs a specific orientation. The CSS `transform: rotate(90deg)` you can write in a stylesheet only affects how the image displays in *your* page; it doesn't change the file. This tool changes the file.

The implementation is a textbook canvas operation: decode the source image, create a new canvas with the rotated dimensions (width and height swap for 90° / 270°), translate to the center, apply the rotation matrix and optional flip scale, draw the source at its centered origin, then re-encode as JPG or PNG matching the input format. All four operations — rotate left, rotate right, flip horizontal, flip vertical — compose cleanly with each other, and the live preview re-runs the pipeline on every state change so what you see is exactly what gets downloaded.

A few subtleties worth knowing.

**Re-encoding is lossy for JPG.** Each save through canvas produces a new JPEG quantization pass at 95% quality. One pass is imperceptible. Ten passes — rotating, saving, opening, rotating again, saving again — eventually compounds to visible blocking artifacts in flat areas (sky, walls). For workflows where you'll rotate multiple times, do all the rotations in one session here, save once, and don't reopen-and-re-rotate the result.

**EXIF orientation is ignored.** Many phone JPGs ship with an `Orientation` EXIF tag like `Orientation: 6 (Rotated 90° CW)`. The pixel data on disk is in one orientation; the tag tells viewers to display it in a different orientation. Some viewers honor the tag (most modern image viewers, most photo apps), others don't (older browsers, some forum upload pipelines, raw `<img>` tags in older browsers). This tool reads the pixel data as-is, ignoring the orientation tag, so when you rotate, you're rotating the *actual* pixels — the output has no orientation tag and will display correctly anywhere.

**Metadata gets stripped.** This is a side effect of canvas re-encoding, not a deliberate feature, but it has the same effect as the EXIF Stripper tool: the output has no EXIF, no IPTC, no XMP, no GPS coordinates. Drop a phone photo here, rotate it 0 degrees (or one full 360°), and the output is metadata-free.

**Output size often grows.** Re-encoding picks default JPEG quantization tables that are usually less optimal than what your camera or photo editor chose. The output is often 10–30% larger than the input for the same visual quality. If file size matters, run the result through the Compress Image tool.

**Only 90° increments.** Arbitrary-angle rotation (like 5° to fix a tilted horizon) needs decisions this tool doesn't make: should the resulting bounding box be cropped to remove the empty corners, padded with white, or kept transparent? What interpolation should be used for sub-pixel sampling? These are dedicated-editor questions. For a tilted horizon, the Image Crop tool can cut out the misaligned portion.

The tool also doesn't handle multi-frame GIFs or animated WebP — only the first frame gets transformed and the result is a static JPG. For animated formats, command-line tools like `gifsicle` or `ffmpeg` are the right destination.

Everything runs in your browser. The canvas API is universal; there are no external libraries. The output is generated client-side and downloaded directly from a blob URL — no network requests during the rotation. Object URLs are properly revoked when the tool unmounts, so memory doesn't leak even if you process several images in a row.

Frequently Asked Questions

Does rotating a JPG re-encode it? Will quality drop?

Yes, this tool re-encodes via canvas, which means a JPG saved at 95% quality each time you transform. For a single rotation that's imperceptible. For repeated round-trips (rotate, save, open, rotate again) you'll eventually see compression artifacts. For lossless rotation of JPGs, you need a tool that operates on the JPEG block structure directly (like `jpegtran`) — that capability requires WebAssembly and isn't worth the bundle size for a 90° rotate. If lossless matters, use ImageMagick at the command line.

Why doesn't the rotation respect EXIF orientation?

Many phone JPGs carry an `Orientation` EXIF tag that tells viewers to rotate the displayed image without changing the pixels. This tool reads the pixel data and shows you the actual file content, ignoring the tag. When you rotate here, you're rotating the pixels themselves — the output has the canonical orientation baked in and no orientation tag. This is the right behavior for any image you'll display on the web, where browser EXIF support is patchy.

What's the difference between rotate and flip?

**Rotate** turns the image around the center, preserving the relationship between pixels. A face still looks like a face after rotation — just sideways. **Flip** mirrors the image; faces become their mirror image. Both 90° rotation and flip change the file's orientation; flipping does *not* compose with itself the way rotation does (two flips give you back the original; four 90° rotations also give you back the original).

Does this strip metadata too?

Yes, by side effect. Canvas re-encoding drops EXIF / IPTC / XMP exactly like the EXIF Stripper tool does. If you specifically want to preserve metadata while rotating, use a dedicated lossless rotator at the command line (`exiftool` + `jpegtran`). If you want to strip metadata as well, this tool does it for free.

Why does the output file size differ from the input?

Canvas re-encoding picks its own JPEG quantization tables and Huffman tables. They're typically slightly less optimal than what the original encoder (your phone, Lightroom) chose. Result: the output is often 10–30% larger than the input for the same visual quality. If output size matters more than the rotation, compress the result via the Compress Image tool.

Can I rotate by arbitrary degrees (e.g. 5° to fix a tilted horizon)?

Not in this tool — only 90° increments. Arbitrary-angle rotation needs additional thinking: how to crop the resulting non-rectangular bounding box, whether to fill the edges with white or transparent, what interpolation to use for sub-pixel sampling. The Image Crop tool can fix tilted horizons by cropping out the misaligned portion; for free-angle rotation, a dedicated editor like Lightroom or Affinity Photo is the right tool.

Is anything sent to a server?

No. The image is decoded, transformed, and re-encoded entirely in your browser using canvas. No network requests during the operation. Drop a photo, get a rotated photo — nothing leaves your tab.