Convertir HEIC y HEIF a JPG o PNG con Python
HEIC/HEIF es el formato de imagen de los iPhones modernos. Python puede convertirlo a JPG, PNG y WebP usando pillow-heif o pyheif, facilitando su uso en cualquier sistema.
Instalación
pip install pillow pillow-heif
# En Linux también puede necesitar libheif:
# apt install libheif-dev
Convertir un HEIC a JPG
from PIL import Image
import pillow_heif
# Registrar el soporte HEIF/HEIC en Pillow
pillow_heif.register_heif_opener()
def heic_a_jpg(entrada, salida, calidad=90):
img = Image.open(entrada)
img = img.convert("RGB") # HEIC puede ser RGBA
img.save(salida, "JPEG", quality=calidad)
print(f"Convertido: {entrada} -> {salida}")
heic_a_jpg("foto_iphone.heic", "foto.jpg")
Convertir a PNG (con transparencia)
from PIL import Image
import pillow_heif
pillow_heif.register_heif_opener()
def heic_a_png(entrada, salida):
img = Image.open(entrada)
img.save(salida, "PNG")
print(f"PNG generado: {salida} ({img.width}x{img.height}px)")
heic_a_png("foto.heic", "foto.png")
Preservar Orientación EXIF
from PIL import Image, ImageOps
import pillow_heif
pillow_heif.register_heif_opener()
def heic_a_jpg_exif(entrada, salida, calidad=90):
img = Image.open(entrada)
# Aplicar orientación EXIF automáticamente
img = ImageOps.exif_transpose(img)
img = img.convert("RGB")
img.save(salida, "JPEG", quality=calidad)
print(f"Convertido (orientación corregida): {salida}")
heic_a_jpg_exif("rotada.heic", "correcta.jpg")
Conversión por Lotes de Carpeta
from PIL import Image, ImageOps
import pillow_heif
from pathlib import Path
pillow_heif.register_heif_opener()
def convertir_heic_lote(carpeta, formato="jpg", calidad=90):
src = Path(carpeta)
dst = src / formato
dst.mkdir(exist_ok=True)
heics = list(src.glob("*.heic")) + list(src.glob("*.HEIC")) + list(src.glob("*.heif"))
for i, ruta in enumerate(heics, 1):
try:
img = Image.open(ruta)
img = ImageOps.exif_transpose(img).convert("RGB")
salida = dst / (ruta.stem + "." + formato)
img.save(str(salida), formato.upper(), quality=calidad)
print(f" [{i}/{len(heics)}] {ruta.name} -> {salida.name}")
except Exception as e:
print(f" [{i}] ERROR {ruta.name}: {e}")
print(f"Completado: {len(heics)} archivos en {dst}")
convertir_heic_lote("fotos_iphone/", "jpg", calidad=85)
Obtener Información del HEIC
from PIL import Image
import pillow_heif
from PIL.ExifTags import TAGS
pillow_heif.register_heif_opener()
def info_heic(ruta):
img = Image.open(ruta)
print(f"Tamaño: {img.width}x{img.height}px")
print(f"Modo: {img.mode}")
print(f"Formato: {img.format}")
exif = img._getexif()
if exif:
for tag_id, valor in list(exif.items())[:8]:
tag = TAGS.get(tag_id, tag_id)
print(f" {tag}: {str(valor)[:60]}")
info_heic("foto_iphone.heic")
Convertir HEIC a WebP
from PIL import Image, ImageOps
import pillow_heif
pillow_heif.register_heif_opener()
def heic_a_webp(entrada, salida, calidad=85):
img = Image.open(entrada)
img = ImageOps.exif_transpose(img).convert("RGB")
img.save(salida, "WEBP", quality=calidad)
import os
orig = os.path.getsize(entrada)
dest = os.path.getsize(salida)
print(f"HEIC {orig//1024}KB -> WebP {dest//1024}KB (ahorro {100-dest*100//orig:.0f}%)")
heic_a_webp("foto.heic", "foto.webp")
Recurso Adicional
Para convertir imágenes HEIC a JPG, PNG o WebP sin instalar nada, usa KaijuConverter — gratis y sin registro.