home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compressed Image File Formats
/
CompressedImageFileFormatsJohnMiano.iso
/
mac
/
Specs
/
JFIF.TXT
< prev
next >
Wrap
Text File
|
1998-12-17
|
15KB
|
367 lines
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@c-cube.com
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).
ED. NOTE: Figures are not available in this plain text version of
the specification. See the PostScript version for a figure in this
section.
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.