Tiefenblick

Was ist HEIC? Ein technischer Deep Dive in Dateisignaturen, Erkennung und Konvertierung

koboshiCo-founder
·5 min Lesezeit
Was ist HEIC? Ein technischer Deep Dive in Dateisignaturen, Erkennung und Konvertierung
Zusammenfassung

HEIC ist nicht nur eine kleinere JPEG-Datei. Es ist ein Container-Format basierend auf ISO Base Media File Format mit HEVC-kodierten Bildern im Inneren. Hier erfährst du, wie es funktioniert, wie man es durch das Lesen roher Bytes erkennt und wie man es konvertiert, wenn die Kompatibilität versagt.

Eine HEIC-Datei in einem Hex-Editor öffnen. Die ersten zwölf Bytes:

00 00 00 18 66 74 79 70 68 65 69 63

Das ist ISOBMFF — der gleiche Container-Standard, den MP4 verwendet. 0x18 (24 Bytes) ist die Box-Größe, ftyp ist der Dateityp-Box, heic ist der Major Brand. Eine HEIC-Datei ist keine Bildkodierung. Es ist ein Container mit einem Brand-Marker, der HEVC-kodierte Bilder enthält.

Was HEIC eigentlich ist

HEIC = High Efficiency Image Container. Apples gebrandete Implementierung von HEIF, 2015 von MPEG als ISO/IEC 23008-12 standardisiert. JPEG ist sowohl ein Komprimierungsalgorithmus als auch ein Dateiformat. HEIC ist nur ein Container. Die Komprimierung im Inneren ist HEVC (H.265), der gleiche Codec, der für 4K-Video verwendet wird.

Eine einzelne HEIC-Datei kann speichern:

  • Ein primäres Bild
  • Mehrere alternative Bilder (Serienaufnahmen)
  • Bildsequenzen (Live Photos: Standbild + 3-Sekunden-Video)
  • Alpha-Kanäle und Tiefenkarten
  • 16-Bit-Farbtiefe pro Kanal (JPEG ist auf 8-Bit beschränkt)

Der Container verwendet Boxen — dieselbe Struktur wie MP4:

BoxZweck
ftypDateityp und kompatible Brands
metaElement-Metadaten und Eigenschaften
mdatRohkodierte Bilddaten (HEVC-Bitstream)
ilocElement-Positionen innerhalb von mdat

Diese Erweiterbarkeit ermöglicht HEIC Dinge, die JPEG nie konnte. Das Parsen erfordert das Verständnis der Box-Hierarchie, nicht nur das Lesen eines rohen Bitstreams.

Warum Apple gewechselt hat

Apple hat HEIC nicht erfunden. MPEG veröffentlichte HEIF 2015. Apple übernahm es als iPhone-Standard in iOS 11 (2017).

Der Wechsel war Arithmetik, nicht Marketing. Ein typisches iPhone-12-MP-Foto in JPEG ist ~3,5 MB. In HEIC, ~1,8 MB. Bei 50 GB kostenlosem iCloud-Speicher bedeutet diese Lücke ungefähr 14.000 zusätzliche Fotos. Apple verkauft Speichertarife. Die Rechnung schreibt sich von selbst.

Es gab auch die Ökosystem-Ausrichtung. Apple hatte HEVC bereits für Video übernommen (H.265 in iOS 11). Denselben Codec für Standbilder wiederzuverwenden bedeutete geteilte Hardware-Decode-Blöcke auf A-Series-Chips, geringeren Stromverbrauch und einen einzigen Lizenzierungspfad.

Die Vor- und Nachteile

HEIC ist in fast jeder Metrik JPEG überlegen, mit einer Ausnahme: Kompatibilität.

AspektHEICJPEG
Komprimierungseffizienz~40–50% kleiner bei gleicher QualitätBaseline
FarbtiefeBis zu 16-Bit8-Bit
TransparenzJaNein
Mehrere Bilder pro DateiJaNein
Verlustfreie NachbearbeitungJaNein
Native Windows-UnterstützungErfordert HEIF-ErweiterungUniversell
Webbrowser-UnterstützungNur SafariUniversell
Android-UnterstützungNativ ab 9+Universell
PatentlizenzierungHEVC-PatentpoolJPEG ist lizenzgebührenfrei

HEVC liegt unter mehreren Patentpools (MPEG LA, Access Advance). Apple übernimmt die Gebühren für iOS-Benutzer. Drittanbieter haben diesen Vorteil nicht. Diese Unsicherheit ist ein Großteil des Grundes, warum die Übernahme außerhalb des Apple-Ökosystems stagnierte.

