All tools
Quarter-turns and mirror images

Image Rotate & Flip

Turn JPEG or PNG images in 90-degree steps and flip their visible horizontal or vertical axis. Keep separate transforms for each image, or explicitly apply an action to the whole ready batch.

Images are processed in a local browser worker, not uploaded or saved. Refreshing clears the batch and memory-only Undo.

Drop static JPEG / PNG images here, or

20 files · 20 MiB each · 100 MiB combined sources · 20 megapixels · 8,192 px per edge. Static JPEG/PNG content only; animation and unsupported formats are rejected.

Images stay in browser memory. Refresh clears them. Checking, encoding and ZIP assembly run serially in a local worker.

Export settings — apply to every image

PNG retains alpha. JPEG is reencoded, not lossless; transparent pixels use the selected background. Original files are never changed.

How to rotate or flip images

  1. Add up to 20 static JPEG/PNG images. Content is inspected and decoded; extensions alone do not decide the format. Review upright dimensions and any failed checks.
  2. Select an image for the larger pending preview. Rotate clockwise or counterclockwise, flip horizontally or vertically, or Reset selected. Actions affect only that image unless Apply transform action to all ready images is checked.
  3. Choose source-matching output (the default), PNG or JPEG. Export settings apply to every image. JPEG quality defaults to 90 and transparency is flattened against an explicit solid background, white by default.
  4. Press Generate selected or Generate all ready. Each output is rendered from the original upright source exactly once for its current transform, not from a previous encoded result.
  5. Review generated dimensions, size and the expandable file preview. Download individual files or explicitly download generated successes as a ZIP; the interface states how many failed/ungenerated items are omitted. Cancel preserves finished results and never calls unfinished work complete.

Worked example: a 3-by-2 pixel image

A B C
D E F

Rotate clockwise 90° to get a 2-by-3 image, without cropping or padding:

D A
E B
F C

A horizontal flip of the original gives C B A / F E D. A vertical flip gives D E F / A B C. Action order matters: rotate then flip the visible horizontal axis is different from flip then rotate. Four identical quarter-turns, or two identical flips, restore original pixel geometry without cumulative reencoding.

Orientation, previews and exact geometry

Browser decoding applies source EXIF orientation once, including mirrored orientation. All user transforms operate on that upright pixel matrix. The eight possible quarter-turn/reflection states are represented by exact integer transforms. Translation keeps all pixels inside the output; 90°/270° swap width and height, while 180° and flips preserve them.

Pending previews transform a bounded upright thumbnail using the same canonical geometry as export. CSS preview size is separate from intrinsic output dimensions. Export draws the original upright bitmap into a correctly sized canvas once, with smoothing disabled for exact quarter-turn geometry. Editing a file invalidates only its generated output and any ZIP; global export changes invalidate every output.

Formats, transparency and metadata

PNG export retains transparency. JPEG export is opaque and reencodes with your quality/background settings, even for an identity transform. This is not lossless JPEG rotation and does not promise byte-identical output. Browser encoding need not preserve original metadata, colour profiles or compression. Always keep your original files.

Animated PNG markers, corrupt containers and unsupported content are rejected rather than choosing a frame. GIF, WebP, SVG, HEIC, AVIF, workbook-like documents, unusual JPEG encodings, arbitrary-angle rotation and perspective correction are outside this release. Current browsers with Web Workers, OffscreenCanvas and createImageBitmap are required.

Limits and recovery

Limits are 20 files, 20 MiB per source, 100 MiB combined compressed sources, 20 megapixels and 8,192 px on either oriented edge. Dimensions are checked before full canvas allocation where possible. Checking, decoding, generation and ZIP assembly are serial, with original bitmaps closed and temporary canvases released after each item.

Retained generated blobs plus any retained ZIP are bounded to 150 MiB, including archive overhead. If a ZIP would exceed that budget, individual downloads remain available. If another output cannot be retained, generation stops explicitly: download finished images, use Release generated results, then retry the remaining originals.

Clear all / Reset offers one-step Undo of the batch, transforms, export settings and generated results. Adding a new batch after clearing releases that Undo snapshot. Failed images stay listed for retry/removal; source files remain unchanged. Safe basename-derived names use -rotated and deterministic numeric collision suffixes, with extensions matching the encoded MIME type.

No image data or filenames are put into analytics, URLs, logs or persistent browser storage. Local blob URLs are temporary preview/download handles, not uploaded images. Workers are terminated on cancellation and obsolete replies are discarded; owned URLs are released on invalidation, removal and leaving the page.