Convert HEIC to JPEG
Turn the photos an iPhone saves as .heic into JPEG files that Windows, Word and every upload form will open. The photo is read and written inside this tab — it is never sent anywhere.
Up to 20 photos, 50.00 MB each. Output is JPEG — the photo format every device and site accepts. Need a PNG instead, with nothing re-compressed?
What this page downloads, and when
Your browser is asked to open the photo first. Safari can read HEIC on its own and nothing extra is fetched. Chrome, Edge and Firefox cannot, so the page then fetches a 0.5 MB decoder from this site and runs it here in a worker. That is the only network request your photo causes, and the photo itself is not part of it.
The decoder is libheif, licensed LGPL-3.0. It is served as its own file rather than baked into the page, so it stays a component you can read, replace or rebuild.
About this HEIC to JPG converter
To convert a HEIC photo to JPG without uploading it, choose the .heic files on this page. Your browser is asked to decode each one first. Safari can read HEIC on its own, so nothing extra is fetched. Chrome, Edge and Firefox cannot, so the page then fetches a half-megabyte decoder from this site and runs it in a worker on your own machine. The decoded picture is drawn onto a canvas and written out as a JPEG, and the file is offered straight back to you. The photograph itself is never sent anywhere.
HEIC is what a modern phone saves a photograph as by default, and it is the reason a picture that looks fine on the phone will not open on a work laptop, will not attach to a claim form and comes back from a print shop as an error. The format is a container holding a still image coded with HEVC, which buys roughly half the file size of a JPEG at the same quality and costs you the ability to open it anywhere that has not licensed the codec. This page converts it to JPEG, which every operating system, browser, printer and upload form built in the last thirty years accepts. Up to twenty photographs at a time, fifty megabytes each, converted one after another so that a tab holding several forty-eight-megapixel pictures at once does not run out of memory part-way through the batch.
Step by step
- 1Choose the HEIC photosUp to twenty files, fifty megabytes each. The picker also accepts .heif, which is the same container under its other extension, and the files can come straight off a phone, a memory card or a folder your phone has already synced.
- 2Let the page try your browser firstEvery photo is handed to the browser to decode before anything is downloaded. This is a capability test rather than a guess about which browser you are using, so the day yours learns to read HEIC the fetch below simply stops happening, with no change to this page.
- 3The decoder is fetched only if it is neededIf the browser refuses the file, a half-megabyte WebAssembly decoder is fetched from this site and started in a worker. It is cached afterwards, so the second and twentieth photographs cost nothing extra to download.
- 4Save the JPEGEach finished photo is listed with its pixel dimensions and its size in bytes, and a save button that writes the file straight out of your tab. Nothing is queued, stored or uploaded, and closing the tab discards everything.
Why a HEIC will not open, and what converting actually changes
A HEIC file is a container. Inside it the picture is coded with HEVC, the same compression a 4K video uses, which is why the file is about half the size of the equivalent JPEG. HEVC is patent-encumbered, so the ability to decode it is licensed rather than universal: phones and recent Apple software have it, a great deal of desktop software does not, and web browsers other than Safari have never shipped it for still images.
Converting does not re-photograph anything. The picture is decoded to plain pixels and those pixels are written out again as a JPEG. What changes is the coding and therefore the file size: expect the JPEG to be roughly twice the bytes of the HEIC for the same picture, which is the price of a file that opens everywhere.
JPEG cannot hold transparency, so any see-through area is filled with white before encoding rather than coming out black, which is what an unfilled canvas would give you. Photographs from a phone camera have no transparency, so in practice this only matters for a HEIC that was edited rather than taken.
The decoder runs on your machine, and only when your browser needs it
The usual way to offer this conversion is to take the upload, decode it on a server that holds an HEVC licence, and send a JPEG back. That means handing over the photograph — and holiday photographs, photographs of children, of documents, of an injury for an insurance claim, of a room for a landlord — for the sake of a fraction of a second of computing that your own machine can do.
Instead the decoder comes to you. It is libheif compiled to WebAssembly, served from this site as its own file, started inside a Web Worker in your tab and terminated the moment the conversion finishes. Measured on 2026-09-24 by weighing what the package actually ships, the transfer is about half a megabyte compressed, and a twelve-megapixel photograph decodes in roughly a seventh of a second after a five-millisecond start.
This page therefore allows same-origin connections and permission to compile WebAssembly, exactly as the background remover does, and nothing further. No third-party origin is reachable from it, peer connections stay blocked, and the only request your photograph causes is the one that fetches the decoder — a request that carries no part of your photograph, because the file is read from your own disk by the file picker and never enters a network request at all.
The decoder is licensed LGPL-3.0 and is deliberately served as a separate file rather than compiled into the page, so it remains a component you can read, replace or rebuild for yourself. The notices file in the repository names the licence and points at the upstream source. The HEVC patent position is a separate matter from the licence and is not something this page claims to have cleared.
What does not survive the conversion
The metadata does not come across. Because the picture is decoded to pixels and re-encoded by the browser, the EXIF block goes with the original: the camera model, the exposure settings, the orientation flag, the date and — the one most people care about — the GPS coordinates. If you need that information, keep the .heic file; if you were converting in order to strip it, that is what this does, though the photo metadata tool is the honest place to check what a file carries.
A Live Photo is two files, a .heic still and a .mov of the seconds around it. Only the still is converted here, because only the still is what you handed over. The motion clip is a separate file and this page does not read it.
A HEIC can hold more than one picture — a burst, a depth map, an alternative exposure. The primary image is the one decoded, which is the picture the phone shows you when you open the file. High-dynamic-range HEICs are flattened to ordinary eight-bit colour, because that is what a canvas holds and what a JPEG can store, so a picture that glowed on a phone screen will look like an ordinary well-exposed photograph.
Nothing is upscaled, sharpened, colour-corrected or rotated beyond what the decoded pixels already contain. The conversion is meant to be boring.
Limits, and what happens when you cross them
Twenty photographs per batch and fifty megabytes per file. Fifty megabytes is comfortably larger than any single frame a phone produces, and the batch ceiling exists because each decode briefly holds the whole uncompressed picture in memory: a forty-eight-megapixel photograph is nearly two hundred megabytes of raw pixels, and four of those in flight at once is how a tab dies rather than how it goes faster. The photos are therefore converted one after another, and the count of the one in progress is shown.
A file that is not a HEIC is reported as such rather than being converted into something wrong. A truncated or corrupt file fails with a sentence saying so, and the batch stops there rather than silently skipping it.
If your browser cannot write the output format at all, nothing is saved. A canvas asked for a type it does not know quietly returns a PNG instead of failing, which would hand you a file named .jpg that is not a JPEG, so the produced type is checked against the type that was asked for and a mismatch is an error rather than a download.
The other half of it is that the code has nowhere to send anything from. lib/tools/local-source-policy.test.ts reads every source file under lib/tools, workers, components and app on every test run and fails if any of them contains fetch, XMLHttpRequest, WebSocket, EventSource, sendBeacon or a peer connection, or even a remote address written in a comment. An upload cannot be added here by accident, because the file that would contain one cannot be committed.
Questions people ask
- Is my photo uploaded to convert it?
- No. The file is read from your disk by the file picker, decoded in your tab and written back out by your browser. The only network request this page can make is for the decoder itself, and that request carries no part of your photograph. The policy served with the page allows same-origin requests and nothing else, and the browser is what enforces it.
- Why does it download something in Chrome but not in Safari?
- Because Safari can already decode HEIC and Chrome cannot. The page asks your browser to open the photo first and only fetches the decoder when that fails, so on Safari nothing extra is downloaded at all. This is a capability test rather than a check of which browser you are running, so it stays correct as browsers change.
- Will the JPEG be bigger than the HEIC?
- Usually about twice the size, for the same picture at the same dimensions. HEIC uses HEVC compression, which is roughly twice as efficient as JPEG, so the file grows when you move the picture into a format that opens everywhere. The pixels and the visible quality are not reduced to make up for it.
- Does the location where I took the photo come across?
- No. Re-encoding through a canvas drops the whole EXIF block, so the GPS coordinates, the camera model, the exposure settings and the capture date stay with the original .heic file and are not written into the JPEG. Keep the original if you need that information later.
- Can I convert a whole folder at once?
- Up to twenty photographs in one go, fifty megabytes each. They are converted one after another rather than all at once, because each decode holds the full uncompressed picture in memory, and the page shows which one it is working on as it goes.
- What happens to a Live Photo?
- Only the still is converted. A Live Photo is a .heic still plus a separate .mov holding the moving part, and this page reads the still you gave it. The video file is untouched and is not read, uploaded or combined into the result.