About this converter

One output format

This site turns pictures into JPGs. Every route on it ends in a JPG: a HEIC from an iPhone, a PNG with a transparent background, an AVIF saved from a website, a scanner’s TIFF, a .jfif a browser named strangely, or a photo that has to be exactly 20 to 50 KB and 3.5 × 4.5 cm for an exam form. There is no editor here and no second output format, and the absence of those is deliberate.

The decisions JPEG forces are controls rather than guesses. How much quality to spend — measured per photo, one fixed number, or the highest quality that fits a size in KB. What colour goes behind transparency, since JPEG has no alpha channel. What pixel size the file is written at, down to an exact box. And what happens to the metadata, since a photograph carries a capture date and often a set of coordinates, and both dropping them silently and keeping them silently are the wrong answer. Each control says what it costs.

How it runs

Photos stay on your device. The page is a static export with no server behind it: there is no API route on phototojpg.com that accepts a picture, because there is no API route at all. A file that lands here is read into memory, decoded, re-encoded, and handed to the browser’s download machinery. When the tab closes it is gone.

The heavy parts go to a background worker wherever the browser has the pieces for one, which is why a queue of two hundred photographs does not freeze the page. Where it does not — the requirement is OffscreenCanvas, which Safari only picked up in 16.4 — exactly the same code runs on the page’s own thread, and a long queue makes the tab sluggish while it works. The HEIC decoder is a WebAssembly build of libheif, about 1.5 MB, fetched the first time a HEIC is opened. A WebAssembly AVIF decoder, about 1.2 MB, is fetched only if the browser cannot read AVIF itself. The TIFF reader loads on the same terms. Everything else is the browser’s own decoding.

Files that are already JPEG can stay that way: with the lossless switch on, the compressed picture is copied byte for byte and only the name, the metadata or the DPI label change. Every written file is read back, so the row reports what the file actually carries rather than what was intended.

What it will not do

It does not retouch, lighten, filter or repair a picture, produce a PDF, or write any format other than JPEG. The pixel count changes only when you ask — a long-edge cap, a percentage, an exact box, or a size target you allowed to shrink the pixels — or when a picture too large for the browser to hold stops and asks whether a lighter copy is acceptable.

It reads PDFs and SVGs only to draw them as pictures: pages become JPGs, and text in them becomes pixels. Chroma subsampling and progressive scans are controls when the Precise encoder (MozJPEG, compiled to WebAssembly and served from this site) is chosen; the default browser encoder decides them itself, and every written file is read back to say which it got.

Who runs it

PhotoToJpg is an independent, single-purpose site, built and maintained by a small team that uses it for the same jobs its visitors do. It carries no advertising and asks for no account.

Corrections and bug reports are welcome, and a file that fails to convert is the most useful thing to describe: the format, the device it came from, and the message the row printed. Use the contact page, or write to hello at phototojpg.com.