TIFF, Tag Image File Format, FAQ

Index

Vraag 1. Waarvoor staat de term 'Tag Image File Format'? Waarin verschilt TIFF van andere beeldbestandsformaten?
Vraag 2. Hoe kan ik, vanuit het vertrekpunt van een programmeur of van een gebruiker, een PNG image converteren naar TIFF? En omgekeerd? Beeldbestand in formaat X naar formaat Y? Hoe kan ik een beeld croppen, herschalen, anderszins bewerken?
Vraag 3. Ik zoek een informele beschrijving van de hoogste niveau TIFF structuren.
Vraag 4. Waar vind ik de volledige TIFF specificatie?
Vraag 5. Wordt de TIFF specificatie actief onderhouden en regelmatig bijgewerkt?
Vraag 6. Moet ik een licentie aanvragen bij Adobe of elders om TIFF te mogen gebruiken?
Vraag 7. Kan ik TIFF niet streamen? Waarom springt m'n library van hot naar her in mijn TIFF file?
Vraag 8. Wat is de maximale grootte van een TIFF bestand?
Vraag 9a. Welke zijn de gedefinieerde tags precies? Waar vind ik informatie over een specifieke tag?
Vraag 9b. Waar kan ik mijn eigen private tags registreren?
Vraag 10. Wanneer dien ik welke kleurruimte en compressiemethode te gebruiken?
Vraag 11. Welke libraries bieden ondersteuning voor TIFF?
Vraag 12. Waar kan ik LibTiff vinden, en hoe gebruik ik die library in mijn applicatie?
Vraag 13. Vermeldt u GeoTIFF hier niet?

Vraag 1. Waarvoor staat de term 'Tag Image File Format'? Waarin verschilt TIFF van andere beeldbestandsformaten?

Flexibele tagsets

Veel beeldbestandsformaten hebben een image header met vaste velden die informatie bevatten zoals de afmetingen van het beeld, specificatie van de kleurruimte, enz. Het TIFF bestandsformaat onderscheidt zich door het feit dat het een flexibel geheel van informatievelden toelaat. Veel van die informatievelden, 'tags' genaamd, zijn door specificaties gedefinieerd als bijvoorbeeld heel fundamentele informatie, zoals de afmetingen van de het beeld, of als gegevens die minder van rechtstreeks belang zijn zoals informatie over auteursrechten. Verder zijn er de zogenaamde 'private tags' of 'custom tags' die u zelf kunt definiëren en die specifieke informatie kunnen bevatten, die kadert in uw eigen private toepassing. De TIFF-specificatie bepaalt een kader voor een image header, 'IFD' (Image File Directory) genaamd, dat in essentie bestaat uit een flexibel geheel van de specifieke tags die de TIFF writer software wenst te specificeren.

Het voordeel van deze opzet is dat zowat alle denkbare informatie aan een beeld of afbeelding kan worden toegevoegd, terwijl er slechts weinig informatie absoluut vereist is en de image headers dus zo beperkt mogelijk kunnen worden gehouden. Er is weinig overhead, en voldoende flexibiliteit om aan elke behoefte te voldoen.

Flexibele combinatie van kleurruimte, bitdiepte/datatype en compressiemethode

Een ander belangrijk verschil tussen TIFF en de meeste andere beeldbestandsformaten is het feit dat TIFF de toepassing van een groot aantal verschillende compressiemethoden en kleurruimten mogelijk maakt. De gebruikte opties worden gespecificeerd in speciaal daarvoor gedefinieerde tags. Terwijl andere bestandsformaten vaak ontworpen zijn voor één enkele compressiemethode, laat het TIFF-formaat toe JPEG- of JBIG-compressie te gebruiken, of de beruchte LZW of Deflate-compressie, om er maar enkele te noemen. Hetzelfde geldt voor de kleurruimten. In theorie zou u zelfs om het even welke zelf gedefinieerde compressiemethode en kleurruimte kunnen gebruiken, hoewel natuurlijk de uitwisselbaarheid of portability van uw beeldbestanden hierdoor in het gedrang komt.

Tenzij het gekozen compressiealgoritme specifieke beperkingen zou opleggen, kan om het even welke kleurruimte en om het even welke bitdiepte worden gecombineerd met om het even welke compressiemethode.

