Συστατικά Μέρη του Αρχείου

 

ΕΠΙΚΕΦΑΛΙΔΑ ΑΡΧΕΙΟΥ ΕΙΚΟΝΑΣ (Image File Header-IFH)

 To TIFF ανεξαρτήτως της πολυπλοκότητας του, έχει την απλούστερη επικεφαλίδα. Η TIFF Επικεφαλίδα Αρχείου Εικόνας (IFH) περιλαμβάνει τρία πεδία πληροφορίας και είναι ένα σύνολο μήκους μόνο 8 bytes.

 

typedef struct_Tiffheader

  {

   WORD Identifier ; /*Αναγνωριστικό της σειράς-των-bytes*/

   WORD Version ;  /*Αριθμός έκδοσης του TIFF (πάντα 2Ah) * /

    DWORD IFDOffset /* Το offset του πρώτου IFD * /

   }  TIFHEAD  ;

 

H μεταβλητή Identifier περιέχει είτε την τιμή 4949h (II) είτε 4D4Dh  (MM). Αυτές οι τιμές δείχνουν αν τα δεδομένα στο TIFF αρχείο είναι γραμμένα με little-endian (Intel format) ή big-endian (Motorola format), αντιστοίχως. Όλα τα δεδομένα αντιμετωπίζονται πέρα από τα δύο πρώτα bytes στο αρχείο πειθαρχώντας στο σχήμα ταξινόμησης - των bytes που ορίζεται από αυτό το πεδίο. Αυτές οι δύο, οι τιμές επιλέχθηκαν επειδή αυτές πάντα θα είναι ίδιες, άσχετα από την σειρά των bytes του αρχείου.

 Η μεταβλητή Version, σύμφωνα με τον προσδιορισμό TIFF, περιέχει τον αριθμό έκδοσης του TIFF format. Αυτός ο αριθμός έκδοσης είναι πάντα 42, άσχετα με την βελτιωμένη έκδοση TIFF, έτσι θα πρέπει να λαμβάνεται περισσότερο ως αναγνωστικός αριθμός παρά ως ένας αριθμός έκδοσης.

Ένας εύκολος τρόπος για να ελέγξουμε αν ένα αρχείο είναι πραγματικά ένα TIFF αρχείο, είναι να διαβάσουμε τα πρώτα τέσσερα bytes του αρχείου. Αν αυτά είναι :

     49h 49h 2Ah 00h

ή   4Dh 4Dh 00h 2Ah

τότε είναι σχεδόν σίγουρο ότι έχουμε ένα TIFF αρχείο.

Η μεταβλητή IFDOffset είναι μία 32-bit τιμή, όπου είναι η offset θέση του πρώτου καταλόγου αρχείου εικόνας στο TIFF αρχείο. Αυτή η τιμή μπορεί να περαστεί ως μια παράμετρος σε μία συνάρτηση ψαξίματος ενός αρχείου, για να βρει την αρχή των πληροφοριών του αρχείου εικόνας. Αν το IFD βρίσκεται ακριβώς μετά την επικεφαλίδα, η τιμή του IFDOffset είναι 08 h.

 

 ΚΑΤΑΛΟΓΟΣ ΑΡΧΕΙΟΥ ΕΙΚΟΝΑΣ (Image File Directory-IFD)

 Ένας Κατάλογος Αρχείου Εικόνας IFD είναι μια συλλογή πληροφοριών παρόμοιος με μια επικεφαλίδα, και χρησιμοποιείται για να περιγράψει τα raster δεδομένα με τα οποία συνδέεται. Περιέχει πληροφορίες σχετικά με το ύψος, πλάτος και βάθος της εικόνας, τον αριθμό των χρωματικών επιπέδων και τον τύπο της συμπίεσης που χρησιμοποιείται στα raster δεδομένα. Αντίθετα με μια τυπική, στατική επικεφαλίδα, ένα IFD είναι δυναμικό και μπορεί να ποικίλει σε μέγεθος, ακόμα μπορεί να βρεθεί οπουδήποτε μέσα σ’ ένα TIFF αρχείο ενώ περισσότερα του ενός IFD, μπορούν να υπάρχουν μέσα σ` ένα αρχείο. Η μορφή ενός IFD φαίνεται στο σχήμα TIFF - Ι

Μία εσφαλμένη εντύπωση για το TIFF, είναι ότι η πληροφορία που αποθηκεύεται στις IFD ετικέτες, είναι στην πραγματικότητα μέρος της επικεφαλίδας του TIFF. Στην πραγματικότητα, ενώ είναι αλήθεια ότι τα άλλα formats αποθηκεύουν στην επικεφαλίδα τον τύπο της πληροφορίας που βρίσκεται στο IFD, η επικεφαλίδα του TIFF δεν περιέχει αυτή την πληροφορία. Ωστόσο, είναι πιθανόν να θεωρήσεις το IFD στο TIFF αρχείο ως μια προέκταση της επικεφαλίδας του.

Ένα TIFF αρχείο μπορεί να περιέχει οποιονδήποτε αριθμό εικόνων. Κάθε εικόνα θεωρείται ως ένα ξεχωριστό υπό-αχρείο, το οποίο είναι ένα raster, και έχει ένα IFD που περιγράφει τα raster δεδομένα. Κάθε, TIFF υπό-αρχείο μπορεί  να γράφει ως ένα ξεχωριστό TIFF αρχείο. Κάθε raster υπό-αρχείο και IFD μπορεί να υπάρχει οπουδήποτε στο TIFF αρχείο μετά τις επικεφαλίδες και μπορεί να υπάρχει μόνο ένα IFD ανά εικόνα.

Αυτό μπορεί να ακούγεται μπερδεμένο, αλλά δεν είναι πραγματικά. Έχουμε δει ότι η TIFF επικεφαλίδα περιέχει μια offset τιμή που δείχνει την θέση του πρώτου IFD στο TIFF αρχείο. Για να βρούμε το IFD, αυτό που πρέπει να κάνουμε είναι να ψάξουμε σ` αυτό το offset και να διαβάσουμε την πληροφορία του IFD. Το τελευταίο πεδίο κάθε IFD περιέχει μία offset τιμή για το επόμενο IFD, αν υπάρχει. Αν  η offset τιμή του IFD είναι 00h, τότε δεν υπάρχουν περισσότερες εικόνες για διάβασμα στο TIFF αρχείο.

Ένα IFD μπορεί να ποικίλει σε μέγεθος, επειδή μπορεί να περιέχει ένα μεταβλητό αριθμό εγγραφών δεδομένων, που ονομάζονται ετικέτες (tags). Κάθε ετικέτα περιέχει ένα μοναδικό κομμάτι πληροφορίας ακριβώς όπως τα πεδία μέσα σε μία επικεφαλίδα. Ωστόσο, υπάρχει μια διαφορά : οι ετικέτες μπορούν να προστεθούν και να διαγραφούν, από ένα IFDμε πολύ μεγάλη ευκολία - ενώ τα πεδία μιας τροποποίησης επικεφαλίδας, απ’ την άλλη μεριά, είναι σταθερά κι αμετακίνητα. Επίσης ο αριθμός των ετικετών που βρίσκονται μέσα σ` ένα IFD μπορεί να ποικίλει, ενώ ο αριθμός των πεδίων σ’ ένα τύπο επικεφαλίδας είναι σταθερός.

 Η μορφή ενός καταλόγου αρχείου εικόνας φαίνεται στην παρακάτω δομή.

 Typedef struct_TifIfd

   {

     WORD NumDirEntries; /*Αριθμός ετικετών στο IFD */

     TIFTAG TagLIst[ ];    /* Πίνακας ετικετών */

     DWORD Next IFDOffset;  /*Το offset του επόμενου IFD */

   }   TIFIFD ;

