PicScrub logoPicScrub
Formatlara dön

HEIC formatı

High Efficiency Image Container

ISOBMFF kapsayıcısı

Daha önce MP4 video dosyalarıyla uğraştıysan HEIC sana tanıdık gelecek. Apple, HEIC için kapsayıcı olarak ISO Base Media File Format'ı (ISOBMFF) seçti. Yani HEIC, JPEG ya da PNG gibi geleneksel görsel formatlarından çok video formatlarıyla aynı genleri taşıyor.

Format, dört karakterlik tür kodları olan iç içe "kutu"lardan (bunlara atom da deniyor) oluşuyor. Şaşırtıcı derecede zarif bir tasarım: karmaşık veri hiyerarşilerine izin veriyor ama temelini kavradıktan sonra çözümlemesi de görece kolay.

HEIC dosya yapısı

ftyp
meta
mdat
ftyp
24 bayt
Dosya türü ve markalar
meta
1000 bayt
Meta veri kabı
mdat
Değişken uzunluk
Medya verisi (HEVC)

HEIC başlığı (ftyp kutusu)

Kutu boyutu (24)
Kutu türü (ftyp)
Ana marka (heic)
Alt sürüm
Uyumlu (mif1)
Uyumlu (heic)
OffsetHexASCII
0000
000000186674797068656963
....ftypheic
000C
000000006D69663168656963
....mif1heic

Kutu yapısı

BoyutTürVeri
4 bayt (BE)4 baytBoyut - 8

Boyut = 1 ise türden sonra 8 baytlık genişletilmiş bir boyut gelir. Boyut = 0 ise kutu dosyanın sonuna kadar uzanır.

Önemli kutular

HEIC dosyalarındaki kutu hiyerarşisi epey derinleşebiliyor. Meta verinin tahmin edilebilir offset'lerde durduğu JPEG'in aksine HEIC, meta verisini iç içe geçmiş yapının birkaç kat altına gömüyor. Ana parçalar şöyle bir araya geliyor.

ftyp:Dosya türü

Dosyadaki ilk kutu. Ana markayı ve uyumlu markaları içerir. Formatın tanınması için zorunludur.

Uyumlu markalar: heic heix hevc hevx heim heis hevm hevs mif1 msf1

meta:Meta veri kabı

Öğe konumları, özellikleri ve ilişkilendirmeleri dahil bütün meta verileri içerir. EXIF/XMP verileri de burada durur.

meta (meta veri kabı)
├── hdlr  (işleyici referansı)
├── pitm  (birincil öğe kimliği)
├── iloc  (öğe konumları → mdat içindeki offset'ler)
│   └── [item_id, offset, length] girdileri
├── iinf  (öğe bilgisi → 'Exif' öğesini bulmak için)
│   └── öğe türlerini taşıyan infe girdileri
├── iprp  (öğe özellikleri)
│   ├── ipco (özellik kabı)
│   │   ├── hvcC  (HEVC çözücü ayarları)
│   │   ├── ispe  (görsel boyutları)
│   │   ├── colr  (ICC profili, offset+12)
│   │   ├── Exif  (TIFF biçiminde EXIF)
│   │   └── pixi  (piksel bilgisi)
│   └── ipma (özellik ilişkilendirmeleri)
└── iref  (öğe referansları)

mdat:Medya verisi

HEVC ile kodlanmış asıl görsel verisini içerir. meta içindeki iloc kutusu, mdat içindeki offset'leri verir.

HEIC dosyalarında meta veri

JPEG'in APP işaretleyicilerine alışkınsan, HEIC bambaşka bir yol izliyor. Dosyanın başında sıralanan işaretleyiciler yerine meta veri, meta kutusunun içinde "öğe özellikleri" olarak duruyor. EXIF verisinin kendisi hâlâ tanıdık TIFF biçiminde ama ona ulaşmak için önce kutu hiyerarşisinde gezinmen gerekiyor.

EXIF özelliği

ipco (öğe özellik kabı) içinde "Exif" türüyle saklanır. JPEG'dekiyle aynı, standart TIFF biçimindeki EXIF verisini içerir.

XMP özelliği

"mime" türünde bir özellik olarak, "application/rdf+xml" içerik tipiyle saklanan XML tabanlı meta veri.

ICC profili

"prof" türünde bir "colr" kutusunda saklanan renk profili.

Offset'ler neden önemli

iloc kutusu, mdat içine işaret eden hassas bayt offset'leri taşır. Herhangi bir kutunun boyutu değişirse (örneğin meta veri silindiğinde) bu offset'lerin yeniden hesaplanması gerekir, yoksa dosya okunamaz hâle gelir.

Kayıpsız anonimleştirme

HEIC'in zorlaştığı yer burası. Format, meta verilerle kolayca oynanabilsin diye değil, video ve görsellerin verimli saklanması için tasarlandı.

Zorluk nerede

HEIC'in offset tabanlı yapısı bayt silmeyi riskli hâle getiriyor. iloc kutusu, mdat içine işaret eden hassas bayt offset'leri barındırıyor. Tek bir kutuyu bile silsen o offset'ler yanlışa döner ve görsel bir daha açılmaz.

Sıfır yazma yöntemi

PicScrub, meta veri kutularını silmek yerine kutu yapısını ve boyutlarını koruyarak içeriklerinin üzerine sıfır yazar.

Önce:   [Exif][GPS verisi: 37.7749, -122.4194][Kamera: iPhone]
Sonra:  [Exif][0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00...]

Neden sıfır yazma?

  • • Dosya bütünlüğü korunur:Bütün offset'ler geçerli kalır
  • • Yeniden sıkıştırma yok:Görsel verisine dokunulmaz
  • • Meta veri yok edilir:Sıfırlar hiçbir bilgi taşımaz
  • • Geri alınabilir mi?:Hayır, üzerine yazılan veri gitmiştir

PicScrub HEIC dosyalarını nasıl işliyor

1

Kutu yapısını çözümle

ftyp ve meta kutularını özyinelemeli olarak çözümle, bütün kutuları tespit et

2

Meta veriyi bul

ipco kabındaki Exif ve XMP özelliklerini bul

3

Meta veri içeriğini sıfırla

Meta veri kutularının içeriğinin üzerine sıfır yaz

4

Yapıyı koru

Kutu başlıklarını, boyutlarını ve bütün offset'leri olduğu gibi bırak

Dosya boyutu meselesi

PicScrub silmek yerine sıfır yazma yöntemini kullandığı için çıktı dosyasının boyutu girdiyle aynı olur. Meta verinin kapladığı alan korunur ama içi sıfırlarla doldurulur.

Girdi: 2,5 MB (50 KB EXIF ile)
Çıktı: 2,5 MB (50 KB sıfır)

HEIC, HEIF ve AVIF

İsimlendirme kafa karıştırıcı, hemen açıklığa kavuşturalım. HEIF kapsayıcı formatın adı; HEIC ve AVIF ise o kapsayıcının içindeki görselin hangi kodekle sıkıştırıldığını anlatıyor.

FormatKapsayıcıKodekKimler kullanıyor
HEICHEIFHEVC (H.265)Apple cihazları
HEIFHEIFÇeşitliGenel amaçlı kapsayıcı
AVIFHEIFAV1Web (telifsiz)

Üçü de aynı ISOBMFF/HEIF kapsayıcı yapısını kullanıyor, yani PicScrub'ın yöntemi hepsinde işe yarıyor.