Guide
How to convert HEIC to JPG without uploading the photo
iPhone has saved stills as HEIC by default since iOS 11. The file is smaller than a same-resolution JPEG, which is why the Camera roll fills more slowly. The cost shows up the moment you leave Apple’s stack: WhatsApp on some desktops, Windows Explorer without the HEVC extension, older CMS uploaders, and printers that only list JPG/PNG will refuse the file or show a blank thumbnail.
Cloud converters solve that by taking the bytes. That is the wrong trade if the roll has faces, documents, or anything you would not post publicly. HEIC Local decodes in this tab. After the page and decoder load, the Network panel should stay quiet while frames are written to JPG or PNG.
What HEIC actually is
HEIC is a container. The still inside is usually HEVC (H.265). That is why a Windows PC without the HEVC Video Extensions package cannot preview the file, and why a random “rename to .jpg” trick does nothing useful — the bitstream is not JPEG. A real conversion decodes HEVC to pixels, then encodes JPEG or PNG.
Live Photo is a still plus a short video. This tool converts the still. It does not export the motion pair as a separate MOV. If you needed the motion, keep the original in Photos and export the still here only for sharing.
Steps
- Open this site on the same device that holds the HEIC files. AirDrop or a cable is fine; the conversion still happens locally after the files are on the device.
- Use the picker or drop a batch. Soft guards: about 40 MB per photo, 50 files, 200 MB per batch. Those caps exist so a phone tab does not die mid-decode. They are not a paid quota.
- Pick JPG when the next app wants a photo that “just opens.” Default quality is 90. Raise it if you will edit again; lower it for email. Pick PNG when you need lossless pixels of the decoded frame (screenshots, graphics with type, or a next step that hates JPEG blocking).
- Wait until the thumbnail looks right. If Safari can decode HEIC natively it will. If not, a WebAssembly decoder runs on-device. Either path stays in the tab.
- Download one file or a ZIP of the batch. Nothing is branded into the pixels.
Windows and WhatsApp
On Windows 10/11 a HEIC file often shows a blank icon until you install Microsoft’s HEVC extension. Even then, some chat apps still reject the container. Convert to JPG here, then attach the JPG. Longer notes: HEIC on Windows.
WhatsApp on iPhone may recompress on send. If the receiver on desktop sees “unsupported,” send the JPG from this tool instead of the original HEIC. Longer notes: HEIC in WhatsApp.
If conversion fails
- File is a burst or a multi-image HEIF sequence this build does not flatten — export the key still from Photos first.
- File is larger than the per-photo guard. Split the batch or use a computer with more RAM.
- Tab was backgrounded on iOS and Safari discarded the decoder. Keep the tab visible until download starts.
- The file is not a still (plain HEVC video renamed to .heic). This page is for photos.
- Display P3 wide-gamut shots can look slightly different after JPEG encode into sRGB. That is the JPEG path, not a server filter.
What happens when you close the tab
Decoded pixels live in memory for this session. Closing the tab drops them. We do not keep a gallery, and we do not have your originals on a disk we control. If you need the JPG tomorrow, download it now.
Compared with Photos.app and upload sites
Photos on Mac can export JPEG. That helps if you already sit at the Mac with iCloud Photos downloaded. It does not help a Windows colleague, and it does not help when you do not want the original in a third-party web form. Upload sites also keep a copy long enough to decode on their GPU. This page never takes that copy.
Native decode versus WASM in this tab
The first successful decode on a given file usually goes through the browser’s own createImageBitmap. Safari on current iOS often knows HEIC natively; the tab never needs a second library for that still. When native decode throws — older Chrome on Windows, Firefox, a HEIF flavour the OS skipped — the page loads heic-to and runs a WebAssembly decoder in the same origin. Both paths write pixels to a canvas in this process. Neither path POSTs the File to our server. If you watch the Network panel after the page and the decoder chunk have loaded, conversion traffic should stay local. A spinner that lasts minutes on a 12 MP still is memory and CPU, not an upload bar.
Concurrency is 1 on iPhone and Android so one 12 MP frame does not fight another for RAM. A desktop may run 2. That is why a 40-file batch feels slower on a phone than on a laptop, and why backgrounding Safari mid-batch is how people lose the decoder. Keep the tab visible until the ZIP or the single JPEG appears in the share sheet. A renamed .mp4 is not a still; the converter refuses it so a video does not sit in memory as a fake photo. Burst or multi-image HEIF may need the key still exported from Photos first — that is a Photos export, not a second trip to our origin.
JPEG quality 90 is a default for sharing, not a watermark and not a daily cap. PNG is the lossless dump of the decoded frame when the next tool hates JPEG blocking. Neither encoder writes a brand into the pixels. Closing the tab drops the bitmap. If you need the JPG tomorrow, download it now — we do not keep a gallery.
First visit still needs the network: HTML, CSS, and the decoder chunk. After those land, turning the radio off does not upload a photo, because there is nothing to upload. Reloading a cold tab offline may lose the decoder script — that is the script, not custody of your roll. Wide-gamut Display P3 shots can shift slightly when JPEG lands in sRGB. That is the JPEG path, not a server filter, and not a reason to email the original.