Le format d'échange de fichiers JPEG ( JFIF ) est une norme de format de fichier image publiée sous la recommandation UIT-T T.871 et la norme ISO/IEC 10918-5. Il définit des spécifications supplémentaires pour le format conteneur qui renferme les données d'image encodées avec l' algorithme JPEG . Les spécifications de base pour un format conteneur JPEG sont définies dans l'annexe B de la norme JPEG, connue sous le nom de format d'échange JPEG (JIF). Le JFIF s'appuie sur le JIF pour résoudre certaines de ses limitations, notamment une complexité inutile, l'alignement des échantillons de composants, la résolution, le rapport hauteur/largeur et l'espace colorimétrique . Le JFIF n'étant pas la norme JPG d'origine, on pourrait s'attendre à un autre type MIME . Cependant, il est toujours enregistré comme « image/jpeg » (indiquant son format de données principal plutôt que les informations modifiées).
Le format JFIF est incompatible avec le format de fichier image échangeable plus récent (Exif).
ISO / IEC 10918-1, Recommandation ITU-T T.81.)Enregistrement d'un exemple de composant
Le format JPEG autorise plusieurs composantes (telles que Y, Cb et Cr ) à avoir des résolutions différentes, mais ne définit pas l'alignement de ces tableaux d'échantillons (qui génèrent les images bitmap). Ces informations de production de pixels sont interprétées en supposant que les rectangles sont indiqués par leur centre de gravité , plutôt que par des données de pixels directes ou par la méthode « premier coin et fond », etc., ce qui est peu courant.
Résolution et format d'image
La norme JPEG ne prévoit aucune méthode de codage de la résolution ou du format d'image. JFIF fournit ces informations grâce à une extension de segment d'application au format JPEG. Ce segment utilise le segment d'application n° 0, dont l'en-tête est constitué de la chaîne de caractères « JFIF » en ASCII, terminée par un caractère nul, suivie d'un octet nul. Il spécifie que ce segment doit être le premier du fichier, ce qui permet d'identifier facilement un fichier JFIF. Les images Exif enregistrées par les appareils photo numériques ne contiennent généralement pas ce segment, mais sont par ailleurs conformes à la norme JFIF.
Espace colorimétrique
La norme JPEG utilisée pour le codage de compression des fichiers JFIF ne spécifie pas l' encodage couleur des images. JFIF définit le modèle colorimétrique : soit Y pour les niveaux de gris, soit YCbCr, dérivé des primaires RGB définies dans la norme CCIR 601 (désormais connue sous le nom de Recommandation ITU-R BT.601), à l'exception d'une mise à l'échelle « gamme complète » différente pour les composantes Y, Cb et Cr. Contrairement à la « gamme studio » définie dans la norme CCIR 601, où le noir est représenté par Y = 16 et le blanc par Y = 235, les valeurs hors de cette plage étant disponibles pour la marge de traitement du signal , JFIF utilise les 256 niveaux de la représentation 8 bits, de sorte que Y = 0 pour le noir et Y = 255 pour le blanc pur. Les primaires RGB définies dans JFIF via la norme CCIR 601 diffèrent également légèrement des pratiques courantes dans les applications plus récentes (par exemple, elles diffèrent légèrement des primaires définies dans la norme sRGB ). De plus, la norme CCIR 601 (avant 2007) ne fournissait pas de définition précise des primaires de couleurs RVB ; elle s'appuyait plutôt sur les pratiques sous-jacentes de l'industrie de la télévision.
L'interprétation des couleurs d'une image JFIF peut être améliorée en intégrant un profil ICC , des métadonnées d'espace colorimétrique ou une balise sRGB , et en utilisant une application qui interprète ces informations.
structure du format de fichier
Un fichier JFIF est constitué d'une séquence de marqueurs ou de segments de marqueurs (pour plus de détails, voir la section « Syntaxe et structure » de la norme JPEG ). Les marqueurs sont définis dans la partie 1 de la norme JPEG . Chaque marqueur est composé de deux octets : un FFoctet suivi d'un octet différent de 000 FFet qui spécifie le type du marqueur. Certains marqueurs sont isolés, mais la plupart indiquent le début d'un segment de marqueur contenant des octets de données selon le modèle suivant :
FF xxs1s2[data bytes]
Les octets s1 et s2 sont combinés pour représenter un entier 16 bits en format big-endian, spécifiant la longueur des octets de données suivants, plus les 2 octets utilisés pour représenter cette longueur. Autrement dit, s1 et s2 spécifient le nombre d' octets de données suivants .
Conformément à la première partie de la norme JPEG, les applications peuvent utiliser des segments marqueurs APP et définir une signification spécifique aux données. La norme JFIF définit les segments marqueurs APP suivants :
- Segment marqueur JFIF APP0 (segment JFIF en abrégé) (obligatoire)
- Segment marqueur APP0 de l'extension JFIF (segment JFXX en abrégé) (facultatif)
Ils sont décrits ci-dessous.
La norme JFIF exige que le segment marqueur JFIF APP0 suive immédiatement le marqueur SOI. Si un segment marqueur d'extension JFIF APP0 est utilisé, il doit suivre immédiatement le segment marqueur JFIF APP0. Un fichier JFIF aura donc la structure suivante :
| structure de fichier JFIF | ||
|---|---|---|
| Segment | Code | Description |
| SOI | FF D8 | Début de l'image |
| JFIF-APP0 | FF E0 s1s2 4A 46 49 46 00 ... | voir ci-dessous |
| JFXX-APP0 | FF E0 s1s2 4A 46 58 58 00 ... | facultatif, voir ci-dessous |
| … des segments de marqueurs supplémentaires (par exemple SOF, DHT, COM) | ||
| SOS | FF DA | Début de l'analyse |
| données d'image compressées | ||
| EOI | FF D9 | Fin de l'image |
Segment marqueur JFIF APP0
Dans le segment de marqueur JFIF APP0 obligatoire, les paramètres de l'image sont spécifiés. Une vignette non compressée peut être intégrée en option.
| Segment marqueur JFIF APP0 | ||
|---|---|---|
| Champ | Taille (octets) | Description |
| Marqueur APP0 | 2 | FF E0 |
| Longueur | 2 | Longueur du segment, marqueur APP0 exclu. |
| Identifiant | 5 | 4A 46 49 46 00= "JFIF" en ASCII , terminé par un octet nul |
| Version JFIF | 2 | Le premier octet indique la version majeure, le deuxième octet indique la version mineure ( 01 02pour la version 1.02). |
| Unités de densité | 1 | Unités pour les champs de densité de pixels suivants
|
| Xdensité | 2 | Densité horizontale de pixels. Ne doit pas être nulle. |
| Densité Y | 2 | Densité verticale de pixels. Doit être différente de zéro. |
| Xthumbnail | 1 | Nombre de pixels horizontaux de la vignette RVB intégrée ci-dessous. Peut être nul. |
| Ythumbnail | 1 | Nombre de pixels verticaux de la vignette RVB intégrée ci-dessous. Peut être nul. |
| Données miniatures | 3 × n | Données de vignettes raster RVB 24 bits non compressées (8 bits par canal de couleur) dans l'ordre R0, G0, B0, ..., Rn-1, Gn-1, Bn-1 ; avec n = Xthumbnail × Ythumbnail |
Segment marqueur APP0 de l'extension JFIF
Immédiatement après le segment marqueur JFIF APP0, un segment marqueur d'extension JFIF APP0 peut être présent. Ce segment est uniquement disponible pour les versions JFIF 1.02 et supérieures. Il permet d'intégrer une image miniature dans trois formats différents.
| Segment marqueur APP0 de l'extension JFIF | ||
|---|---|---|
| Champ | Taille (octets) | Description |
| Marqueur APP0 | 2 | FF E0 |
| Longueur | 2 | Longueur du segment, marqueur APP0 exclu. |
| Identifiant | 5 | 4A 46 58 58 00= "JFXX" en ASCII , terminé par un octet nul |
| Format miniature | 1 | Spécifie le format de données utilisé pour la vignette intégrée suivante :
|
| Données miniatures | variable | Cela dépend du format de la miniature, voir ci-dessous |
Les données de la miniature dépendent du format de la miniature, comme suit :
| Miniature enregistrée au format JPEG | ||
|---|---|---|
| Champ | Taille (octets) | Description |
| SOI | 2 | FF D8 |
| variable | Doit être au format JIF utilisant YCbCr ou simplement Y, et ne doit pas contenir de segments JFIF ou JFXX. | |
| EOI | 2 | FF D9 |
| Miniature stockée en utilisant un octet par pixel | ||
|---|---|---|
| Champ | Taille (octets) | Description |
| Xthumbnail | 1 | Nombre de pixels horizontaux de la vignette intégrée ci-dessous. Doit être différent de zéro. |
| Ythumbnail | 1 | Nombre de pixels verticaux de la vignette intégrée ci-dessous. Doit être différent de zéro. |
| Palette de miniatures | 768 | 256 entrées de palette, chacune contenant une valeur de couleur RVB de 24 bits |
| Données miniatures | n | Un octet par pixel contenant l'index de la couleur dans la palette, avec n = Xthumbnail × Ythumbnail |
| Miniature stockée en utilisant trois octets par pixel | ||
|---|---|---|
| Champ | Taille (octets) | Description |
| Xthumbnail | 1 | Nombre de pixels horizontaux de la vignette intégrée ci-dessous. Doit être différent de zéro. |
| Ythumbnail | 1 | Nombre de pixels verticaux de la vignette intégrée ci-dessous. Doit être différent de zéro. |
| Données miniatures | 3 × n | Données de vignettes raster RVB 24 bits non compressées (8 bits par canal de couleur) dans l'ordre R0, G0, B0, ..., Rn-1, Gn-1, Bn-1 ; avec n = Xthumbnail × Ythumbnail |
Compatibilité
Le format de fichier image échangeable (Exif), plus récent, est comparable à JFIF, mais les deux normes sont incompatibles. En effet, chacune exige que son segment d'application (APP0 pour JFIF, APP1 pour Exif) suive immédiatement le marqueur SOI. Or, en pratique, de nombreux logiciels et appareils photo numériques produisent des fichiers contenant les deux segments d'application. Cela n'affecte pas le décodage de l'image pour la plupart des décodeurs, mais les analyseurs JFIF ou Exif mal conçus peuvent ne pas reconnaître correctement le fichier.
Le format JFIF est compatible avec les extensions « Bloc de ressources d'information » (IRB) JPEG d' Adobe Photoshop et les métadonnées IPTC (Modèle d'échange d'informations) , car il n'exclut pas d'autres segments d'application et les extensions Photoshop ne sont pas obligées d'être les premières dans le fichier. Cependant, Photoshop enregistre généralement les tampons CMJN sous forme de fichiers « JPEG Adobe » à quatre composantes, non conformes au format JFIF. Ces fichiers n'étant pas dans l'espace colorimétrique YCbCr, ils ne sont généralement pas décodables par les navigateurs Web et autres logiciels Internet.
Histoire
L’élaboration du document JFIF a été menée par Eric Hamilton de C-Cube Microsystems , et un accord sur la première version a été conclu fin 1991 lors d’une réunion organisée chez C-Cube, rassemblant une quarantaine de représentants de diverses entreprises des secteurs de l’informatique, des télécommunications et de l’imagerie. Peu après, une révision mineure a été publiée : JFIF 1.01. Pendant près de 20 ans, la dernière version disponible était la v1.02, publiée le 1er septembre 1992.
En 1996, la RFC 2046 a spécifié que le format d'image utilisé pour la transmission d'images JPEG sur Internet devait être JFIF. Le type MIME « image/jpeg » devait être encodé en JFIF. En pratique, cependant, la quasi-totalité des logiciels Internet peuvent décoder n'importe quelle image JIF de base utilisant des composantes Y ou YCbCr, qu'elle soit conforme ou non à la norme JFIF.
Au fil du temps, C-Cube a été restructuré (et a finalement donné naissance à Harmonic , LSI Logic , Magnum Semiconductor , Avago Technologies , Broadcom , GigOptix, GigPeak, etc.), et s'est désintéressé du document. La spécification est restée sans éditeur officiel jusqu'à ce qu'elle soit reprise par ECMA International et le Groupe d'experts photographiques conjoint UIT-T/ISO/CEI vers 2009 afin d'éviter qu'elle ne tombe dans l'oubli, de permettre sa citation formelle dans les publications normalisées et d'améliorer sa qualité éditoriale. Elle a été publiée par ECMA en 2009 sous le numéro de rapport technique 98 afin d'en préserver la trace historique , puis normalisée formellement par l'UIT-T en 2011 sous la recommandation T.871 et par l'ISO/CEI en 2013 sous la norme ISO/CEI 10918-5 Ces publications plus récentes incluaient des améliorations éditoriales, mais aucune modification technique substantielle.