


About
About RotatePictures
This site does one job: it makes a picture the right way up. It does that by a quarter turn, by a measured angle against a reference, by a mirror where the file needs one, or by repairing the single metadata field that tells other programs which way up the picture already was. Where a free angle leaves empty corners, the frame you choose may crop them — and the cost is stated before you save. It does not resize, compress, filter or retouch.
Why one operation
A tool that does one thing can afford to be exact about it. There is room on the page to say what a free-angle rotation costs in sharpness, to compute the crop analytically instead of guessing at it, to report the orientation tag in words instead of as a digit, and to prove — on the file in front of you — that a JPEG quarter turn really was written without loss. A tool that does twelve things has room for none of that, and ends up describing all twelve in the same three adjectives.
The narrowness also decides what gets refused. A CMYK JPEG is declined rather than converted, because converting it would change colours nobody asked to change. A file with no orientation tag is left alone rather than guessed at, because there is no information in the file to base a guess on. Saying no is part of the specification here, not an apology for a missing feature.
How it is built
- Everything runs in the browser tab. There is no server behind this site that could accept a picture, no upload endpoint, and no place a file could be stored even by accident — the whole site is a set of static files. A check in the build forbids network calls in the image code, and a browser test watches the network while files are opened and saved and fails on any request that carries one.
- The preview is drawn from a reduced copy so the dial stays smooth on a large photograph; the saved file is drawn from the full array by the same routine, with the same numbers. There is one geometry function and one drawing function, so there is nothing for the two passes to disagree about.
- The heavy pieces are fetched only when they are needed. The TIFF decoder arrives when a TIFF is opened, the HEIC codec when a HEIC is opened, and the EXIF writer when a file is saved. None of the three is downloaded by anyone who came only to read. The ZIP builder is the exception and is not heavy: eighty lines written here instead of a library, and it ships with the batch page rather than being fetched when a queue runs.
- A JPEG quarter turn or flip is done on the compressed blocks, the way jpegtran does it: the 8×8 coefficient blocks are moved and transposed, nothing is decoded or rounded, and the written file is read back and compared coefficient by coefficient before the page says “without loss”. When the picture’s width or height is not a whole number of blocks on the edge that has to move, the page says so and offers to trim that strip; otherwise it re-encodes and labels the file a second generation.
- The orientation tag is rewritten by a narrow EXIF writer that changes one field and the link to the stale preview thumbnail, and copies every other byte across. The batch tag route compares the compressed scan before and after, per file, rather than assuming it survived.
- The horizon finder is classical geometry — edge detection and a line vote on a small copy — and it refuses when it is unsure rather than guessing.
What is not built yet
Perspective correction for a document photographed at an angle, 3D rotation and spinning animations are specified but not shipped. Each is a real piece of work with real edge cases, and half of any of them would be worse than none. They are named here rather than left as a silence. The horizon finder that did ship is classical geometry run on this device — straight edges and a vote — and it only ever suggests: an angle is applied when you press for it.
Who made it
RotatePictures is built and maintained by its own small team. There are no accounts, no newsletter and nothing to sign up for; the contact page reaches us. If something here is wrong — particularly if a file comes out turned the wrong way — that is a bug worth knowing about, and the orientation values in the reference page are the vocabulary to describe it with.