Hetzelfde geldt ook voor bitdieptes en datatypes. Een van de krachtige kenmerken van TIFF is de ondersteuning van een groot aantal datatypes. U kunt gehele getallen met of zonder teken, waarden met vlottende komma en zelfs complexe waarden opslaan in een TIFF-bestand. Gecombineerd met de mogelijkheid om een willekeurig aantal beeldkanalen op te slaan, maakt dit van TIFF een zeer nuttig formaat voor het bewaren van wetenschappelijke gegevens.

Multi-page

Een laatste belangrijk verschil tussen TIFF en de meeste andere beeldbestandsformaten is het feit dat TIFF ondersteuning biedt voor meerdere afbeeldingen of beelden in één enkel bestand. Een dergelijk bestand wordt een 'multi-page' TIFF genoemd. Het TIFF-formaat is dus bijzonder geschikt om bijvoorbeeld alle pagina's van een faxbericht samen in één bestand te bewaren.

Nadelen

In theorie is TIFF hierdoor even flexibel en geschikt voor een waaier aan toepassingen als zeer geavanceerde formaten zoals PSD (Adobes PhotoShop® Document formaat). In feite is de eenvoud en de openheid van het formaat een belangrijk voordeel ten opzichte van een formaat zoals PSD. Het TIFF-formaat is echter eigendom van hetzelfde bedrijf dat ook eigenaar is van het PSD-formaat en het wekt dan ook geen verwondering dat TIFF de laatste tien jaar ietwat verwaarloosd is geweest. Dat is wellicht meteen ook het voornaamste van TIFF: het formaat ontbeert een gestandaardiseerde ondersteuning voor de geavanceerde beeldbewerkingstechnologie die de laatste jaren werd ontwikkeld. Zo is er bijvoorbeeld geen standaard manier om de multi-layer relaties van verschillende TIFF-pagina's aan te geven, hoewel een speciaal hiervoor ontwikkelde tagdefinitie dit probleem makkelijk en afdoende zou oplossen. Verder is er ook geen standaard tag voor vector of tekst tekeningen.

Nog een nadeel dat aan het TIFF-formaat kleeft, evenals aan de meeste andere bestandsformaten, is de beperking in bestandsgrootte. Het formaat maakt gebruik van 32bit offsets en is bijgevolg beperkt tot 4 gigabyte. (BigTIFF is een actueel lopende poging tot ontwikkeling van een nieuwe versie van TIFF, met als doel precies deze grens van 4 gigabyte te doorbreken.)

Photoshop is a geregistreerd handelsmerk van Adobe Systems, Inc.

Vraag 2. Hoe kan ik, vanuit het vertrekpunt van een programmeur of van een gebruiker, een PNG image converteren naar TIFF? En omgekeerd? Beeldbestand in formaat X naar formaat Y? Hoe kan ik een beeld croppen, herschalen, anderszins bewerken?

Verschillende gratis doch krachtige tools ondersteunen eenvoudige tot soms zeer complexe beeldbewerkingen. Sommige daarvan zijn 'open source' en kunnen voor een programmeur ook een bron van inspiratie en documentatie zijn. De meest gebruikte zijn:

ImageMagick
GraphicsMagick
NetPBM
VIPS

Vraag 3. Ik zoek een informele beschrijving van de hoogste niveau TIFF structuren.

Dat heeft u bij deze gevonden. Hier is de file header...

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

Het enige element in deze structuur dat we hier zullen bespreken, is het derde, de offset van 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, wordt beschreven door één enkele IFD. Zo'n IFD is als volgt opgebouwd...

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

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

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

Wat hierboven is beschreven als 'datatype van tag data' is het datatype van de elementaire bouwsteen van de tag data. Met andere woorden, als de tag data bijvoorbeeld een array van bytes is, dan is dit datatype byte. De echte lengte van de tag data is bijgevolg gelijk aan de lengte van dit datatype, vermenigvuldigd met wat hierboven beschreven staat als 'aantal waarden'. Als deze lengte kleiner is dan of gelijk aan 4 bytes, dan wordt de tag waarde rechtstreeks in de IFD geschreven, op offset 8 van het begin van de tag structuur. In het andere geval wordt deze tag waarde op eender welke andere plaats in het TIFF bestand geschreven, en wordt de offset van deze andere plaats in de IFD gezet, op offset 8 van het begin van de tag structuur.

