Convert HEIC and HEIF to JPG or PNG with Python
HEIC/HEIF is the image format used by modern iPhones. Python can convert it to JPG, PNG, and WebP using pillow-heif or pyheif, making the files usable on any system.
Installation
pip install pillow pillow-heif
# On Linux you may also need:
# apt install libheif-dev
Convert HEIC to JPG
from PIL import Image
import pillow_heif
# Register HEIF/HEIC support in Pillow
pillow_heif.register_heif_opener()
def heic_to_jpg(input_file, output_file, quality=90):
img = Image.open(input_file)
img = img.convert("RGB") # HEIC may be RGBA
img.save(output_file, "JPEG", quality=quality)
print(f"Converted: {input_file} -> {output_file}")
heic_to_jpg("iphone_photo.heic", "photo.jpg")
Convert to PNG (with Transparency)
from PIL import Image
import pillow_heif
pillow_heif.register_heif_opener()
def heic_to_png(input_file, output_file):
img = Image.open(input_file)
img.save(output_file, "PNG")
print(f"PNG generated: {output_file} ({img.width}x{img.height}px)")
heic_to_png("photo.heic", "photo.png")
Preserve EXIF Orientation
from PIL import Image, ImageOps
import pillow_heif
pillow_heif.register_heif_opener()
def heic_to_jpg_exif(input_file, output_file, quality=90):
img = Image.open(input_file)
img = ImageOps.exif_transpose(img) # Fix rotation
img = img.convert("RGB")
img.save(output_file, "JPEG", quality=quality)
print(f"Converted (orientation fixed): {output_file}")
heic_to_jpg_exif("rotated.heic", "correct.jpg")
Batch Convert Entire Folder
from PIL import Image, ImageOps
import pillow_heif
from pathlib import Path
pillow_heif.register_heif_opener()
def batch_convert_heic(folder, output_fmt="jpg", quality=90):
src = Path(folder)
dst = src / output_fmt
dst.mkdir(exist_ok=True)
heics = list(src.glob("*.heic")) + list(src.glob("*.HEIC")) + list(src.glob("*.heif"))
for i, path in enumerate(heics, 1):
try:
img = Image.open(path)
img = ImageOps.exif_transpose(img).convert("RGB")
out = dst / (path.stem + "." + output_fmt)
img.save(str(out), output_fmt.upper(), quality=quality)
print(f" [{i}/{len(heics)}] {path.name} -> {out.name}")
except Exception as e:
print(f" [{i}] ERROR {path.name}: {e}")
print(f"Done: {len(heics)} files in {dst}")
batch_convert_heic("iphone_photos/", "jpg", quality=85)
Read HEIC Metadata
from PIL import Image
import pillow_heif
from PIL.ExifTags import TAGS
pillow_heif.register_heif_opener()
def heic_info(path):
img = Image.open(path)
print(f"Size: {img.width}x{img.height}px")
print(f"Mode: {img.mode}")
print(f"Format: {img.format}")
exif = img._getexif()
if exif:
for tag_id, value in list(exif.items())[:8]:
tag = TAGS.get(tag_id, tag_id)
print(f" {tag}: {str(value)[:60]}")
heic_info("iphone_photo.heic")
Convert HEIC to WebP
from PIL import Image, ImageOps
import pillow_heif, os
pillow_heif.register_heif_opener()
def heic_to_webp(input_file, output_file, quality=85):
img = Image.open(input_file)
img = ImageOps.exif_transpose(img).convert("RGB")
img.save(output_file, "WEBP", quality=quality)
orig = os.path.getsize(input_file)
dest = os.path.getsize(output_file)
print(f"HEIC {orig//1024}KB -> WebP {dest//1024}KB (saved {100-dest*100//orig:.0f}%)")
heic_to_webp("photo.heic", "photo.webp")
Additional Resource
For converting HEIC images to JPG, PNG or WebP without any coding, use KaijuConverter — free and no registration required.