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.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|