Met andere woorden, als de tag data kleiner is dan of gelijk aan 4 bytes, dan past ze in de IFD. Zoniet, word ze elders bewaard, en wordt rechtstreeks in de IFD slechts een offset (verwijzing) naar deze tag data geschreven.

Daarmee is de beschrijving van de hoogste niveau TIFF structuren rond. Alleen moet nog worden vermeld dat de TIFF specificatie uitdrukkelijk stelt dat tag data geen offsets in het bestand of offsets in eender welke ander TIFF data blok mag bevatten, op enkele gedocumenteerde speciale tags na (TileOffsets, StripOffsets,...). Hierdoor kunnen alle structuren en data blokken vrij worden verplaatst. Dit is een bijzonder belangrijke pijler van het TIFF bestandsformaat. Het maakt dat bewerkingen zoals het unlinken van een IFD of het samenvoegen van meerdere single-page TIFF bestanden tot een enkele multi-page TIFF, of omgekeerd, mogelijk worden. Als elke tag waarde offsets zou kunnen bevatten naar andere plaatsen in het bestand, dan zou software die dergelijke dingen doet of op andere manieren data blokken verplaatst kennis van de exacte inhoud van elke mogelijke tag nodig hebben om alle data te vinden en om te weten welke pointers dienen te worden veranderd. Dat is enerzijds onhaalbaar door het grote aantal gedefinieerde tags, en anderzijds zou dit uitbreidbaarheid bemoeilijken en het hele concept van private tags onmogelijk maken.

Maar de specificatie schrijft integendeel voor dat alle tag data 'op zichzelf staand' moet zijn, dat enkel een handvol speciale tags naar andere locaties in het bestand mogen verwijzen. Op die manier worden alle blokken vrij verplaatsbaar, kunnen ze allen gelezen en geschreven worden in willekeurige volgorde, en kan software deze blokken relatief eenvoudig door elkaar gooien en nieuwe plaatsen toekennen, enkel rekening houdend met de hoogste niveau TIFF structuren en het handvol speciale tags.

Vraag 4. Waar vind ik de volledige TIFF specificatie?

TIFF specificatie, versie 6.0
TechNote2 over JPEG-in-TIFF
TIFF specificatie, supplement 1
TIFF specificatie, supplement 2

Enkele van de standaarden die op TIFF verder bouwen:

GeoTIFF formaat specificatie, versie 1.0
RFC 2301 - Bestandsformaat voor Internet Fax
DNG, Digital Negative, standaard voor RAW bestanden van digitale camera's

Vraag 5. Wordt de TIFF specificatie actief onderhouden en regelmatig bijgewerkt?

TIFF is ontwikkeld door Aldus en Microsoft Corp, en de specificatie was de eigendom van Aldus. Aldus is vervolgens opgegaan in Adobe Systems, Inc. Adobe Systems is nu dus de eigenaar en houder van het copyright.

De meest recente grote nieuwe versie van de specificatie, versie 6.0, is uitgegeven in 1992. (Nee, deze pagina is niet verouderd.) Adobe heeft er een eerste bijlage aan toegevoegd in 1995, doch deze is nog steeds aangeduid met 'draft' (=kladje). In 2002 verwerkte Adobe de nieuwe JPEG-in-TIFF specificatie in een nieuwe, tweede bijlage. Deze nieuwe JPEG-in-TIFF specificatie was onafhankelijk opgesteld in 1994.

Al vele jaren circuleren geruchten dat Adobe aan een nieuwe TIFF specificatie zou sleutelen, maar dat project lijkt minstens niet prioritair behandeld te worden. Er is ook geen open procedure voor revisie van de specificatie. Het is niet duidelijk of we al dan niet ooit een nieuwe specificatie van Adobe mogen verwachten.

Vraag 6. Moet ik een licentie aanvragen bij Adobe of elders om TIFF te mogen gebruiken?

U heeft geen licentie nodig van Adobe om software te maken die het TIFF formaat leest of schrijft. Het gebruik van bestaande TIFF libraries kan een licentie vereisen, maar er zijn libraries met minimale licentievoorwaarden.

