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:
| Box | Zweck |
|---|---|
ftyp | Dateityp und kompatible Brands |
meta | Element-Metadaten und Eigenschaften |
mdat | Rohkodierte Bilddaten (HEVC-Bitstream) |
iloc | Element-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.
| Aspekt | HEIC | JPEG |
|---|---|---|
| Komprimierungseffizienz | ~40–50% kleiner bei gleicher Qualität | Baseline |
| Farbtiefe | Bis zu 16-Bit | 8-Bit |
| Transparenz | Ja | Nein |
| Mehrere Bilder pro Datei | Ja | Nein |
| Verlustfreie Nachbearbeitung | Ja | Nein |
| Native Windows-Unterstützung | Erfordert HEIF-Erweiterung | Universell |
| Webbrowser-Unterstützung | Nur Safari | Universell |
| Android-Unterstützung | Nativ ab 9+ | Universell |
| Patentlizenzierung | HEVC-Patentpool | JPEG 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:
- Dateien ablegen — einzelne Fotos oder ganze Ordner, Batch-Verarbeitung automatisch.
- Signaturvalidierung — der exakte Byte-Check oben läuft auf jeder Datei. Nicht-HEIC-Dateien werden sofort mit einer klaren Fehlermeldung abgelehnt.
- Client-seitige Dekodierung — ein WebAssembly-Build von libheif läuft lokal. Kein Upload. Kein Server.
- Qualitätserhaltende Ausgabe — JPG bei 90% Qualität behält Originalauflösung und Farbgenauigkeit.
- 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.


