Ontwerp van het BigTIFF bestandsformaat

Index

Wat is BigTIFF?
De voorgestelde BigTIFF structuren
Diverse bijkomende details
BigTIFF voorbeelden

Wat is BigTIFF?

Het TIFF bestandsformaat gebruikt 32bit offsets, en is dus beperkt in grootte tot 4 gigabytes. Dat volstond, vele jaren lang. Maar vandaag is er behoefte aan een goed multifunctioneel open beeld bestandsformaat dat heel grote afbeeldingen aankan, of heel grote collecties van afbeeldingen, en de grens van 4 gigabytes wordt daardoor heel reëel.

Men wil nu een nieuwe variant van TIFF ontwerpen, BigTIFF genaamd. De bedoeling is dat BigTIFF heel sterk op TIFF blijft lijken, behalve natuurlijk dat het 64bit offsets gebruikt. De voordelen van de grote gelijkenis met TIFF zijn enorm. Bestaande TIFF libraries kunnen bijvoorbeeld heel makkelijk uitgebreid worden om ook deze nieuwe variant te ondersteunen. De behoefte aan nieuwe documentatie is minimaal. Alle erg gewaardeerde eigenschappen van dit bestandsformaat, dat al vele jaren in gebruik is en uitgebreid is geweest, worden behouden. Alle bekende tags worden hergebruikt, alle ondersteunde bitdiepten en datatypes blijven geldig. Het willekeurige aantal 'extra kanalen', tiling en striping, de bonte verzameling compressiemethoden, de regels omtrent private tags,... Al deze zaken maakten TIFF zo enorm bruikbaar in pre-press systemen, voor het opslaan van wetenschappelijke gegevens, en een brede waaier van andere toepassingen, en al deze zaken blijven intact. Alleen de offset bitdiepte verandert, waardoor BigTIFF bestanden probleemloos de grens van 4 gigabyte kunnen doorbreken.

Deze pagina heeft tot doel een overzicht van het BigTIFF formaat aan te bieden, en vooral ook de verschillen met klassieke TIFF aan te duiden. Het merendeel van deze pagina is gebaseerd op de informele beschrijving van de hoogste niveau TIFF structuren, onderdeel van de TIFF bestandsformaat FAQ. Als u niet vertrouwd bent met die TIFF structuren, raden we u aan om dat onderdeel van de FAQ eerst door te nemen.

Een andere bron van informatie omtrent het BigTIFF bestandsformaat is de BigTIFF design pagina op de LibTiff site. Die pagina is het HTML equivalent van de voormalige Wiki formaat ontwerp pagina. De Wiki was de pagina met autoriteit, en de werkplaats. Deze pagina biedt een veel informeler overzicht, en ambieert geen autoriteit. Tenslotte is er ook het LibTiff Mailing List Archief, waar het formaat ontstond uit talrijke, ellenlange discussies. In het volgende overzicht van de BigTIFF structuren verwijst een link getiteld 'discussie' naar een welbepaalde thread in dat archief. Deze discussie is heel waarschijnlijk het finale startschot geweest.

BigTIFF is vooralsnog geen officiële standaard. Er hebben echter veel mensen meegewerkt aan het BigTIFF ontwerp, waaronder enkele mensen van Adobe, en er zijn sindsdien geen wijzigingen nodig gebleken. Er zijn ten minste twee onafhankelijke implementaties (onze eigen AWare Systems AsTiff, en LibTiff vanaf versie 4.0). Bovendien is het BigTIFF ontwerp en erg kleine en intuïtieve uitbreiding van klassieke TIFF. Het lijkt erg onwaarschijnlijk dat een standaardiseringsorganisatie of Adobe in dit stadium een eigen ontwerp dat verschilt van de bestaande BigTIFF naar voor zou schuiven. We menen bijgevolg dat we toepassing en implementatie van BigTIFF kunnen aanraden.

De voorgestelde BigTIFF structuren

Dit is de klassieke TIFF file header...

OffsetDatatypeWaarde
0WordByte order specificatie
2WordVersienummer (altijd 42)
4Unsigned LongOffset van eerste IFD

En dit is de nieuwe BigTIFF file header...