Ooit had u een LZW licentie van Unisys nodig om gebruik te kunnen maken van LZW compressie in TIFF, maar alle patenten daarop lijken intussen verlopen.

Vraag 7. Kan ik TIFF niet streamen? Waarom springt m'n library van hot naar her in mijn TIFF file?

TIFF is geen streambaar formaat. Het ligt in de aard van het beestje dat alle data blokken kunnen worden geschreven in de volgorde die de specifieke applicatie en/of TIFF schrijvende library goed uitkomen. Zelfs als een specifieke schrijver en een specifieke lezer het zouden eens zijn over een of andere 'logische' data blok volgorde, is de kans groot dat ze tweemaal toegang zoeken tot sommige blokken (bv. het uitgesteld schrijven van de offset van de volgende IFD), en/of dat ze sommige blokken helemaal niet aanraken (bv. als een lezer niet geïnteresseerd is in de waarde van de Artist tag, of in SubIFDs). De mogelijkheid om schrijver en lezer op elkaar af te stemmen wat betreft data blok volgorde lijkt nog minder haalbaar wanneer er sprake is van meerdere pagina's of SubIFDs. En hoedanook is er niet zoiets als een uniek lezer/schrijver paar; er zijn talrijke verschillende implementaties. TIFF editing strooit nog meer roet in het eten; implementaties zijn het veelal eens dat wijzigingen die langer zijn dan het origineel achteraan in het bestand worden bijgeschreven, in plaats van ze op de oorspronkelijke plaats te proberen inpassen. Dit levert een bestand op, dat sowieso geen enkele lezer sequentieel kan inlezen.

Er zijn in de loop der tijd pogingen geweest om een beter streambaar 'subformaat' op TIFF te baseren, veelal door middel van het definiëren van een 'logische' data blok volgorde. Geen van deze pogingen was een onverdeeld succes. Als u streaming nodig heeft, dient u wellicht JPEG of PNG te overwegen.

Vraag 8. Wat is de maximale grootte van een TIFF bestand?

Het formaat gebruikt 32bit offsets, en daarom is de grootte van een bestand beperkt tot 4 gigabyte. Veel implementaties gebruiken intern signed integers om met deze offsets om te gaan, en ondersteunen bijgevolg bestanden tot maximaal slechts 2 gigabyte. Maar de enige echte limiet die het gevolg is van de specificatie van het formaat en niet van een specifieke implementatie is 4 gigabyte.

BigTIFF is een actueel lopende poging tot ontwikkeling van een nieuwe versie van TIFF, met als doel precies deze grens van 4 gigabyte te doorbreken.

Vraag 9a. Welke zijn de gedefinieerde tags precies? Waar vind ik informatie over een specifieke tag?

De primaire bron is natuurlijk de TIFF specificatie. Merk echter op dat deze natuurlijk geen informatie bevat over private tags. Denk er ook aan dat de JPEG-in-TIFF sectie verouderd is en vervangen door TechNote2, later opgenomen in de TIFF specificatie, bijlage 2.

Een bijkomende, meer informele bron van informatie is de TIFF Tag Referentielijst. Deze bevat een lijst van primaire eigenschappen en een korte beschrijving voor elke voldoende gekende tag, alsmede links naar meer informatie waar mogelijk. Als u documentatie heeft over een private tag die nog niet in deze lijst is opgenomen, kan u dat eenvoudig per e-mail melden, dan voegen wij deze toe. De gratis TIFF Tag Viewer voor Windows kan ook een nuttig tool zijn in dit verband.

Een derde bron is het TIFF en LibTiff mailing list archief. Merk vooral de 'local Google' zoekfunctie op. Als Googles technologie, toegepast op meer dan 10 jaar mailing list trafiek, niets oplevert, dan is er wellicht gewoon geen informatie beschikbaar.

Vraag 9b. Waar kan ik mijn eigen private tags registreren?

TIFF tag en TIFF compression ID registratie wordt verzorgd door Adobe Developer Relations.

Dit registratieproces staat los van onze eigen officieuze TIFF Tag Referentielijst. Nadat u van Adobe uw eigen private tag codes heeft bekomen, of indien u deze codes reeds heeft en gebruikt, raden wij u aan de relevante informatie in te dienen voor opname in deze Tag Directory. Hier is geen web-based registratie of dergelijke mee gemoeid, een mailtje naar info@awaresystems.be volstaat.

