How a HEIC becomes a JPG here
Drop your photos, pick a quality, download the JPGs. What happens between those two clicks depends on which browser you are in, and the split decides whether you download a decoder or not.
Safari reads HEIC by itself, so the page asks the browser first. Chrome, Firefox and Edge answer that request with InvalidStateError: The source image could not be decoded. They are not broken. The picture inside a HEIC is one frame of H.265 video, H.265 decoding sits inside two patent pools, and the browser makers left it out on purpose.
When the browser says no, the page fetches libheif compiled to WebAssembly: a 91 KB loader and a 1.42 MB decoder, roughly 370 KB over the wire once compression is on. Both files come from this site, once, and only after you press Convert. They start a background worker, the worker hands back raw pixels, and a canvas writes your JPEG from them. On a desktop machine a 4032 × 3024 photo spends about 0.65 seconds in the decoder and another 0.08 in the encoder.
Your photo is read by the tab you are looking at. Nothing about it reaches a server, which is also why a stack of twenty files converts one at a time rather than all at once: a 12-megapixel frame costs 46 MB of memory while it is being written, and holding twenty of those would end the tab.
When you'd reach for it
- A form only takes JPG or PNG. Insurance claims, visa applications, school portals and job sites are years behind on HEIC, and the error they hand you seldom says which format they wanted.
- Someone on Windows or Android cannot open what you sent. Windows asks for a paid HEVC codec from the Microsoft Store to show a photo your phone took for free.
- A marketplace listing bounces. eBay, Etsy, Depop and most older WordPress installs read the extension, not the file.
- You are printing. Photo kiosks and print shops still answer "unsupported file" for a camera roll copied straight onto a stick.
- The file has to shrink for an email. The Small file setting took the 2 MB test photo below down to 0.6 MB.
What this tool cannot do
It will not make a HEIC. Every other converter here links to its own reverse, and this one links to the PNG page instead. Writing a HEIC means running an H.265 encoder, which is the side of the patent question where licensing bites. This page decodes what your camera already made, and stops there.
A photo rotated only by its Exif tag comes out on its side. HEIC files can state their rotation two ways. libheif applies the one stored as a container property and never looks at the Exif tag, which is where some cameras and most edited files keep it. If your portrait shot lands sideways, rotate it in your phone's photo app and export again. Of everything on this list, this is the one most likely to surprise you.
Every piece of metadata is dropped. The shooting date, the camera model, the lens and the GPS coordinates all stay behind, and the JPG carries pixels alone. Half of you wanted those fields kept and the other half is relieved, which is why it gets said outright rather than left for you to discover.
A Live Photo loses its motion. You keep the still frame the camera calls the key photo. The couple of seconds of video inside the file are dropped.
A burst gives you one picture. So does a sequence file, and so does a portrait shot with a depth map: you get the primary image, not every frame and not the mask.
HDR flattens. A 10-bit photo comes back as ordinary 8-bit color, so a bright sky looks flatter here than it does in the Photos app.
AVIF gets refused by name. AVIF and HEIC are the same container with a different codec inside, and your file manager shows them with the same icon. The check reads the container brands before anything downloads, so an AVIF stops with a message naming the format instead of failing halfway through the decoder.
100 megapixels is the ceiling. Decoder memory climbs to roughly nine bytes per pixel and never gives any of it back, so a photo past that point is refused rather than allowed to kill the tab. Every phone camera shipping today sits well under it, and a 48-megapixel HEIF Max file will still push a phone browser hard.
No cropping, no straightening, no resizing. One format in, another out.
Frequently asked questions
Will the JPG be bigger than the HEIC?
At the High setting, expect about the same size. A 4032 × 3024 test photo went in as a 2,043,192-byte HEIC and came out as a 2,035,871-byte JPG. H.265 packs a picture tighter than JPEG can, so matching its quality costs JPEG back the bytes it saved. That is why the download row prints the new size on its own rather than a percentage. On this photo the two sizes are within half a percent of each other, and on a picture where JPEG needs more room the row would print a plus sign against a conversion that went perfectly.
High or Small file?
High, unless a size limit is the reason you came. There are two settings and not three because the question has two answers: keep the photo, or make it fit. On that same test photo High wrote 2.0 MB and Small file wrote 0.6 MB.
Does my photo get uploaded?
No. The decoder is downloaded to you; your photo is not sent anywhere. Open the network panel and convert, and you will see the two decoder files and nothing leaving.
Why is the first conversion slower than the rest?
The decoder arrives on your first press of Convert and stays for the rest of the visit. After that it starts in about 10 milliseconds and the whole cost is the decode.
Can I convert my whole camera roll at once?
Yes. Select them all, convert once, then take them one by one or as a single zip from the button under the list. Each photo keeps its own name with .jpg on the end.
My photo came out upside down. What now?
Open it in your phone's photo app, turn it there, and export again. The rotation then lands in the container where the decoder can see it. The Exif note above explains why this happens at all.
What about files that say .heif instead of .heic?
Same format, same handling. Both extensions are accepted and both are swapped for .jpg.
The decoder, and its license
Two open-source projects do the reading here, both under the GNU Lesser General Public License v3.0. They are served from this site as unmodified binaries, and you are free to take them and use them yourself:
- libheif 1.23.2 reads the container and finds the picture inside it. Source: github.com/strukturag/libheif, packaged for browsers as libheif-js.
- libde265 1.0.15 is the H.265 decoder underneath, which turns the compressed frame into pixels. Source: github.com/strukturag/libde265.
The license text travels with them at /libheif/LICENSE.txt. Neither project was patched, and the WebAssembly file you download is byte for byte what libheif-js publishes.