HEIC durch Lesen der Dateisignatur erkennen

Vertraue nicht der .heic-Erweiterung. Lies die ersten 32 Bytes und parse die ftyp-Box.

Exaktes Byte-Layout eines gültigen HEIC-Headers:

Bytes 0–3:   Box-Größe (Big-Endian uint32)
Bytes 4–7:   Box-Typ: "ftyp" (0x66 0x74 0x79 0x70)
Bytes 8–11:  Major Brand: "heic" oder "heif" oder "mif1"
Bytes 12–15: Minor-Version (normalerweise 0x00000000)
Bytes 16+:   Liste kompatibler Brands (z.B. "mif1", "heic", "MiHE")

TypeScript im Browser:

async function isHeic(file: File): Promise<boolean> {
  const buffer = await file.slice(0, 32).arrayBuffer()
  const bytes = new Uint8Array(buffer)

  if (String.fromCharCode(...bytes.slice(4, 8)) !== "ftyp") return false

  const brand = String.fromCharCode(...bytes.slice(8, 12))
  return ["heic", "heif", "mif1", "msf1"].includes(brand)
}

Unser Konverter führt diese Prüfung vor dem Decodierversuch durch. Falscher Brand = sofortige Ablehnung, keine verschwendete CPU.

Python

def is_heic(path: str) -> bool:
    with open(path, "rb") as f:
        header = f.read(32)

    if len(header) < 12:
        return False

    if header[4:8].decode("ascii", errors="ignore") != "ftyp":
        return False

    return header[8:12].decode("ascii", errors="ignore") in {"heic", "heif", "mif1", "msf1"}

Höherwertige Prüfung mit filetype:

import filetype

kind = filetype.guess("photo.heic")
if kind and kind.extension in ("heic", "heif"):
    print(kind.mime)  # image/heic

Oder pillow-heif:

from pillow_heif import is_heif

if is_heif("photo.heic"):
    # gültiger Container
    pass

Go

func isHeic(path string) bool {
	f, err := os.Open(path)
	if err != nil {
		return false
	}
	defer f.Close()

	buf := make([]byte, 32)
	if _, err := f.Read(buf); err != nil {
		return false
	}

	if string(buf[4:8]) != "ftyp" {
		return false
	}

	brand := string(buf[8:12])
	return brand == "heic" || brand == "heif" || brand == "mif1" || brand == "msf1"
}

PHP

function isHeic(string $path): bool {
    $header = file_get_contents($path, false, null, 0, 32);
    if (strlen($header) < 12) return false;
    if (substr($header, 4, 4) !== 'ftyp') return false;

    return in_array(substr($header, 8, 4), ['heic', 'heif', 'mif1', 'msf1'], true);
}

Mit fileinfo:

$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file('photo.heic');
// image/heic oder image/heif

ImageMagick CLI

ImageMagick 7+ unterstützt HEIC, wenn mit libheif kompiliert:

magick identify -verbose photo.heic | grep "Format:"
# Format: HEIC (High Efficiency Image Container)

Ohne libheif: no decode delegate for this image format. Auf den meisten Linux-Distributionen bietet libheif-examples heif-convert als Alternative.

Der Konvertierungspfad

Zu wissen, dass eine Datei HEIC ist, öffnet sie nicht. Windows benötigt die HEIF Image Extensions. Die meisten Browser verweigern die HEIC-Darstellung in <img>-Tags. Android 9+ behandelt es nativ; ältere Geräte nicht.

Die Lösung: Konvertieren. Unser HEIC-zu-JPG-Konverter behandelt die gesamte Pipeline im Browser:

  1. Dateien ablegen — einzelne Fotos oder ganze Ordner, Batch-Verarbeitung automatisch.
  2. Signaturvalidierung — der exakte Byte-Check oben läuft auf jeder Datei. Nicht-HEIC-Dateien werden sofort mit einer klaren Fehlermeldung abgelehnt.
  3. Client-seitige Dekodierung — ein WebAssembly-Build von libheif läuft lokal. Kein Upload. Kein Server.
  4. Qualitätserhaltende Ausgabe — JPG bei 90% Qualität behält Originalauflösung und Farbgenauigkeit.
  5. Batch-Download — einzelne Dateien oder ein einzelnes ZIP-Archiv.

Für verlustfreie Ausgabe mit Transparenz: HEIC-zu-PNG. Für weboptimierte Größen: HEIC-zu-WebP.

Deine Dateien verlassen niemals dein Gerät. Darum geht es.

Mehr Blog-Posts zum Lesen