Vraag 10. Wanneer dien ik welke kleurruimte en compressiemethode te gebruiken?

De vrije combineerbaarheid van raster gegevens met de verschillende kleurruimten en compressiemethoden maakt TIFF uitermate geschikt voor een brede waaier van toepassingen. Hier is een lijstje met de meest populaire en meest voorkomende toepassingen.

ToepassingCompressiemethode en kleurruimte
Bilevel dithered of heel complex beeldmateriaalkleurruimte zwart/wit
compressiemethode G3, G4, of eventueel JBIG
Bilevel kunstmatig beeldmateriaalkleurruimte zwart/wit
compressiemethode G3 of G4
Fotografisch beeldmateriaal in grijstinten of kleur met normaal bereik Als compressie belangrijker is dan kwaliteit
kleurruimte Grijsschaal of YCbCr(*)
compressiemethode JPEG(*)
Als kwaliteit belangrijker is dan compressie
kleurruimte Grijsschaal, RGB, of CIE L*a*b*
compressiemethode LZW of Deflate
Als kwaliteit uitermate belangrijk is
kleurruimte 16bit per kanaal of zelfs floating point RGB, of 16bit per kanaal CIE L*a*b*
compressiemethode LZW of Deflate
Kunstmatig beeldmateriaal in grijstinten of kleur met normaal bereik Als het aantal unieke kleuren <=256
kleurruimte Palette is meest geschikt
compressiemethode LZW of Deflate
Als het aantal unieke kleuren >256
kleurruimte Grijsschaal, RGB, of CIE L*a*b*
compressiemethode LZW of Deflate
Beeldmateriaal in grijstinten of kleur met dynamisch bereikkleurruimte floating point Grijsschaal of RGB
compressiemethode LZW or Deflate

(*) De YCbCr kleurruimte en JPEG compressiemethode zijn de facto verwant. Behalve het gebruik van JPEG als compressiemethode, is er naar onze bescheiden mening geen echte goede reden om YCbCr te gebruiken.

Vraag 11. Welke libraries bieden ondersteuning voor TIFF?

De moeder van alle TIFF libraries is LibTiff. Die is ontworpen door Sam Leffler, en wordt tegenwoordig onderhouden door Frank Warmerdam en Andrey Kiselev. Ze is gratis, open source, en er is een goeie ondersteuning voor deze library in de TIFF en LibTiff mailing list.

Little cms, een gratis color management engine door Marti Maria, bevat o.a. een tool genaamd 'tifficc' dat een brug vormt tussen LibTiff en de color management engine. Het tool kan profile chains op TIFF bestanden toepassen, en kan dus gebruikt worden om bijvoorbeeld RGB TIFF naar CMYK TIFF te converteren, of om met andere TIFF kleurruimten zoals Lab en YCbCr te werken.

Er zijn nog andere TIFF codec implementaties. De Python Imaging Library bevat een TIFF implementatie in Python. Er zijn vele encoder implementaties; het is relatief makkelijk om code te ontwerpen die een welbepaalde specifieke TIFF variant schrijft. (Dat was mede de bedoeling bij het ontwerp van het formaat.)

Als uw bedrijf een commerciële library voor beeldverwerking aanbiedt, en dit product ondersteunt TIFF zoals het hoort, dan kan u een link krijgen in deze sectie. Contacteer ons hiervoor op info@awaresystems.be.

Vraag 12. Waar kan ik LibTiff vinden, en hoe gebruik ik die library in mijn applicatie?

LibTiff, een gratis open source TIFF codec
Using LibTiff
LibTiff reference

Er bestaat ook een prima tutorial:

Graphics programming with LibTiff, part 1
Graphics programming with LibTiff, part 2

Vraag 13. Vermeldt u GeoTIFF hier niet?

Tuurlijk wel! De GeoTIFF standaard, een gezamenlijk project van meer dan 160 verschillende bedrijven en organisaties werkzaam rond remote sensing, GIS, cartografie, en surveying, is een open, op het TIFF bestandformaat gebaseerde standaard voor geografisch gelokaliseerd beeldmateriaal.