Repository HEIC fixture
- Input
- 963 byte ISO Media HEIF still from apps/web/tests/fixtures/formats/sample.heic.
- Output
- 2,137 byte PNG at 64×48 in RGB mode. The output was simple to inspect with our image engine and contained no HEIC container tracks.
HEIC to PNG turns an iPhone-style HEIF still into a lossless PNG of the decoded image, not a container for HEIC depth or motion data.
From real runs
| Element | Result | What happens |
|---|---|---|
| Decoded image size | Kept | The 963 byte HEIC fixture decoded to a 64×48 RGB PNG that measured 2,137 bytes in the API output. |
| Compression | Changed | HEVC picture compression is replaced by PNG filtering, which can make even a tiny photo fixture larger. |
| Orientation | Changed | Our image engine applies EXIF transpose during read, so rotation is baked into the PNG pixels rather than left as a viewer instruction. |
| 10-bit HEIC values | Changed | The tested output was 8-bit RGB PNG; HEIC HDR or 10-bit camera data should not be treated as preserved grading data. |
| Live Photo motion | Lost | Only the still HEIC image is submitted to the converter, so the paired MOV from a Live Photo has no place in the PNG. |
| Color profile metadata | Changed | The PNG writer emitted plain RGB pixels in our run; keep the HEIC original when embedded profile metadata is required. |
The 963 byte HEIC fixture decoded to a 64×48 RGB PNG that measured 2,137 bytes in the API output.
HEVC picture compression is replaced by PNG filtering, which can make even a tiny photo fixture larger.
Our image engine applies EXIF transpose during read, so rotation is baked into the PNG pixels rather than left as a viewer instruction.
The tested output was 8-bit RGB PNG; HEIC HDR or 10-bit camera data should not be treated as preserved grading data.
Only the still HEIC image is submitted to the converter, so the paired MOV from a Live Photo has no place in the PNG.
The PNG writer emitted plain RGB pixels in our run; keep the HEIC original when embedded profile metadata is required.
We converted our HEIC/HEIF sample (49 KB) with Image engine on 2026-10-20. It took 255 ms and produced a 39 KB PNG file, 21% smaller than the input. The engine raised 1 warning, listed below.
Input · sample.heic · 49 KB
1200 × 800 px, heic
Output · sample.png · 39 KB
1200 × 800 px, 8-bit, colour type 6
If the HEIC is a photo of a receipt or page, HEIC to PNG only changes the image container. Use Deep Read workflows when the visible words need extraction.
Pillow 11 with pillow-heif
from PIL import Image, ImageOps
import pillow_heif
pillow_heif.register_heif_opener()
im = ImageOps.exif_transpose(Image.open("photo.heic"))
im.save("photo.png", optimize=True)This writes the decoded still image; it does not export a Live Photo movie or HEIC depth sidecar.
The HTTP API and the MCP server run the exact engine this page uses (Image engine); the response carries the same warnings the web converter shows. Check support first with GET /api/v1/pairs?from=heic&to=png.
curl -X POST https://filetypeconverters.com/api/v1/convert \
-H "Authorization: Bearer $FTC_API_KEY" \
-F "file=@input.heic" -F "from=heic" -F "to=png" \
-F 'options={"width":0}' \
--output output.png| Key | Applies to | Type | Default |
|---|---|---|---|
| width | Writing PNG | number | 0 |
| height | Writing PNG | number | 0 |
| fit | Writing PNG | contain · cover · fill | contain |
| quality | Writing PNG | number | 90 |
| background | Writing PNG | string | #ffffff |
| stripMetadata | Writing PNG | boolean | true |
HEIC uses efficient HEVC compression. PNG stores the decoded pixels losslessly, so our 963 byte HEIC fixture grew to 2,137 bytes.
No. The API receives one HEIC still image. The separate Live Photo movie is not embedded in a PNG output.
The reader applies EXIF transpose before saving. That means the PNG pixels are already rotated for normal viewing.