Why iPhone Photos Won't Open in Your Browser
You've probably double-clicked a photo taken with an iPhone in a folder on your laptop and gotten nothing but a gray placeholder icon, or a message saying "unsupported format." It's the same kind of photo as a JPG, so why does this happen — and how can a web browser open it without ever sending the file to a server? Here's the mechanism behind both.
1. HEIC Isn't Really an Image Codec — It's Repurposed Video Compression
HEIC (High Efficiency Image Container) has been the default photo format on Apple devices since iOS 11. The key point is that it isn't a new compression algorithm built for still images at all — it takes the intra-frame (keyframe) compression technique from the HEVC (H.265) video codec and applies it directly to a single still image. Video codecs use far more sophisticated compression than still-image codecs, which is why HEIC files end up 40–50% smaller than JPG at equivalent quality.
2. Why Chrome and Firefox Don't Support It Out of the Box
The problem is that HEVC is a patented codec registered with standards bodies like MPEG-LA. Building the codec into a browser requires paying license royalties, and open-source browsers like Chrome and Firefox don't accept that cost structure, so they don't ship an HEVC decoder by default. Apple, on the other hand, only guarantees trouble-free HEIC support within its own ecosystem — macOS and iOS, where it has already paid the licensing fees. The result is an asymmetry: the exact same photo opens fine on an iPhone or Mac, but won't open in Chrome on Windows or in an Android gallery app.
3. How This Tool Works Around That Patented Codec
The HEIC to JPG Converter doesn't rely on the browser's built-in decoder at all — instead, it loads a JavaScript library called heic2any from a CDN (jsdelivr). That library bundles libheif, an open-source HEVC/HEIF decoder, compiled to WebAssembly (WASM), so it can parse the HEIC bitstream in software directly on top of the JavaScript engine, even when the browser itself has no idea what the codec is. The decoded pixel data is rendered onto a <canvas> and then re-encoded into whichever format you want (JPG, PNG, or WebP). Because the entire process runs inside the browser's own memory, it comes with a side benefit: the original photo is never sent to a server.
4. When One File Holds Multiple Images — Live Photos and Burst Shots
True to its name, the HEIC container can hold multiple images inside a single file, so a HEIC can sometimes carry burst-shot frames or depth-map data alongside the main photo. This tool only converts the primary image (the main frame) out of whatever's in there. Worth noting: an iPhone Live Photo is actually stored as a paired set of two separate files — a still image (HEIC) and a short video (.mov) — so the video portion is entirely outside this converter's scope.
5. How to Stop Running Into This Altogether
Instead of converting every photo one by one, you can go to iPhone Settings → Camera → Formats and choose "Most Compatible" so that future photos save directly as JPG. Keep in mind the files will be larger than HEIC, and this setting has no effect on photos you've already taken — those stay in HEIC and still need to be converted separately.
Frequently Asked Questions
Q. Is there really no way to view HEIC on Windows?
A. You can install "HEVC Video Extensions" from the Microsoft Store to get thumbnails in File Explorer. It's a paid add-on, though — if you just want to view or convert a file right in the browser, a tool that decodes directly like this one is simpler.
Q. Does converting lower the image quality?
A. JPG and WebP output are lossy, so there can be some quality loss depending on the quality slider setting. PNG output is lossless and preserves the original pixels exactly, but it produces the largest file.
Q. Can I convert multiple files at once?
A. Yes. Select or drag-and-drop multiple HEIC files and they'll all convert simultaneously, each showing up as its own entry in the results list.
Q. Are files uploaded to a server?
A. No. The libheif WASM module does all decoding and re-encoding inside your browser's memory, so no file is ever sent over the network.