JPEG File Interchange Format
The JPEG File Interchange Format (JFIF) is an
JFIF is
Purpose
JFIF defines a number of details that are left unspecified by the JPEG Part 1 standard (
Component sample registration
JPEG allows multiple components (such as Y, Cb, and Cr) to have different resolutions, but it does not define how those differing sample arrays (which render bitmaps) should be aligned. This pixel-producing information is rendered with the expectation of indicating rectangles by their centroid, rather than being pixel data directly, or being 'first corner and flood', etc. which is uncommon.
Resolution and aspect ratio
The JPEG standard does not include any method of coding the resolution or aspect ratio of an image. JFIF provides resolution or aspect ratio information using an application segment extension to JPEG. It uses Application Segment #0, with a segment header consisting of the null-terminated string spelling "JFIF" in ASCII followed by a byte equal to 0, and specifies that this must be the first segment in the file, hence making it simple to recognize a JFIF file. Exif images recorded by digital cameras generally do not include this segment, but typically comply in all other respects with the JFIF standard.
Color space
The JPEG standard used for the compression coding in JFIF files does not define which
Color interpretation of a JFIF image may be improved by embedding an ICC profile, colorspace metadata, or an sRGB tag, and using an application that interprets this information.
File format structure
A JFIF file consists of a sequence of markers or marker segments (for details refer to JPEG, Syntax and structure). The markers are defined in part 1 of the JPEG Standard.[1] Each marker consists of two bytes: an FF
byte followed by a byte which is not equal to 00
or FF
and specifies the type of the marker. Some markers stand alone, but most indicate the start of a marker segment that contains data bytes according to the following pattern:
FF xx s1 s2 [data bytes]
The bytes s1 and s2 are taken together to represent a big-endian 16-bit integer specifying the length of the following "data bytes" plus the 2 bytes used to represent the length. In other words, s1 and s2 specify the number of the following data bytes as .
According to part 1 of the JPEG standard, applications can use APP marker segments and define an application specific meaning of the data. In the JFIF standard, the following APP marker segments are defined:
- JFIF APP0 marker segment (JFIF segment for short) (mandatory)
- JFIF extension APP0 marker segment (JFXX segment for short) (optional)
They are described below.
The JFIF standard requires that the JFIF APP0 marker segment immediately follows the SOI marker. If a JFIF extension APP0 marker segment is used, it must immediately follow the JFIF APP0 marker segment.[2] So a JFIF file will have the following structure:
JFIF file structure | ||
---|---|---|
Segment | Code | Description |
SOI | FF D8 |
Start of Image |
JFIF-APP0 | FF E0 s1 s2 4A 46 49 46 00 ... |
see below |
JFXX-APP0 | FF E0 s1 s2 4A 46 58 58 00 ... |
optional, see below |
… additional marker segments (for example SOF, DHT, COM) | ||
SOS | FF DA |
Start of Scan |
compressed image data | ||
EOI | FF D9 |
End of Image |
JFIF APP0 marker segment
In the mandatory JFIF APP0 marker segment the parameters of the image are specified. Optionally an uncompressed thumbnail can be embedded.
JFIF APP0 marker segment | ||
---|---|---|
Field | Size (bytes) | Description |
APP0 marker | 2 | FF E0
|
Length | 2 | Length of segment excluding APP0 marker |
Identifier | 5 | 4A 46 49 46 00 = "JFIF" in ASCII, terminated by a null byte
|
JFIF version | 2 | First byte for major version, second byte for minor version (01 02 for 1.02)
|
Density units | 1 | Units for the following pixel density fields
|
Xdensity | 2 | Horizontal pixel density. Must not be zero |
Ydensity | 2 | Vertical pixel density. Must not be zero |
Xthumbnail | 1 | Horizontal pixel count of the following embedded RGB thumbnail. May be zero |
Ythumbnail | 1 | Vertical pixel count of the following embedded RGB thumbnail. May be zero |
Thumbnail data | 3 × n | Uncompressed 24 bit RGB (8 bits per color channel) raster thumbnail data in the order R0, G0, B0, ... Rn-1, Gn-1, Bn-1; with n = Xthumbnail × Ythumbnail |
JFIF extension APP0 marker segment
Immediately following the JFIF APP0 marker segment may be a JFIF extension APP0 marker segment. This segment may only be present for JFIF versions 1.02 and above. It allows to embed a thumbnail image in 3 different formats.
JFIF extension APP0 marker segment | ||
---|---|---|
Field | Size (bytes) | Description |
APP0 marker | 2 | FF E0
|
Length | 2 | Length of segment excluding APP0 marker |
Identifier | 5 | 4A 46 58 58 00 = "JFXX" in ASCII, terminated by a null byte
|
Thumbnail format | 1 | Specifies what data format is used for the following embedded thumbnail:
|
Thumbnail data | variable | Depends on the thumbnail format, see below |
The thumbnail data depends on the thumbnail format as follows:
Thumbnail stored using JPEG encoding | ||
---|---|---|
Field | Size (bytes) | Description |
SOI | 2 | FF D8
|
variable | Must be JIF format using YCbCr or just Y, and must not contain JFIF or JFXX segments | |
EOI | 2 | FF D9
|
Thumbnail stored using one byte per pixel | ||
---|---|---|
Field | Size (bytes) | Description |
Xthumbnail | 1 | Horizontal pixel count of the following embedded thumbnail. Must not be zero |
Ythumbnail | 1 | Vertical pixel count of the following embedded thumbnail. Must not be zero |
Thumbnail palette | 768 | 256 palette entries, each containing a 24 bit RGB color value |
Thumbnail data | n | One byte per pixel containing the index of the color within the palette,
with n = Xthumbnail × Ythumbnail |
Thumbnail stored using three byte per pixel | ||
---|---|---|
Field | Size (bytes) | Description |
Xthumbnail | 1 | Horizontal pixel count of the following embedded thumbnail. Must not be zero |
Ythumbnail | 1 | Vertical pixel count of the following embedded thumbnail. Must not be zero |
Thumbnail data | 3 × n | Uncompressed 24 bit RGB (8 bits per color channel) raster thumbnail data in the order R0, G0, B0, ... Rn-1, Gn-1, Bn-1; with n = Xthumbnail × Ythumbnail |
Compatibility
The newer
JFIF is compatible with Adobe
History
Development of the JFIF document was led by Eric Hamilton of
In 1996,
As time went by, C-Cube was restructured (and eventually devolved into
See also
References
- ^ a b "Recommendation ITU-T T.81: Information technology – Digital compression and coding of continuous-tone still images – Requirements and guidelines" (PDF). ITU-T (formerly CCITT). 18 February 1992. Retrieved 15 June 2015.
- ^ a b Hamilton, Eric (12 September 1992). "JPEG File Interchange Format, Version 1.02" (pdf, 0.02 MB). Retrieved 15 June 2015.
- ^ a b "JPEG File Interchange Format (JFIF)". ecma-international.org. 2009. Retrieved 15 June 2015.
- ^ "Recommendation ITU-T T.871: Information technology – Digital compression and coding of continuous-tone still images: JPEG File Interchange Format (JFIF)" (PDF). ITU-T. 14 May 2011. Retrieved 15 June 2015.
- ^ "ISO/IEC 10918-5:2013: Information technology – Digital compression and coding of continuous-tone still images: JPEG File Interchange Format (JFIF)". ISO/International Electrotechnical Commission. 1 May 2013. Retrieved 15 June 2015.
Further reading
Books
- Miano, John M, "Compressed Image File Formats"; 1999, Addison-Wesley ISBN 978-0-201-60443-6
- Pennebaker, William B. and ISBN 978-0-442-01272-4
Standards
- Hamilton, Eric: JPEG File Interchange Format, Version 1.02 (PDF, 0.02 MB) 1 September 1992
- Recommendation ITU-T T.871: Information technology – Digital compression and coding of continuous-tone still images: JPEG File Interchange Format (JFIF) (PDF and Microsoft Word, 0.2 MB) Approved 14 May 2011; posted 11 September 2012
- Recommendation ITU-T T.81: Information technology – Digital compression and coding of continuous-tone still images – Requirements and guidelines (PDF and Microsoft Word, 1.5 MB) Approved 18 September 1992; posted 14 April 2004