Convert HEIC to WebP
WebP is what a web page wants: a HEIC-sized file that every current browser draws. The default here is 82% — the setting where a 12 MP photo still looks clean at full size.
🔒 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
Is WebP smaller than the original HEIC?
Usually not — and the row tells you, because the percentage is signed. HEIC already uses a video codec; WebP at 82% often lands within a few percent of it, sometimes slightly above. The gain is not size, it is that a browser will render it: Chrome, Safari, Firefox and Edge all draw WebP, and older WordPress plugins still refuse HEIC.
Which is better for my shop, JPG or WebP?
WebP for the pages you control, JPG for anywhere you upload a file into somebody else’s form: marketplaces, email attachments, government portals and print shops still expect JPEG. That is why both live on this site rather than one “best format” button.
Does WebP keep the transparency?
Yes — WebP has an alpha channel, so a HEIC sticker stays transparent here, unlike the JPEG page where you have to pick a background colour. The row says so when the source file had alpha.