spacer.png, 0 kB
De GIF-bestandsstructuur E-mail

Ook voor GIF-bestanden is een duidelijke afspraak gemaakt hoe de gegevens in het bestand worden opgenomen.

 

De GIF-bestandsstructuur

 

Wim van ’t Einde

 

Het GIF-bestand werkt met pixels. Maar voordat de pixels een voor een worden ingegeven moet wel informatie over het gehele bestand worden opgegeven. Over deze informatie gaat dit artikel.

Het GIF-bestand zit redelijk complex in elkaar, maar er zijn toch een aantal belangrijke delen te onderscheiden:

  • File Header;
  • Logical Screen Descriptor;
  • Global Color table;
  • Voor Netscape kan er eventueel nog een Netscape Application Extension Block zijn toegevoegd;
  • Block Definitions;
  • File Trailer.

Hierna worden de verschillende delen een voor een belicht.

 

File Header

Het GIF-bestand begint met een File Header, die aangeeft om welk bestand het gaat. Er zijn zes posities voor gereserveerd, waarin “GIF 87a” of “GIF 89a” staat. Deze informatie is nodig om de versie van het bestand te bepalen en daarmee de rest van het bestand goed te kunnen ontcijferen.

 

Logical Screen Descriptor

De afmetingen van het GIF-bestand en andere belangrijke waarden worden opgenomen in de Logical Screen Descriptor.
De sectie start met de breedte en hoogte van de hele GIF-afbeelding. Hiermee wordt aangegeven hoe groot de afbeelding wordt wanneer deze klaar is. Hiermee wordt eigenlijk de ruimte gereserveerd die de afbeelding wil gebruiken. Wanneer onderdelen kleiner zijn dan de grootte, dan blijft er ruimte over. Wanneer onderdelen van het bestand groter zijn, dan wordt het te grote deel niet weergegeven.
Daarna is een byte gereserveerd dat informatie geeft over een aantal onderwerpen:

  • Wordt in het bestand al dan niet een Global Color Table gebruikt?
  • Hoeveel bits worden vastgelegd per pixel in de afbeelding?
  • Of de Color Table gesorteerd is op basis van de het belang van de kleur;
  • Het aantal ingangen in de Color Table.

Daarna wordt een index van de achtergrondkleur opgegeven, waarmee vervolgens de transparantie van de afbeelding kan worden gerealiseerd. Tevens wordt nog de aspectverhouding weergegeven, daarmee kan bij het weergeven van GIFs de verhoudingen worden aangepast en ziet de GIF er horizontaal of verticaal uitgerekt uit.

 

Global Color table

Dit is een optioneel onderdeel in het GIF-bestand, het wordt alleen weergegeven als in de Logical Screen Descriptor wordt aangegeven dat het bestand een Global Color Table gebruikt. In de meeste gevallen wordt de Global Color Table in de GIF-bestanden gebruikt. Het bevat een aantal codes voor de kleurencombinaties die in het bestand voorkomt. Elke kleur kan zo worden weergegeven als een byte, waarin de verhouding tussen de Rode, Groene en Blauwe kleuren is weergegeven. Wanneer de Logical Screen Descriptor aangeeft dat de Color Table gesorteerd is op basis van het belang van de kleur, dan worden de meest gebruikte kleuren vooraan in de tabel opgenomen en de minst gebruikte achteraan. Een GIF-bestand kan uit meerdere kleinere afbeeldingen bestaan. Elke afbeelding in een GIF-bestand kan een eigen Color Table hebben. Wanneer zo’n Color Table aanwezig is, dan gebruikt dat deel van het GIF-bestand de Global Color Table niet meer, de kleuren zijn immers opgenomen in de eigen Color Table.

 

Block Definitions

Hierna volgt het moeilijkste gedeelte van het GIF-bestand, de Block Definitions. Dit deel bevat een aantal afzonderlijke afbeeldingen en 89a-uitbreidingen. De volgorde van deze onderdelen kan variëren. Het soort Block (afbeelding of 89a-uitbreiding) kan worden bepaald aan de hand van de eerste byte van het Block.

 

Afbeelding-blocks

De Afbeeldings-blocks zijn als volgt opgebouwd:

  • Logical Image Descriptor;
  • Local Color Table;
  • Minimum LZW Code Size;
  • Image Data;
  • Block Terminator.

De Logical Image Descriptor begint met de ASCII-code voor het teken‘,’. Dit teken wordt gevolgd door de coördinaten van de hoek linksboven van de afbeelding, gemeten in pixels, in het gehele GIF-bestand. Daarna worden de breedte en de hoogte van de afbeelding (in pixels) opgegeven. In het laatste deel van de Logical Image Descriptor is gereserveerd voor een byte dat aangeeft:

  • Wordt in het bestand al dan niet een Local Color Table gebruikt?
  • Of de Color Table gesorteerd is op basis van de het belang van de kleur;
  • Het aantal ingangen in de Color Table.

De Logical Image Descriptor lijkt daarmee erg veel op de Logical Screen Descriptor. Het verschil tussen beide is dat de eerste dus een deel van het GIF-bestand beschrijft en de tweede het geheel.
In dit deel wordt de optie interlacing uitgevoerd. Interlacing werkt in principe in vier gangen:

  1. Vanaf de eerste rij (rij 0) wordt elke achtste rij weergegeven;
  2. Vanaf de vijfde rij (rij 4) wordt elke achtste rij weergegeven (precies halverwege de vorige lijnen; het aantal lijnen verdubbelt);
  3. Vanaf de derde rij (rij 2) wordt elke vierde rij weergegeven (weer precies halverwege de eerdere lijnen; het aantal lijnen verdubbelt opnieuw);
  4. Als laatste worden de even rijen gevuld, waarbij wordt gestart met de tweede rij (rij 1). (Hiermee verdubbelt het aantal lijnen opnieuw en wordt de afbeelding compleet gemaakt.)

