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.

Diese Anleitung nutzt das kostenlose HEIC zu JPG stapelweise konvertieren – es läuft komplett in Ihrem Browser.Tool öffnen

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.

Bereit zum Ausprobieren?

Kostenlos und unbegrenzt. Keine Uploads, keine Anmeldung – Ihre Dateien verlassen Ihr Gerät nicht.

HEIC zu JPG stapelweise konvertieren öffnen

Mehr Blog-Posts zum Lesen