Η μεταβλητή NumDirEntries, είναι μία 2-byte τιμή που δηλώνει τον αριθμό των ετικετών που υπάρχουν στο IFD.Κάθε δομή ετικέτας είναι μεγέθους 12-bytes και στον κώδικα παραπάνω αναπαριστάται, από έναν πίνακα από δομές δεδομένων τύπου TIFTAG.Ο αριθμός των ετικετών ανά IFD περιορίζεται σε 65535.

Η μεταβλητή NEXTIFDOffset περιέχει την offset θέση, της αρχής του επόμενου IFD. Αν δεν υπάρχουν περισσότερα IFD, τότε η τιμή του πεδίου αυτού είναι 00h.

 

ΕΤΙΚΕΤΕΣ

 Όπως αναφερθήκαμε προηγουμένως, η ετικέτα μπορεί να θεωρηθεί ως ένα πεδίο δεδομένων σ` ένα αρχείο επικεφαλίδας. Αν και γνωρίζουμε ότι ένα πεδίο δεδομένων επικεφαλίδας μπορεί να περιέχει δεδομένα μόνο ενός σταθερού μεγέθους και τα οποία είναι συνήθως τοποθετημένα μόνο σε μια σταθερή θέση μέσα σ’ ένα αρχείο επικεφαλίδας, ωστόσο μία ετικέτα μπορεί να περιέχει ή να δείχνει τα δεδομένα που έχουν μέγεθος οποιονδήποτε αριθμό bytes και είναι τοποθετημένα οπουδήποτε μέσα σ’ ένα IFD.

H πολυμορφία των ετικετών TIFF, πληρώνεται με το τίμημα του μεγέθους του. Ένα πεδίο επικεφαλίδας που χρησιμοποιείται για να κρατάει ένα byte δεδομένων πρέπει να έχει μέγεθος μόνο ένα byte.Μια ετικέτα που περιέχει ένα byte πληροφορίας, πρέπει πάντα να έχει μέγεθος δώδεκα !! bytes.

Μία TIFF ετικέτα έχει την παρακάτω 12-byte δομή.

 

Typedef struct_TifTag

     {

      WORD TafId;  /*Aναγνωριστικό ετικέτας */

      WORD DataType;  /*Βαθμωτός τύπος δεδομένων */

      DWORD DataCount;  /*Αριθμός πραγμάτων που αναφέρεται η Ετικέτα*/

      DWORD DataOffset; /* Το offset στα δεδομένα*/

     }   TIFTAG ;

 

Η μεταβλητή TaflId είναι μια αναγνωριστική αριθμητική τιμή, για τον τύπο της πληροφορίας που περιέχει η ετικέτα. Πιο συγκεκριμένα, η TagId δηλώνει τι αναπαριστά η πληροφορία της ετικέτας. Τυπικές πληροφορίες που βρίσκονται σε κάθε TIFF αρχείο, συμπεριλαμβανομένων του ύψους, του πλάτους της εικόνας, του βάθους κάθε pixel και του τύπου της κωδικοποίησης των δεδομένων που χρησιμοποιείται για την συμπίεση των raster δεδομένων. Οι ετικέτες φυσιολογικά δηλώνοντας από τις TagId τιμές τους και πρέπει πάντα να είναι γραμμένες σ` ένα IFD κατά αύξουσα σειρά των τιμών που βρίσκονται σε πεδίο του TagId.

