Quarter turns and mirrors as exact permutations, checked by decoding the output and comparing it with what went in. A free angle is marked as the resample it is, and the EXIF Orientation tag is read and named.
Initializing in your browser…
Turn an image into a data URL whose payload is decoded again and compared byte for byte with the file, with the media type taken from the file's own signature rather than its extension and the size cost of embedding stated in full.
Compare two images with a perceptual engine (pixelmatch) that ignores anti-aliasing, or an exact byte engine. Groups changes into regions with bounding boxes, reports SSIM, and handles size mismatches with an explicit policy.
Whole-pixel crops with the rectangle typed or dragged, checked by decoding the output and comparing it with the pixels that went in. Quarter turns and mirrors are exact permutations, so nothing is clipped.
A 301 by 199 picture, turned a quarter and then turned 45 degrees, so the difference between the two kinds of rotation is on one screen.
Input
xy-odd.png 301 x 199 · quarter turn right, then the same picture at 45 degrees
Output
quarter turn 199 x 301 exact: largest channel difference 0 45 degrees 354 x 354 a resample; 64,896 empty corner pixels 45 + auto crop 140 x 140 no empty pixels, and 67% of the area gone
A quarter turn is a permutation: every output pixel is an input pixel moved, and the page confirms it by decoding the output and comparing it with what went in. Forty-five degrees is not, and the page says so rather than calling both of them rotation. The bounding box at 45 degrees is 353.553 pixels, rounded UP to 354; truncating it, which is what assigning width * |cos| + height * |sin| to a canvas does, would lose a sliver of the picture. Cropping the corners away is offered and costs two thirds of the area here, so it is a checkbox with the number beside it rather than a default.
A rotation by a multiple of 90 degrees and a mirror are the only geometric operations on an image that lose nothing at all. Every output pixel IS an input pixel, moved: nothing is averaged, interpolated or clamped, and the output has exactly the same set of pixel values as the input in a different order. This page performs them as index permutations rather than as canvas transforms, so the output size comes from the operation and cannot be got wrong, and it checks the result: the output is decoded again and compared with the transformed pixels, and the verdict panel says whether the largest single-channel difference is 0. A free angle is a different operation and the page keeps the two apart. At 30 or 45 degrees every output pixel falls between four source pixels and has to be interpolated, so the picture is softened and the corners are empty. The verdict says so, in those words, rather than describing both cases as "rotation".
A quarter turn costs nothing: the page confirms the largest channel difference is 0 rather than asking you to take it on trust.
A small angle with the corners cropped away, and the page says how much area that cost.
A mirror is exact and the dimensions do not change.
Turn to portrait, keep PNG for exact pixels, and read what the source metadata was before it went.
The output box for a free angle is the exact bounding box of the rotated rectangle, rounded UP. That matters: a 301 by 199 turned 45 degrees needs 353.553 pixels on each side, and assigning width * |cos| + height * |sin| straight to a canvas truncates it to 353, throwing away a half-pixel sliver of the picture. Rounding up keeps it, at the cost of a row of empty pixels.
Empty corners can be left transparent, filled with white or black, or cropped away. Cropping takes the largest axis-aligned rectangle with the source aspect ratio that fits inside the turned picture, which is a real loss of area, so it is a checkbox rather than a default and the page says what fraction of the original area survives. In a format with no alpha channel there is no transparent option at all, and the page says the corners will be solid rather than letting you find out after downloading.
The EXIF Orientation tag is read and named. CIPA DC-008 defines eight values, and four of them include a mirror, so they are not eight rotations. Every current browser applies the tag when it draws an image, which means the pixels this page receives are ALREADY oriented: a photograph taken sideways arrives the right way up, and a turn you add here is on top of that rather than instead of it. The page states the tag, its meaning from the specification, and both sizes when the stored size differs from the displayed one. The output carries no orientation tag, because a canvas cannot write one, and it does not need one: the pixels are stored the way they are shown.
One thing this page does not do, and says so. A JPEG whose stored dimensions are a whole number of 16 by 16 minimum coded units can be turned a quarter IN ITS CONTAINER, moving the entropy-coded blocks without decoding anything, which is what jpegtran -rotate does and is lossless in the JPEG sense. This page decodes and re-encodes, so it tells you whether your file would have allowed a container rotation, and points at PNG for a result whose decoded pixels are exact. Metadata does not survive either way here: the picture goes through a canvas and comes back as bare pixels.
A quarter turn or a mirror does not: every output pixel is an input pixel moved, and the page proves it by decoding the output and reporting a largest channel difference of 0. Two things can still cost you. A lossy output format re-encodes the picture, and the verdict says so. And a free angle is an interpolation, which softens fine detail.
Yes, from -45 to +45 degrees with a slider or a dial, on top of any quarter turn. It is marked as a resample because that is what it is.
Because the default output is PNG, which is lossless and has to store the JPEG artefacts as though they were detail. A 63.6 KB JPEG can come back as a 648.5 KB PNG. Choose JPEG or WebP if the size matters more than exactness; the page warns when the output grew.
It can be, but not here. A JPEG whose stored dimensions are a whole number of minimum coded units (16 by 16 pixels with the usual chroma subsampling) can be turned in the container with jpegtran, moving the coded blocks without decoding them. This page decodes and re-encodes, so it tells you whether your file would have qualified rather than leaving the question unasked.
It is read and named. The browser has already applied it before the pixels reach this page, so the picture you see is the right way up and any turn you add is on top of that. The output has no orientation tag and does not need one, because its pixels are stored the way they are displayed.
Images are decoded, edited, and exported entirely inside this browser tab. No originals, exports, or metadata are uploaded.