aspose.info
NL

FLIF-bestandsindeling

Bijgewerkt

Wat is een FLIF-bestand?

FLIF (Free Lossless Image Format) is een lossless beeldformaat dat de .flif-extensie voor zijn bestanden gebruikt. FLIF claimt beter te presteren dan PNG, lossless WebP, lossless BPG en lossless JPEG 2000 in termen van compressieverhouding. FLIF maakt gebruik van progressieve interliniëring, waardoor elke gedeeltelijke download van de afbeelding kan worden gebruikt als codering met verlies voor de gehele afbeelding.

Korte geschiedenis

FLIF werd aangekondigd in september 2015 en de alfaversie werd uitgebracht in oktober 2015. In september 2016 werd de eerste stabiele versie van FLIF uitgebracht.

FLIF-ontwerp

FLIF gebruikt een variant van CABAC (Context-adaptive binary arithmetic coding), MANIAC (Meta-Adaptive Near-zero Integer Arithmetic Coding) voor compressie. MANIAC is een entropiecoderingsalgoritme ontwikkeld door Jon Sneyers en Pieter Wuille. In MANIAC zijn de contexten knooppunten van beslissingsbomen die dynamisch worden geleerd tijdens het coderen. Dit maakt het contextmodel meer beeldspecifiek en resulteert in een betere compressie. FLIF heeft de volgende kenmerken:

  • Ondersteunt lossless compressie
  • Ondersteunt compressie met verlies met voorverwerking van de encoder
  • Ondersteunt grijstinten, RGB en RGBA
  • Ondersteunt kleurdiepte van 1 tot 16 bits per kanaal
  • Ondersteunt geïnterlinieerde en niet-geïnterlinieerde bestanden
  • Ondersteunt progressieve decodering van gedeeltelijk gedownloade bestanden
  • Ondersteunt animaties
  • Ondersteunt ingebouwde ICC-kleurprofielen, Exif- en XMP-metadata
  • Heeft beperkte ondersteuning voor het comprimeren van Camera Raw-bestanden (RGGB)

FLIF-bestandsindeling

Een FLIF-bestand bestaat uit de volgende vier delen:

Hoofdkop

De hoofdkop bevat de belangrijkste metadata inclusief de breedte, hoogte, kleurdiepte, aantal frames.

TypeWaardeBeschrijving
4 bytes“FLIF”Magie
4 bits3 = ni nog steeds; 4 = ik nog steeds; 5 = geen animatie; 6 = ik animeInterliniëring, animatie
4 bits1 = grijswaarden; 3 = RGB; 4 = RGBAAantal kanalen (nb_channels)
1 byte‘0’,‘1’,‘2’ (‘0’=custom)Bytes per kanaal (Bpc)
varintbreedte-1Breedte
varinthoogte-1Hoogte
varintnb_frames-2 (alleen als animatie)Aantal frames (nb_frames)

Metadata-brokken

Dit deel bevat niet-pixelachtige Exif/XMP-metadata, ICC-kleurprofielen, enz. die zijn gecodeerd met DEFLATE-compressie. Deze chunks worden op dezelfde manier gedefinieerd als PNG-chunks, met het verschil dat de chuck-grootte is gecodeerd met een variabel aantal bytes. De namen van Chunks kunnen 4 letters (4 bytes) of een waarde lager dan 32 zijn, wat wijst op een niet-optioneel blok.

Het volgende is een voorbeeld van optionele klauwplaten:

BaknaamBeschrijvingInhoud (na DEFLATE-decompressie)
iCCPICC-kleurprofielruwe ICC-kleurprofielgegevens
eXifExif-metadata“Exif\0\0”-header gevolgd door een TIFF-header en de EXIF-gegevens
eXmpXMP-metadataXMP in een alleen-lezen xpacket zonder opvulling

Naamgeving

  • Eerste letter: hoofdletters worden gebruikt voor kritieke en kleine letters voor niet-kritieke brokken.
  • Tweede letter: hoofdletters worden gebruikt voor openbare en kleine letters voor privé-chunks
  • Derde letter: hoofdletters worden gebruikt voor klauwplaten die nodig zijn om de afbeelding correct weer te geven en kleine letters zijn niet belangrijk om de afbeelding weer te geven.
  • Vierde letter: hoofdletters worden gebruikt voor klauwplaten die veilig blindelings kunnen worden gekopieerd. Kleine klauwplaten zijn afhankelijk van de afbeeldingsgegevens.

Tweede kop

Hierin staat de informatie over de daadwerkelijke codering van de pixels.

TypeBeschrijvingVoorwaardeStandaardwaarde
1 byteNUL byte (0x00), chunknaam van een FLIF16 bitstream
uni_int(1,16)Bits per pixel van de kanalenBpc == ‘0’: repeat(nb_channels)8 if Bpc == ‘1’, 16 if Bpc == ‘2’
uni_int(0,1)Vlag: alpha_zeronb_channels > 30
uni_int(0,100)Aantal lussennb_frames > 1
uni_int(0,60_000)Framevertraging in msnb_frames > 1: herhaal(nb_frames)
uni_int(0,1)Vlag: has_custom_cutoff_and_alpha
uni_int(1,128)cutoffhas_custom_cutoff_and_alpha2
uni_int(2,128)alfa delerhas_custom_cutoff_and_alpha19
uni_int(0,1)Vlag: has_custom_bitchancehas_custom_cutoff_and_alpha0
?Bitchancehas_custom_bitchance
variabeleTransformaties (zie hieronder)
uni_int(1) = 0Indicatorbit: gedaan met transformaties
uni_int(0,2)Onzichtbare pixelvoorspelleralpha_zero && interlaced && alpha-bereik omvat nul

Kanalen

KanaalnummerBeschrijving
0Rood of grijs
1Groen
2Blauw
3Alfa

Transformaties

TypeBeschrijving
uni_int(1) = 1Indicatorbit: nog niet klaar
uni_int(0,13)Transformatie-ID
variabeleTransformatiegegevens (afhankelijk van transformatie)

Transformatie wordt gebruikt om pixelgegevens aan te passen voor een betere compressie en om daadwerkelijk optredende pixelwaarden bij te houden.

Pixelgegevens

Dit deel bevat de feitelijke pixelgegevens die zijn gecodeerd met behulp van MANIAC-entropiecodering. De pixels kunnen worden gecodeerd met behulp van interlaced of niet-interlaced codering.

Interlaced methode

Bij deze methode worden zoomniveaus gedefinieerd. Zoomlevel 0 wordt gebruikt voor het volledige beeld, zoomlevel 1 wordt gebruikt voor alle even genummerde rijen, zoomlevel 2 wordt gebruikt voor alle even genummerde kolommen van zoomlevel 1. Met andere woorden, elk even genummerd zoomlevel 2k is een gedownsamplede versie van de afbeelding, op schaal 1:2^k. Zoomniveaus zijn gecodeerd van de hoogste naar de laagste.

Niet-geïnterlinieerde methode

Bij deze methode begint de codering van de MANIAC-bomen onmiddellijk gevolgd door de codering van de pixels.

Referenties

Zie ook