355 lines
15 KiB
Plaintext
355 lines
15 KiB
Plaintext
![]() |
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
JPEG File Interchange Format
|
|||
|
Version 1.02
|
|||
|
|
|||
|
|
|||
|
September 1, 1992
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Eric Hamilton
|
|||
|
C-Cube Microsystems
|
|||
|
1778 McCarthy Blvd.
|
|||
|
Milpitas, CA 95035
|
|||
|
|
|||
|
+1 408 944-6300
|
|||
|
Fax: +1 408 944-6314
|
|||
|
E-mail: eric@c3.pla.ca.us
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
JPEG File Interchange Format
|
|||
|
Version 1.02
|
|||
|
|
|||
|
Why a File Interchange Format
|
|||
|
|
|||
|
JPEG File Interchange Format is a minimal file format which enables JPEG bitstreams to
|
|||
|
be exchanged between a wide variety of platforms and applications. This minimal format
|
|||
|
does not include any of the advanced features found in the TIFF JPEG specification or any
|
|||
|
application specific file format. Nor should it, for the only purpose of this simplified
|
|||
|
format is to allow the exchange of JPEG compressed images.
|
|||
|
|
|||
|
JPEG File Interchange Format features
|
|||
|
|
|||
|
o Uses JPEG compression
|
|||
|
o Uses JPEG interchange format compressed image representation
|
|||
|
o PC or Mac or Unix workstation compatible
|
|||
|
o Standard color space: one or three components. For three components, YCbCr
|
|||
|
(CCIR 601-256 levels)
|
|||
|
o APP0 marker used to specify Units, X pixel density, Y pixel density, thumbnail
|
|||
|
o APP0 marker also used to specify JFIF extensions
|
|||
|
o APP0 marker also used to specify application-specific information
|
|||
|
|
|||
|
JPEG Compression
|
|||
|
|
|||
|
Although any JPEG process is supported by the syntax of the JPEG File Interchange Format
|
|||
|
(JFIF) it is strongly recommended that the JPEG baseline process be used for the purposes
|
|||
|
of file interchange. This ensures maximum compatibility with all applications supporting
|
|||
|
JPEG. JFIF conforms to the JPEG Draft International Standard (ISO DIS 10918-1).
|
|||
|
|
|||
|
The JPEG File Interchange Format is entirely compatible with the standard JPEG
|
|||
|
interchange format; the only additional requirement is the mandatory presence of the
|
|||
|
APP0 marker right after the SOI marker. Note that JPEG interchange format requires (as
|
|||
|
does JFIF) that all table specifications used in the encoding process be coded in the
|
|||
|
bitstream prior to their use.
|
|||
|
|
|||
|
Compatible across platforms
|
|||
|
|
|||
|
The JPEG File Interchange Format is compatible across platforms: for example, it does not
|
|||
|
use any resource forks, supported by the Macintosh but not by PCs or workstations.
|
|||
|
|
|||
|
|
|||
|
Standard color space
|
|||
|
|
|||
|
The color space to be used is YCbCr as defined by CCIR 601 (256 levels). The RGB
|
|||
|
components calculated by linear conversion from YCbCr shall not be gamma corrected
|
|||
|
(gamma = 1.0). If only one component is used, that component shall be Y.
|
|||
|
|
|||
|
APP0 marker used to identify JPEG FIF
|
|||
|
|
|||
|
The APP0 marker is used to identify a JPEG FIF file. The JPEG FIF APP0 marker is
|
|||
|
mandatory right after the SOI marker.
|
|||
|
|
|||
|
The JFIF APP0 marker is identified by a zero terminated string: "JFIF". The APP0 can be
|
|||
|
used for any other purpose by the application provided it can be distinguished from the
|
|||
|
JFIF APP0.
|
|||
|
|
|||
|
The JFIF APP0 marker provides information which is missing from the JPEG stream:
|
|||
|
version number, X and Y pixel density (dots per inch or dots per cm), pixel aspect ratio
|
|||
|
(derived from X and Y pixel density), thumbnail.
|
|||
|
|
|||
|
APP0 marker used to specify JFIF extensions
|
|||
|
|
|||
|
Additional APP0 marker segment(s) can optionally be used to specify JFIF extensions. If
|
|||
|
used, these segment(s) must immediately follow the JFIF APP0 marker. Decoders should
|
|||
|
skip any unsupported JFIF extension segments and continue decoding.
|
|||
|
|
|||
|
The JFIF extension APP0 marker is identified by a zero terminated string: "JFXX". The
|
|||
|
JFIF extension APP0 marker segment contains a 1-byte code which identifies the extension.
|
|||
|
This version, version 1.02, has only one extension defined: an extension for defining
|
|||
|
thumbnails stored in formats other than 24-bit RGB.
|
|||
|
|
|||
|
APP0 marker used for application-specific information
|
|||
|
|
|||
|
Additional APP0 marker segments can be used to hold application-specific information
|
|||
|
which does not affect the decodability or displayability of the JFIF file. Application-
|
|||
|
specific APP0 marker segments must appear after the JFIF APP0 and any JFXX APP0
|
|||
|
segments. Decoders should skip any unrecognized application-specific APP0 segments.
|
|||
|
|
|||
|
Application-specific APP0 marker segments are identified by a zero terminated string
|
|||
|
which identifies the application (not "JFIF" or "JFXX"). This string should be an
|
|||
|
organization name or company trademark. Generic strings such as dog, cat, tree, etc.
|
|||
|
should not be used.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Conversion to and from RGB
|
|||
|
|
|||
|
Y, Cb, and Cr are converted from R, G, and B as defined in CCIR Recommendation 601
|
|||
|
but are normalized so as to occupy the full 256 levels of a 8-bit binary encoding. More
|
|||
|
precisely:
|
|||
|
|
|||
|
Y = 256 * E'y
|
|||
|
Cb = 256 * [ E'Cb ] + 128
|
|||
|
Cr = 256 * [ E'Cr ] + 128
|
|||
|
|
|||
|
where the E'y, E'Cb and E'Cb are defined as in CCIR 601. Since values of E'y have a
|
|||
|
range of 0 to 1.0 and those for E'Cb and E'Cr have a range of -0.5 to +0.5, Y, Cb, and Cr
|
|||
|
must be clamped to 255 when they are maximum value.
|
|||
|
|
|||
|
RGB to YCbCr Conversion
|
|||
|
|
|||
|
YCbCr (256 levels) can be computed directly from 8-bit RGB as follows:
|
|||
|
|
|||
|
Y = 0.299 R + 0.587 G + 0.114 B
|
|||
|
Cb = - 0.1687 R - 0.3313 G + 0.5 B + 128
|
|||
|
Cr = 0.5 R - 0.4187 G - 0.0813 B + 128
|
|||
|
|
|||
|
NOTE - Not all image file formats store image samples in the order R0, G0,
|
|||
|
B0, ... Rn, Gn, Bn. Be sure to verify the sample order before converting an
|
|||
|
RGB file to JFIF.
|
|||
|
|
|||
|
|
|||
|
YCbCr to RGB Conversion
|
|||
|
|
|||
|
RGB can be computed directly from YCbCr (256 levels) as follows:
|
|||
|
|
|||
|
R = Y + 1.402 (Cr-128)
|
|||
|
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
|
|||
|
B = Y + 1.772 (Cb-128)
|
|||
|
|
|||
|
|
|||
|
Image Orientation
|
|||
|
|
|||
|
In JFIF files, the image orientation is always top-down. This means that the first image
|
|||
|
samples encoded in a JFIF file are located in the upper left hand corner of the image and
|
|||
|
encoding proceeds from left to right and top to bottom. Top-down orientation is used for
|
|||
|
both the full resolution image and the thumbnail image.
|
|||
|
|
|||
|
The process of converting an image file having bottom-up orientation to JFIF must include
|
|||
|
inverting the order of all image lines before JPEG encoding
|
|||
|
|
|||
|
|
|||
|
Spatial Relationship of Components
|
|||
|
|
|||
|
Specification of the spatial positioning of pixel samples within components relative to the
|
|||
|
samples of other components is necessary for proper image post processing and accurate
|
|||
|
image presentation. In JFIF files, the position of the pixels in subsampled components are
|
|||
|
defined with respect to the highest resolution component. Since components must be
|
|||
|
sampled orthogonally (along rows and columns), the spatial position of the samples in a
|
|||
|
given subsampled component may be determined by specifying the horizontal and vertical
|
|||
|
offsets of the first sample, i.e. the sample in the upper left corner, with respect to the
|
|||
|
highest resolution component.
|
|||
|
|
|||
|
The horizontal and vertical offsets of the first sample in a subsampled component,
|
|||
|
Xoffseti[0,0] and Yoffseti[0,0], is defined to be
|
|||
|
|
|||
|
Xoffseti[0,0] = ( Nsamplesref / Nsamplesi ) / 2 - 0.5
|
|||
|
Yoffseti[0,0] = ( Nlinesref / Nlinesi ) / 2 - 0.5
|
|||
|
|
|||
|
where
|
|||
|
Nsamplesref is the number of samples per line in the largest component,
|
|||
|
Nsamplesi is the number of samples per line in the ith component,
|
|||
|
Nlinesref is the number of lines in the largest component,
|
|||
|
Nlinesi is the number of lines in the ith component.
|
|||
|
|
|||
|
Proper subsampling of components incorporates an anti-aliasing filter which reduces the
|
|||
|
spectral bandwidth of the full resolution components. Subsampling can easily be
|
|||
|
accomplished using a symmetrical digital filter with an even number of taps (coefficients).
|
|||
|
A commonly used filter for 2:1 subsampling utilizes two taps (1/2,1/2).
|
|||
|
|
|||
|
NOTE - This definition is compatible with industry standards such as Postcript
|
|||
|
Level 2 and QuickTime. This defintition is not compatible with the conventions
|
|||
|
used by CCIR Recommendation 601-1 and other digital video formats. For these
|
|||
|
formats, pre-processing of the chrominance components is necessary prior to
|
|||
|
compression in order to ensure accurate reconstruction of the compressed image.
|
|||
|
|
|||
|
|
|||
|
JPEG File Interchange Format Specification
|
|||
|
|
|||
|
The syntax of a JFIF file conforms to the syntax for interchange format defined in Annex B
|
|||
|
of ISO DIS 10918-1. In addition, a JFIF file uses APP0 marker segments and constrains
|
|||
|
certain parameters in the frame header as defined below.
|
|||
|
|
|||
|
X'FF', SOI
|
|||
|
X'FF', APP0, length, identifier, version, units, Xdensity, Ydensity, Xthumbnail,
|
|||
|
Ythumbnail, (RGB)n
|
|||
|
length (2 bytes) Total APP0 field byte count, including the byte
|
|||
|
count value (2 bytes), but excluding the APP0
|
|||
|
marker itself
|
|||
|
identifier (5 bytes) = X'4A', X'46', X'49', X'46', X'00'
|
|||
|
This zero terminated string ("JFIF") uniquely
|
|||
|
identifies this APP0 marker. This string shall
|
|||
|
have zero parity (bit 7=0).
|
|||
|
version (2 bytes) = X'0102'
|
|||
|
The most significant byte is used for major
|
|||
|
revisions, the least significant byte for minor
|
|||
|
revisions. Version 1.02 is the current released
|
|||
|
revision.
|
|||
|
units (1 byte) Units for the X and Y densities.
|
|||
|
units = 0: no units, X and Y specify the pixel
|
|||
|
aspect ratio
|
|||
|
units = 1: X and Y are dots per inch
|
|||
|
units = 2: X and Y are dots per cm
|
|||
|
Xdensity (2 bytes) Horizontal pixel density
|
|||
|
Ydensity (2 bytes) Vertical pixel density
|
|||
|
Xthumbnail (1 byte) Thumbnail horizontal pixel count
|
|||
|
Ythumbnail (1 byte) Thumbnail vertical pixel count
|
|||
|
(RGB)n (3n bytes) Packed (24-bit) RGB values for the thumbnail
|
|||
|
pixels, n = Xthumbnail * Ythumbnail
|
|||
|
[ Optional JFIF extension APP0 marker segment(s) - see below ]
|
|||
|
o
|
|||
|
o
|
|||
|
o
|
|||
|
X'FF', SOFn, length, frame parameters
|
|||
|
Number of components Nf = 1 or 3
|
|||
|
1st component C1 = 1 = Y component
|
|||
|
2nd component C2 = 2 = Cb component
|
|||
|
3rd component C3 = 3 = Cr component
|
|||
|
o
|
|||
|
o
|
|||
|
o
|
|||
|
X'FF', EOI
|
|||
|
|
|||
|
JFIF Extension APP0 Marker Segment
|
|||
|
|
|||
|
Immediately following the JFIF APP0 marker segment may be a JFIF extension APP0
|
|||
|
marker. This JFIF extension APP0 marker segment may only be present for JFIF versions
|
|||
|
1.02 and above. The syntax of the JFIF extension APP0 marker segment is:
|
|||
|
|
|||
|
X'FF', APP0, length, identifier, extension_code, extension_data
|
|||
|
length (2 bytes) Total APP0 field byte count, including the byte
|
|||
|
count value (2 bytes), but excluding the APP0
|
|||
|
marker itself
|
|||
|
identifier (5 bytes) = X'4A', X'46', X'58', X'58', X'00'
|
|||
|
This zero terminated string ("JFXX") uniquely
|
|||
|
identifies this APP0 marker. This string shall
|
|||
|
have zero parity (bit 7=0).
|
|||
|
extension_code (1 byte) = Code which identifies the extension. In this
|
|||
|
version, the following extensions are defined:
|
|||
|
= X'10' Thumbnail coded using JPEG
|
|||
|
= X'11' Thumbnail stored using 1 byte/pixel
|
|||
|
= X'13' Thumbnail stored using 3 bytes/pixel
|
|||
|
extension_data (variable) = The specification of the remainder of the JFIF
|
|||
|
extension APP0 marker segment varies with the
|
|||
|
extension. See below for a specification of
|
|||
|
extension_data for each extension.
|
|||
|
|
|||
|
JFIF Extension: Thumbnail coded using JPEG
|
|||
|
|
|||
|
This extension supports thumbnails compressed using JPEG. The compressed thumbnail
|
|||
|
immediately follows the extension_code (X'10') in the extension_data field and the length
|
|||
|
of the compressed data must be included in the JFIF extension APP0 marker length field.
|
|||
|
|
|||
|
The syntax of the extension_data field conforms to the syntax for interchange format defined
|
|||
|
in Annex B of ISO DIS 10918-1. However, no "JFIF" or "JFXX" marker segments shall
|
|||
|
be present. As in the full resolution image of the JFIF file, the syntax of extension_data
|
|||
|
constrains parameters in the frame header as defined below:
|
|||
|
|
|||
|
X'FF', SOI
|
|||
|
o
|
|||
|
o
|
|||
|
o
|
|||
|
X'FF', SOFn, length, frame parameters
|
|||
|
Number of components Nf = 1 or 3
|
|||
|
1st component C1 = 1 = Y component
|
|||
|
2nd component C2 = 2 = Cb component
|
|||
|
3rd component C3 = 3 = Cr component
|
|||
|
o
|
|||
|
o
|
|||
|
o
|
|||
|
X'FF', EOI
|
|||
|
|
|||
|
|
|||
|
|
|||
|
JFIF Extension: Thumbnail stored using one byte per pixel
|
|||
|
|
|||
|
This extension supports thumbnails stored using one byte per pixel and a color palette in
|
|||
|
the extension_data field. The syntax of extension_data is:
|
|||
|
|
|||
|
Xthumbnail (1 byte) Thumbnail horizontal pixel count
|
|||
|
Ythumbnail (1 byte) Thumbnail vertical pixel count
|
|||
|
palette (768 bytes) 24-bit RGB pixel values for the color palette.
|
|||
|
The RGB values define the colors represented by
|
|||
|
each value of an 8-bit binary encoding (0 - 255).
|
|||
|
(pixel)n (n bytes) 8-bit values for the thumbnail pixels
|
|||
|
n = Xthumbnail * Ythumbnail
|
|||
|
|
|||
|
JFIF Extension: Thumbnail stored using three bytes per pixel
|
|||
|
|
|||
|
This extension supports thumbnails stored using three bytes per pixel in the extension_data
|
|||
|
field. The syntax of extension_data is:
|
|||
|
|
|||
|
Xthumbnail (1 byte) Thumbnail horizontal pixel count
|
|||
|
Ythumbnail (1 byte) Thumbnail vertical pixel count
|
|||
|
(RGB)n (3n bytes) Packed (24-bit) RGB values for the thumbnail
|
|||
|
pixels, n = Xthumbnail * Ythumbnail
|
|||
|
|
|||
|
Useful tips
|
|||
|
|
|||
|
o you can identify a JFIF file by looking for the following sequence: X'FF', SOI, X'FF',
|
|||
|
APP0, <2 bytes to be skipped>, "JFIF", X'00'.
|
|||
|
|
|||
|
o if you use APP0 elsewhere, be sure not to have the strings "JFIF" or "JFXX" right after
|
|||
|
the APP0 marker.
|
|||
|
|
|||
|
o if you do not want to include a thumbnail, just program Xthumbnail = Ythumbnail = 0.
|
|||
|
|
|||
|
o be sure to check the version number in the special APP0 field. In general, if the major
|
|||
|
version number of the JFIF file matches that supported by the decoder, the file will be
|
|||
|
decodable.
|
|||
|
|
|||
|
o if you only want to specify a pixel aspect ratio, put 0 for the units field in the special
|
|||
|
APP0 field. Xdensity and Ydensity can then be programmed for the desired aspect ratio.
|
|||
|
Xdensity = 1, Ydensity = 1 will program a 1:1 aspect ratio. Xdensity and Ydensity should
|
|||
|
always be non-zero.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|