If you’ve ever needed to upload an iPhone photo to a website that rejected it, this is the tool. iOS HEIC photos are great on the device — half the size of JPEG at the same quality — but most websites and forms only accept JPG or PNG. This tool converts in your browser via libheif WASM (no upload, no server).
How decoding works
libheif is the reference HEIC/HEIF decoder, written in C++ and compiled to WebAssembly. heic2any wraps it with a friendlier API for the browser: pass a Blob, get back a JPG or PNG Blob. Decoding runs on the main thread (or a worker, depending on browser implementation) — entirely client-side, no network request after the initial library download.
The library is dynamic-imported on first interaction so it doesn’t bloat the initial page load. After the first conversion, the library is cached in the JS module registry for the rest of your session.
Example: converting an iPhone burst
A 5-photo burst from an iPhone produces 5 HEIC files, ~2 MB each. Drop them all on the tool, JPG at 92%, click. Five JPGs at ~1.8 MB each (or smaller — HEIC’s compression is excellent so the JPG output at quality-equivalent settings is often slightly bigger). Download each, attach to wherever you needed JPGs.
Example: single HEIC for a job application
A single iPhone photo (IMG_1234.HEIC, 1.8 MB). Drop, convert to JPG at 92%. Output: IMG_1234.jpg at ~1.6 MB. Upload to the form. Done.
When this tool isn’t the right answer
- You have HEIC sequences with multiple frames you need separately. heic2any extracts the first frame by default. For all frames, you’d need a script that calls the underlying API with
multiple: true. - You need EXIF preserved. Browser image-encoding paths strip most metadata. Use a desktop tool with explicit EXIF support.
- You have hundreds of files. Browser memory is finite — converting 50+ HEICs in one batch may slow down or crash the tab. Use a desktop CLI (
heif-convertfrom libheif-tools, sips on macOS, ImageMagick) for bulk workflows.
Common mistakes
Trying to convert non-HEIC files. The tool detects HEIC by MIME type (image/heic, image/heif) or filename extension (.heic, .heif). Anything else gets flagged as ‘not HEIC’ and skipped. If you have JPGs or PNGs that need format conversion or compression, see the format converter / compressor.
Picking PNG by default. PNG is lossless and produces 3-5× bigger files than JPG for photographic content. Pick JPG unless you specifically need lossless output.
Expecting metadata to round-trip. Browser image encoders drop most metadata. If location data or capture timestamps matter, use a desktop tool.
Waiting for the first conversion to be instant. It won’t be — the libheif WASM bundle takes ~1 second to download on a typical connection. Subsequent conversions are milliseconds.
Cross-checking sizes between iPhone, macOS, and Windows. A 1.8 MB photo on macOS shows as ~1.72 MB on Windows because macOS uses decimal MB and Windows uses binary “MB” under the same label. The MB-vs-MiB converter translates between the two.
What this tool does not do
It doesn’t upload anywhere. All decoding happens in your browser via libheif WASM.
It doesn’t convert non-HEIC formats. For JPEG ↔ PNG ↔ WebP ↔ AVIF, see the image format converter.
It doesn’t preserve full EXIF. Browser-side image encoding strips metadata. Desktop tools have better EXIF support.
It doesn’t batch-zip the output. One download per file — HEIC bursts are usually small enough that per-file download is simpler than zip handling.
It doesn’t handle Live Photo motion. The video portion lives in a separate MOV file that has to be processed with a video tool. After converting to JPEG, the image compressor and image resizer can further shrink the output before publishing.