OffsetDatatypeWaarde
0WordByte order specificatie
2WordVersienummer (altijd 43)
4 Word Aantal bytes in een offset
Altijd 8 in BigTIFF, dit is bedoeld om makkelijk offsets van 16 bytes te kunnen ondersteunen, ooit.
Als hier een andere waarde staat, dient een lezer gewoon op te geven.
6WordAltijd 0
Als hier een andere waarde staat, dient een lezer gewoon op te geven.
8Unsigned 8ByteOffset van eerste IFD

Het laatste element, in beide varianten, wijst naar de eerste IFD (Image File Directory). Deze IFD kan zich om het even waar in het bestand bevinden. Elke 'pagina', elk beeld in een multi-page TIFF bestand, klassieke TIFF of BigTIFF wordt beschreven door één enkele IFD. Het volgende detailleert de klassieke bouw van zo'n IFD...

OffsetDatatypeWaarde
0WordAantal tags in de IFD
2+x*12Tag structuurTag data
2+(aantal tags in IFD)*12Unsigned LongOffset naar volgende IFD, als er een volgende IFD is
0 in het andere geval

En zo ziet de IFD er uit in het nieuwe BigTIFF bestandsformaat...

OffsetDatatypeWaarde
0Unsigned 8ByteAantal tags in de IFD
8+x*20Tag structuurTag data
8+(aantal tags in IFD)*20Unsigned 8ByteOffset naar volgende IFD, als er een volgende IFD is
0 in het andere geval

De tags moeten gerangschikt zijn volgens tag code, van klein naar groot, zowel in de klassieke TIFF als in BigTIFF. Elke tag is exact 12 bytes lang in klassieke TIFF, en ziet er als volgt uit....

OffsetDatatypeWaarde
0WordTag code
2WordDatatype van tag data
4Unsigned LongAantal waarden
8x * Tag data datatype
of Unsigned Long offset
Tag data
of offset van tag data

Dezelfde tag structuur, in BigTIFF, is 20 bytes lang, en ziet er zo uit...

OffsetDatatypeWaarde
0WordTag code
2WordDatatype van tag data
4Unsigned 8Byte
Discussie van dit element z'n datatype is nu afgerond.
Aantal waarden
12x * Tag data datatype
of Unsigned 8Byte offset
Tag data
of offset van tag data

Dezelfde regel voor het 'inlinen' van de tag data is van toepassing in klassieke TIFF en BigTIFF, alleen de drempelwaarde verschilt. In klassieke TIFF wordt de tag data in de tag structuur, in de IFD, geschreven als die data niet groter is dan 4 bytes. Indien ze wel groter is, wordt ze elders geschreven, en wordt er enkel naar verwezen in de IFD. In BigTIFF wordt de tag data in de tag structuur, in de IFD, geschreven als die data niet groter is dan 8 bytes.

Diverse bijkomende details

De bestandsextenties die zijn voorgesteld zijn, onder andere, 'tif', 'tf8' en 'btf' (zie ook discussie in de LibTiff mailing list).

Drie nieuwe datatypes worden toegevoegd aan de bestaande datatypes van klassieke TIFF:

TIFF_LONG8 = 16, zijnde unsigned 8byte integer
TIFF_SLONG8 = 17, zijnde signed 8byte integer
TIFF_IFD8 = 18, zijnde een nieuwe unsigned 8byte IFD offset.

De StripOffsets, StripByteCounts, TileOffsets, en TileByteCounts tags mogen van het datatype TIFF_LONG8 zijn in BigTIFF. Ouwe datatypes TIFF_LONG, en TIFF_SHORT, voor zover toegelaten in de TIFF 6.0 specificatie, zijn nog steeds mogelijk in BigTIFF.

Net zo mogen tags die naar andere IFDs verwijzen, zoals bijvoorbeeld de SubIFDs tag, nu van het datatype TIFF_IFD8 zijn in BigTIFF. Ook hier geld dat de ouwe datatypes TIFF_IFD, en de weinig aanbevelenswaardige TIFF_LONG, ook nog steeds toegelaten zijn.

BigTIFF voorbeelden

We hebben een reeks BigTIFF voorbeelden samengesteld. Vanzelfsprekend hebben we vooralsnog weinig of geen gelegenheid gehad om deze met andere software te testen. We zijn zo nauwkeurig mogelijk geweest, en hebben alles grondig nagekeken, maar we kunnen geen garanties bieden...

BigTIFF sample files BigTIFFSamples.zip bevat een reeks van 8 verschillende BigTIFF bestanden. Het BigTIFFSample.html bestand in deze zip beschrijft hun karakteristieken in detail.