How to convert iPhone HEIC photos to JPG without uploading
Convert HEIC photos from iPhone to JPG or PNG entirely in the browser. Why HEIC opens nowhere outside Apple, and how libheif-js decodes it locally.
Why HEIC keeps “won’t open on the other end”
Since iOS 11 the iPhone camera defaults to HEIC (.heic / .HEIC), which is Apple’s HEIF container wrapping a still image encoded with the HEVC (H.265) codec. The trade-off is great on the device — visually similar to JPEG at roughly half the size, so the camera roll stays slim. The trade-off flips the moment you try to send those files elsewhere: “the photo I shared didn’t show up in their Slack”, “the job portal rejected my résumé picture”, “the email attachment renders as black on Windows Mail”. All of these are the consequence of HEVC’s licensing situation and the patchy state of HEIC decoders across operating systems.
Concrete examples pile up fast. Hiring sites reject HEIC outright for ID photos. Insurance portals only accept JPEG/PNG for proof-of-identity uploads. Discord, older versions of Teams, and several blog CMS importers fail to render the thumbnail. Pasting a HEIC into Word or PowerPoint works on some Office builds and silently misbehaves on others. The web at large is still standardised on JPEG, PNG, WebP, and AVIF — HEIC is expected to be “converted on the way out” of the iPhone, not transported as-is.
Dropping HEIC into the browser to get JPG out
Open heic-convert and drop anywhere from a single .heic to dozens of them onto the page. Pick the output format from JPEG / PNG / WebP; JPEG and WebP expose a quality slider (0–100). For general sharing 80–90 is the sweet spot between size and quality, and even 75 is rarely distinguishable on a phone screen. As each file is decoded a thumbnail appears, so you can verify the right image is selected before downloading.
After conversion, each row gets a size, a download button, and a delete control. You can pull the converted files individually or as a single ZIP. Before you push the JPEG into a social post or job application, you may want to check whether the EXIF (capture date, GPS, device model) carried over — in this tool’s pipeline it does not, but to be sure feed the output through image-exif-strip, which lists any remaining metadata and removes it. If the receiver complains about size, run the output through image-compress to fit the attachment limit without touching HEIC again.
libheif-js (WebAssembly) decodes HEVC, then Canvas re-encodes
Browsers cannot decode HEIC natively — Chrome and Firefox ship without a HEVC decoder, so the work has to be done in JavaScript or WebAssembly. This tool uses libheif-js, a WebAssembly build of the C++ libheif library that handles both the HEIF container and the HEVC bitstream. Because the decoder is bundled in WASM, conversion works regardless of whether the OS has HEVC hardware support, and after the first load everything runs offline.
The pipeline is: FileReader API loads the HEIC into an ArrayBuffer; libheif-js parses the HEIF container (ISO/IEC 23008-12, an ISOBMFF format that shares its box structure with MP4) and extracts the primary item’s HEVC stream; the HEVC frame is decoded into an RGBA pixel buffer; that buffer is painted onto a <canvas>; canvas.toBlob(type, quality) re-encodes it as JPEG, PNG, or WebP; the resulting Blob is exposed as a downloadable URL. A useful side effect of routing through canvas is that the EXIF from the HEIC (GPS, capture time, device model) does not survive the conversion. If you want to keep that data, archive the original .heic separately. For pure conversion between JPEG, PNG, and WebP that does not touch HEIC at all, image-convert handles those without loading libheif and is consequently lighter.
Online HEIC converters and the order in which they touch your photos
“heic to jpg online” is a huge search category with dozens of free SaaS competitors. Many advertise “files auto-deleted after N hours”, but that does not promise the file was never written to disk, error logs, backups, or CDN edges before deletion. Some terms of use grant the operator a non-exclusive licence to use uploaded content “to improve the service” — and iPhone photos containing faces, locations, and device fingerprints are exactly the kind of training data that has lasting commercial value.
More importantly, HEIC conversion is the last step before the picture leaves the camera roll. If that step happens on a converter SaaS, a full-resolution copy with EXIF reaches that operator before the photo reaches the family member, friend, or employer you intended. The browser version of heic-convert is built only on libheif-js, the Canvas API, and Blob output; the source lives on GitHub. Keep DevTools’ Network tab open with “Preserve log” enabled, run a batch conversion, download the ZIP, and you will see that nothing tied to the image bytes is requested after the initial WASM load. The structural mismatch of “to change the format I hand the operator a full-size copy” stops existing.