Τι είναι ένα αρχείο FLIF;
Το FLIF (Free Lossless Image Format) είναι μια μορφή εικόνας χωρίς απώλειες που χρησιμοποιεί την επέκταση .flif για τα αρχεία της. Η FLIF ισχυρίζεται ότι έχει καλύτερη απόδοση από το PNG, το WebP, το BPG χωρίς απώλειες και το JPEG 2000 χωρίς απώλειες όσον αφορά τον λόγο συμπίεσης. Το FLIF χρησιμοποιεί προοδευτική διασύνδεση, λόγω της οποίας οποιαδήποτε μερική λήψη της εικόνας μπορεί να χρησιμοποιηθεί ως κωδικοποίηση με απώλειες για ολόκληρη την εικόνα.
Σύντομη Ιστορία
Το FLIF ανακοινώθηκε τον Σεπτέμβριο του 2015 και η άλφα έκδοση κυκλοφόρησε τον Οκτώβριο του 2015. Τον Σεπτέμβριο του 2016 κυκλοφόρησε η πρώτη σταθερή έκδοση του FLIF.
Σχεδιασμός FLIF
Το FLIF χρησιμοποιεί μια παραλλαγή του CABAC (Δυαδική αριθμητική κωδικοποίηση με προσαρμογή περιβάλλοντος), του MANIAC (μετα-προσαρμοστική αριθμητική κωδικοποίηση σχεδόν μηδενικού αριθμού) για συμπίεση. Το MANIAC είναι ένας αλγόριθμος κωδικοποίησης εντροπίας που αναπτύχθηκε από τους Jon Sneyers και Pieter Wuille. Στο MANIAC, τα περιβάλλοντα είναι κόμβοι δέντρων αποφάσεων που μαθαίνονται κατά το χρόνο κωδικοποίησης δυναμικά. Αυτό κάνει το μοντέλο περιβάλλοντος πιο συγκεκριμένο για την εικόνα και οδηγεί σε καλύτερη συμπίεση. Το FLIF έχει τα ακόλουθα χαρακτηριστικά:
- Υποστηρίζει συμπίεση χωρίς απώλειες
- Υποστηρίζει συμπίεση με απώλειες με προεπεξεργασία κωδικοποιητή
- Υποστηρίζει κλίμακα του γκρι, RGB και RGBA
- Υποστηρίζει βάθος χρώματος από 1 έως 16 bit ανά κανάλι
- Υποστηρίζει interlaced και non-interlaced αρχεία
- Υποστηρίζει προοδευτική αποκωδικοποίηση μερικώς ληφθέντων αρχείων
- Υποστηρίζει κινούμενα σχέδια
- Υποστηρίζει ενσωματωμένα χρωματικά προφίλ ICC, μεταδεδομένα Exif και XMP
- Έχει περιορισμένη υποστήριξη για τη συμπίεση φωτογραφικών αρχείων (RGGB)
Μορφή αρχείου FLIF
Ένα αρχείο FLIF έχει τα ακόλουθα τέσσερα μέρη:
Κύρια κεφαλίδα
Η κύρια κεφαλίδα περιέχει τα κύρια μεταδεδομένα, συμπεριλαμβανομένων του πλάτους, του ύψους, του βάθους χρώματος, του αριθμού των καρέ.
Τύπος | Τιμή | Περιγραφή |
---|---|---|
4 byte | “FLIF” | Magic |
4 bit | 3 = ni ακόμα; 4 = εγώ ακόμα; 5 = ni anim; 6 = i anim | Διασύνδεση, κινούμενη εικόνα |
4 bit | 1 = Κλίμακα του γκρι; 3 = RGB; 4 = RGBA | Αριθμός καναλιών (nb_channels) |
1 byte | ‘0’,‘1’,‘2’ (‘0’=προσαρμοσμένο) | Byte ανά κανάλι (Bpc) |
varint | width-1 | Width |
varint | ύψος-1 | Ύψος |
varint | nb_frames-2 (μόνο αν κινούμενα σχέδια) | Αριθμός καρέ (nb_frames) |
Τεμάχια μεταδεδομένων
Αυτό το τμήμα περιέχει μεταδεδομένα χωρίς εικονοστοιχεία, όπως μεταδεδομένα Exif/XMP, προφίλ χρώματος ICC κ.λπ. που κωδικοποιούνται με συμπίεση DEFLATE. Αυτά τα κομμάτια ορίζονται παρόμοια με τα κομμάτια PNG με τη διαφορά ότι το μέγεθος του τσοκ κωδικοποιείται με έναν μεταβλητό αριθμό byte. Τα ονόματα των κομματιών μπορεί να είναι 4 γράμματα (4 byte) ή μια τιμή κάτω από 32 που υποδεικνύει ένα μη προαιρετικό κομμάτι.
Το παρακάτω είναι ένα παράδειγμα προαιρετικών τσοκ:
Όνομα κομματιού | Περιγραφή | Περιεχόμενο (μετά από DEFLATE-αποσυμπίεση) |
---|---|---|
iCCP | Προφίλ χρώματος ICC | ακατέργαστα δεδομένα προφίλ χρώματος ICC |
eXif | Μεταδεδομένα Exif | Επικεφαλίδα “Exif\0\0” ακολουθούμενη από μια κεφαλίδα TIFF και τα δεδομένα EXIF |
eXmp | μεταδεδομένα XMP | Το XMP περιέχεται σε ένα xpacket μόνο για ανάγνωση χωρίς padding |
Σύμβαση ονομασίας
- Πρώτο γράμμα: Τα κεφαλαία χρησιμοποιούνται για κρίσιμα και τα πεζά για μη κρίσιμα κομμάτια.
- Δεύτερο γράμμα: Τα κεφαλαία χρησιμοποιούνται για δημόσια και τα πεζά για ιδιωτικά κομμάτια
- Τρίτο γράμμα: Το κεφαλαίο χρησιμοποιείται για τα τσοκ που χρειάζονται για να εμφανιστεί σωστά η εικόνα και τα πεζά δεν είναι σημαντικά για την εμφάνιση της εικόνας.
- Τέταρτο γράμμα: Το κεφαλαίο χρησιμοποιείται για τσοκ που μπορούν να αντιγραφούν με ασφάλεια τυφλά. Τα τσοκ με πεζά γράμματα εξαρτώνται από τα δεδομένα εικόνας.
Δεύτερη κεφαλίδα
Αυτό περιέχει τις πληροφορίες σχετικά με την πραγματική κωδικοποίηση των pixel.
Τύπος | Περιγραφή | Κατάσταση | Προεπιλεγμένη τιμή |
---|---|---|---|
1 byte | NUL byte (0x00), όνομα κομματιού μιας ροής bit FLIF16 | ||
uni_int(1,16) | Bits ανά pixel των καναλιών | Bpc == ‘0’: repeat(nb_channels) | 8 εάν Bpc == ‘1’, 16 εάν Bpc == ‘2’ |
uni_int(0,1) | Σημαία: alpha_zero | nb_channels > 3 | 0 |
uni_int(0,100) | Αριθμός βρόχων | nb_frames > 1 | |
uni_int(0,60_000) | Καθυστέρηση καρέ σε ms | nb_frames > 1: repeat(nb_frames) | |
uni_int(0,1) | Σημαία: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | cutoff | has_custom_cutoff_and_alpha | 2 |
uni_int(2,128) | άλφα διαιρέτης | has_custom_cutoff_and_alpha | 19 |
uni_int(0,1) | Σημαία: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | Σκύλα | έχει_προσαρμοσμένη_μπίτσα | |
μεταβλητή | Μετασχηματισμοί (βλ. παρακάτω) | ||
uni_int(1) = 0 | Bit δείκτη: έγινε με μετασχηματισμούς | ||
uni_int(0,2) | Αόρατος προγνωστικός εικονοστοιχείων | alpha_zero && interlaced && alpha range περιλαμβάνει μηδέν |
Κανάλια
Αριθμός καναλιού | Περιγραφή |
---|---|
0 | Κόκκινο ή Γκρι |
1 | Πράσινο |
2 | Μπλε |
3 | Άλφα |
Μεταμορφώσεις
Τύπος | Περιγραφή |
---|---|
uni_int(1) = 1 | Bit δείκτη: δεν έχει ολοκληρωθεί ακόμα |
uni_int(0,13) | Αναγνωριστικό μετασχηματισμού |
μεταβλητή | Δεδομένα μετασχηματισμού (εξαρτάται από τον μετασχηματισμό) |
Ο μετασχηματισμός χρησιμοποιείται για την τροποποίηση των δεδομένων εικονοστοιχείων για καλύτερη συμπίεση και για την παρακολούθηση των πραγματικών τιμών εικονοστοιχείων.
Δεδομένα pixel
Αυτό το τμήμα περιέχει τα πραγματικά δεδομένα pixel που κωδικοποιούνται με χρήση κωδικοποίησης εντροπίας MANIAC. Τα εικονοστοιχεία μπορούν να κωδικοποιηθούν με χρήση κωδικοποίησης πλεγμένης ή μη.
Πεπλεγμένη μέθοδος
Σε αυτή τη μέθοδο, ορίζονται επίπεδα ζουμ. Το επίπεδο ζουμ 0 χρησιμοποιείται για την πλήρη εικόνα, το επίπεδο ζουμ 1 χρησιμοποιείται για όλες τις ζυγές σειρές, το επίπεδο ζουμ 2 χρησιμοποιείται για όλες τις ζυγές στήλες του επιπέδου ζουμ 1. Με άλλα λόγια, κάθε ζουμ επίπεδο 2k με ζυγό αριθμό είναι μια κατειλημμένη έκδοση του εικόνα, σε κλίμακα 1:2^k. Τα επίπεδα ζουμ κωδικοποιούνται από το υψηλότερο προς το χαμηλότερο.
Μέθοδος χωρίς διαπλοκή
Σε αυτή τη μέθοδο, η κωδικοποίηση των δέντρων MANIAC ξεκινά αμέσως ακολουθούμενη από την κωδικοποίηση των pixel.