Merk op dat in de computerwereld het tellen altijd begint met 0, vandaar dat de eerste rij gelijk is aan rij 0, de tweede rij aan rij 1 enzovoorts.

Ook kan in dit deel worden aangegeven of de gebruiker eerst iets moet doen voordat de animatie begint en wat die actie dan moet zijn. Dit laatste is afhankelijk van de applicatie die de GIF laat zien.

Ook wordt in dit gedeelte de snelheid waarin de afzonderlijke afbeeldingen elkaar binnen de animated-GIF opvolgen bepaald en kan worden aangegeven wat er moet gebeuren nadat de afbeelding is getoond. Vaak wordt de achtergrond dan weer leeggemaakt, maar het kan ook anders.

Voor de Local Color Table geldt hetzelfde als voor de Global Color Table. Dit deel is optioneel en wordt slechts opgenomen wanneer de Logical Image Descriptor aangeeft dat de afbeelding een Local Color Table bevat. In het andere geval wordt gebruik gemaakt van de Global Color Table. Het mag duidelijk zijn dat het bestand wanneer er geen Local Color Table aanwezig is kleiner is, dan in de situatie waarin deze wel aanwezig is.

De Minimum LZW Code Size geeft aan met welke grootte de code wordt opgenomen. De maximum grootte van de code is binnen GIF-bestanden 12 bits, maar de grootte van de code kan ook minimaal 3 zijn bij zwart-wit afbeeldingen die slechts 1 bit per pixel gebruiken. Voor andere afbeeldingen is de grootte van de code normaal een meer dan het aantal bits dat per pixel wordt gebruikt in de afbeelding.

Met de code voor Image Data wordt de grootte aangegeven van de gegevens die voor de afbeelding nodig zijn (1-255 bytes). Het wordt gevolgd door de feitelijke gegevens van de afbeelding die met behulp van het LZW-algoritme zijn gecomprimeerd. Er kunnen een willekeurig aantal bytes voorkomen die de grootte weergeven, gevolgd door de bytes van het betreffende deel van de afbeelding.

De Block Terminator sluit het block af met de hexadecimale code 0x00.

 

Uitbreidings-blocks

De uitbreidings-blocks bestaan uit een viertal typen gegevens:

  • Extension Introducer;
  • Extension Type;
  • Extension Data;
  • Block Terminator.

Met de Extension Introducer wordt aangegeven dat er een code komt die een uitbreiding van de GIF-standaard weergeeft. De hexadecimale code die hiervoor wordt gebruikt is ‘0x21’.

Extension Type geeft in een byte de code van een bepaalde uitbreiding van de GIF-standaard weer. Er zijn momenteel vier uitbreidingen:

  • Een voor de specificatie van toelichtingen in het GIF-bestand;
  • Daarnaast een uitbreiding om tekst-annotaties te kunnen opnemen, deze optie werkt in veel applicaties niet of niet goed;
  • Ook kan het voor bepaalde applicaties nuttig zijn om wat informatie aan het bestand mee te geven, om er later weer gebruik van te maken.
  • De laatste uitbreiding wordt gebruikt om aan te geven hoe er gewisseld kan worden tussen de afzonderlijke afbeeldingen binnen het GIF-bestand.

De eerste drie uitbreidingen voegen informatie toe aan het bestand, maar worden niet gebruikt bij het weergeven van de afbeelding. Daarbij wordt de betreffende informatie eenvoudig genegeerd.

De Extension Data bestaat uit de gegevens die de betreffende uitbreiding nodig heeft. Het is op een soortgelijke manier opgebouwd als de eerder genoemde Image Data. Telkens wordt door een byte het aantal gegevens weergegeven dat daarna volgt. Ook nu kan er weer een willekeurig aantal van deze combinaties volgen. Het mag duidelijk zijn dat de interpretatie van de gegevens afhankelijk is van de bijbehorende Extension Type. 

De Block Terminator bestaat uit een byte met de hexadecimale waarde 0x00.

Een voorbeeld van een Extension block:

Byte 1                 : 33 (GIF Extension Code)Byte 2                 : 255 (Application Extension Label)Byte 3                 : 11 (Lengte van het Application Block)Bytes 4-11           : “COMPUTER”

Bytes 12-14         : “EXP”
Byte 15               : 3 (Lengte van het Data Sub-block)
Byte 16               : 1
Bytes 17 en 18    : 0 - 65535
Byte 19               : 0 (Het slot van het Data Sub-Block)

Wat toelichting is bij dit voorbeeld op de plaats.
De 11 databytes die in byte 3 worden opgegeven staan in de bytes 4 tot en met 14.
De 3 bytes van byte 15 staan in de bytes 16 tot en met 18.

 

File Trailer

De File trailer geeft het einde van het GIF-bestand aan. Er is een positie voor gereserveerd en het bevat het teken “;”.

 

 
< Vorige   Volgende >
Joomla Template by Joomlashack
Free Joomla Templates