Convert HEIC to PNG
PNG is the lossless option — every pixel from the HEIC survives, including an alpha channel if the photo has one. The price is a bigger file, shown on each row.
🔒 100% client-side · zero server upload
The first conversion downloads a 700 KB HEIC decoder (libheif, LGPL-3.0). It is fetched only when you press the button, and your browser caches it afterwards.
Results
No demo file here on purpose: a sample HEIC would mean putting a stranger’s photo in the page. Use one of your own — it is decoded in this tab and never sent anywhere.
Decoding runs in this browser tab. Your photos are never uploaded.
Decoding uses libheif 1.23.5, unmodified, under LGPL-3.0. Source: github.com/catdad-experiments/libheif-js.
Malaysian rules & edge cases
Why HEIC needs its own page
Every other tool here is a few kilobytes of JavaScript. A HEIC decoder is not: the file format wraps HEVC video frames, and browsers refuse to open it unless Safari made the file. So this page ships the one thing the rest of the site avoids — a 700 KB WebAssembly decoder — and pays for it honestly:
| What | This page |
|---|---|
| Decoder download | 700 KB gzip, on the first conversion, cached by the browser afterwards. It is not part of the page load. |
| Where decoding runs | In this tab, on your own CPU. No photo, filename or byte ever leaves the device. |
| Library | libheif 1.23.5, unmodified, LGPL-3.0 — source at github.com/catdad-experiments/libheif-js. Relinking is not required: the library is used as published, and the source offer is this notice. |
| HEVC patents | Decoding is licensed by the codec inside the library; this site ships no encoder, so it never creates HEVC content. |
| Accepted input | heic, heix, hevc and the generic mif1/msf1 brands. AVIF shares the container but needs an AV1 decoder this build does not carry — it is refused by name, not by a crash. |
| Size limit | 20 megapixels. A 48 MP "HEIF Max" photo needs about 390 MB of pixel buffers in one tab and would be killed mid-decode; the row says so instead. |
| One file, many images | A HEIC burst or a Live Photo still holds several images. Each becomes its own result row and its own file — nothing is silently dropped. |
What it does not do. It does not write HEIC back: encoding HEVC is a patent-licensed product, and no browser can do it. It does not read HEIC from iCloud links or zip archives, and it does not upscale — a 12 MP photo comes out 12 MP.
Before and after
Before
IMG_4821.HEIC · 2.4 MB · 4032×3024 · HEVC from an iPhone 15 · refused by the Shopee upload form, refused by Outlook, invisible in Word After
IMG_4821.jpg · 0.9 MB · 4032×3024 · same photo, opens in every form, chat and print shop How it works
- Drop the HEIC photos — or tap Choose photos — and the first conversion fetches the 700 KB decoder.
- Pick JPEG for forms and chat, PNG for lossless, WebP for a website; the row shows the real bytes either way.
- Download one photo, or all of them as a single ZIP, and check the signed percentage before you upload.
FAQ
Why is the PNG five times bigger than the HEIC?
Because HEIC is a video codec and PNG is not: HEVC stores one 12 MP photo in about 2 MB by predicting pixels, while PNG stores every pixel independently and compresses only the repetition. For editing that is exactly what you want — nothing was thrown away — but do not upload a PNG to Shopee when a JPG would do.
Does PNG keep the transparency of a HEIC sticker?
Yes, when the HEIC has an alpha channel: the decoder reports it, the PNG writer keeps it, and the row says “this HEIC has an alpha channel”. JPEG cannot — that is why the JPEG page asks you for a background colour and this one does not.
Is the result really lossless compared with the original?
Lossless from the decoder’s output, not from the camera sensor: the HEIC was already compressed by the phone, so PNG preserves what that file contains rather than inventing detail back. If you need the sensor original, export a DNG or a ProRAW from Photos instead.