H μεταβλητή Data Type περιέχει μία τιμή που δηλώνει τον βαθμωτό τύπο των δεδομένων που βρίσκονται σε μια ετικέτα. Οι τιμές που υποστηρίζονται είναι οι παρακάτω.

 

1

BYTE                    

8-bit μη προσημασμένος ακέραιος

2

3

ASCII

SHORT                                            

8-bit συμβολοσειρά (που τελειώνει με NULL)

16-bit μη προσημασμένος ακέραιος

4

5

LONG

RATIONAL

32-bit μη προσημασμένος ακέραιος

Δύο 32-bit μη προσημασμένοι ακέραιοι

 Ο τύπος δεδομένων  rational είναι στην πραγματικότητα δύο long τιμές και χρησιμοποιούνται για την αποθήκευση των δύο συστατικών μιας κλασματικής τιμής. Η πρώτη τιμή αποθηκεύει τον αριθμητή και η δεύτερη τιμή αποθηκεύει τον παρανομαστή.

 Η έκδοση TIFF 6.0 πρόσθεσε τους παρακάτω νέους τύπους δεδομένων.

6

SBYTE

8-bit προσημασμένος ακέραιος

7

8

UNDEFINE

SSHORT

8-bit byte

16-bit προσημασμένος ακέραιος

9

10

SLONG

SRATIONAL

32-bit προσημασμένος ακέραιος

Δύο  32-bit προσημασμένοι ακέραιοι

1112

FLOAT

DOUBLE

4-byte μονής-ακρίβειας ΙΕΕΕ δεκαδική τιμή

8-byte διπλής-ακρίβειας ΙΕΕΕ δεκαδική τιμή

 Με εξαίρεση τις ετικέτες, SMinSample Value  και SMaxSampleValue  (οι οποίες μπορούν να χρησιμοποιήσουν οποιονδήποτε τύπο δεδομένων), κανένας από τους νέους τύπους δεδομένων δεν χρησιμοποιούνται από κάποιες TIFF 6.0 ετικέτες. Αλλά ωστόσο, αυτές υπάρχουν μόνο σε ιδιωτικές (private) ετικέτες.

H μεταβλητή DataCount δηλώνει τον αριθμό των πραγμάτων που αναφέρονται από την ετικέτα και δεν δείχνει το πραγματικό μέγεθος των δεδομένων. Ωστόσο, αν η DataCount έχει την τιμή 08h, δεν δηλώνει απαραίτητα ότι 8 bytes δεδομένων υπάρχουν στην ετικέτα. Αυτή η τιμή δηλώνει ότι οκτώ πράγματα υπάρχουν για τον τύπο δεδομένων που προσδιορίζεται από αυτή την ετικέτα. Για παράδειγμα, αν DataCount=08h και DataType=03h, δηλώνει (σύμφωνα και με τον παραπάνω πίνακα) ότι τα δεδομένα ετικέτας είναι οκτώ συνεχείς 16-bit μη προσημασμένοι ακέραιοι, ένα σύνολο μεγέθους 32-bytes.

Η μεταβλητή DataOffset είναι μια μεταβλητή 4-bytes, που περιέχει την offset θέση των πραγματικών δεδομένων ετικέτας μέσα σ’ ένα TIFF αρχείο. Αν τα δεδομένα ετικέτας είναι τέσσερα bytes ή μικρότερου μεγέθους, τότε τα δεδομένα μπορεί να βρίσκονται μέσα σ` αυτό το πεδίο. Αν τα δεδομένα ετικέτας έχουν μεγαλύτερο μέγεθος, τότε αυτό το πεδίο περιέχει ένα offset της θέσης των δεδομένων στο TIFF αρχείο. Αποθηκεύοντας δεδομένα μέσα στο πεδίο DataOffset είναι μια βελτιστοποίηση για τον TIFF προσδιορισμό, που όμως δεν απαιτείται να εκτελείται. Τα περισσότερα δεδομένα είναι τυπικά αποθηκευμένα εκτός της ετικέτας και βρίσκονται πριν ή μετά τα IFD.