Why your iPhone photos will not open
Since iOS 11, an iPhone saves photos as .heic rather than .jpg by default,
which is why iPhone HEIC to JPG is the busiest conversion on this whole site. The
format is genuinely good: at the same visible quality it lands around half the
size of a JPEG, which is why Apple switched.
The trouble is what is inside. A HEIC file stores its pixels as an HEVC intra frame, which is to say a single video frame. HEVC comes with patent licensing, and Chrome and Firefox have never shipped a decoder for it. Windows asks you to buy an extension. The result is a photo that looks fine on the phone that took it and is rejected by a submission form, a printer, an older laptop, or a colleague on Windows.
To convert HEIC to JPG is to decode that frame and re-encode it as something everything on earth can read.
What changes, and what does not
The picture survives. Orientation survives, which matters more than it sounds: phones store rotation as a tag instead of turning the pixels, and a converter that ignores the tag is why people end up with sideways photos.
The file gets bigger, normally around double. HEIC is about twice as efficient as JPEG, so the same image needs more bytes once it is a JPG. Nothing has gone wrong; you have traded size for the ability to open it.
Some things are dropped, and it is worth knowing which. The HEIC container can carry more than one image: the short clip of a Live Photo, a depth map from portrait mode, an HDR gain map, or the siblings of a burst. A JPG has nowhere to put any of that. This tool takes the primary image, the one the Photos app shows you, and leaves the rest behind.
Keep the originals
Because HEIC is already lossy, making a JPG is a second round of lossy compression. At the default quality that is invisible at normal viewing size, and at a low quality setting it is not. Either way it is not reversible, so the sensible habit is to treat the JPG as the copy you hand out and keep the HEIC as the one you keep.
Where the work happens
On your own machine. The decoder is libheif compiled to WebAssembly, fetched once on your first file and then served from your browser cache, and it runs in a background thread so a folder of full-resolution photos does not freeze the page while it works. No photo is sent anywhere.