[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
From: inof@asterix.rz.tu-clausthal.de (Oliver Fromme (TBH))
> I need to be able to get the size and colors from a JPEG/JFIF image file..
> Nothing more, nothing less... Structures would do, regardless of
> language (C, Asm, Pas, Basic). Anyone?
=============================================================================
This file was written by:
Oliver Fromme
Leibnizstr. 18-61
38678 Clausthal
GERMANY
Email: fromme@rz.tu-clausthal.de
General Notes:
~~~~~~~~~~~~~~
- All product names mentioned in this file are trademarks or registered
trademarks of their respective owners.
- This file contains information about the JPEG/JFIF format
- This is NO official documentation, for private purposes only.
There may be bugs and errors in this file. Use the information
on your own risk.
- This file does NOT explain the principles of JPEG coding/decoding,
i.e. DCT/IDCT, quantization, entropy codec. I assume that the reader
is familiar with these algorithms.
- For further information please refer to the JPEG ISO standard.
- The JPEG/JFIF format uses Motorola format for words, NOT Intel format,
i.e. high byte first, low byte last.
JPEG/JFIF file format:
~~~~~~~~~~~~~~~~~~~~~~
- header (2 bytes): $ff, $d8 (SOI) (these two identify a JPEG/JFIF file)
- for JFIF files, an APP0 segment is immediately following the SOI marker,
see below
- any number of "segments" (similar to IFF chunks), see below
- trailer (2 bytes): $ff, $d9 (EOI)
Segment format:
~~~~~~~~~~~~~~~
- header (4 bytes):
$ff identifies segment
n type of segment (one byte)
sh, sl size of the segment, including these two bytes, but not
including the $ff and the type byte. Note, not intel order:
high byte first, low byte last!
- contents of the segment, max. 65533 bytes.
Notes:
- There are parameterless segments (denoted with a '*' below) that DON'T
have a size specification (and no contents), just $ff and the type byte.
- Any number of $ff bytes between segments is legal and must be skipped.
Segment types:
~~~~~~~~~~~~~~
*TEM = $01 usually causes a decoding error, may be ignored
SOF0 = $c0 Start Of Frame (baseline JPEG), for details see below
SOF1 = $c1 dito
SOF2 = $c2 usually unsupported
SOF3 = $c3 usually unsupported
SOF5 = $c5 usually unsupported
SOF6 = $c6 usually unsupported
SOF7 = $c7 usually unsupported
SOF9 = $c9 for arithmetic coding, usually unsupported
SOF10 = $ca usually unsupported
SOF11 = $cb usually unsupported
SOF13 = $cd usually unsupported
SOF14 = $ce usually unsupported
SOF15 = $cf usually unsupported
DHT = $c4 Define Huffman Table, for details see below
JPG = $c8 undefined/reserved (causes decoding error)
DAC = $cc Define Arithmetic Table, usually unsupported
*RST0 = $d0 RSTn are used for resync, may be ignored
*RST1 = $d1
*RST2 = $d2
*RST3 = $d3
*RST4 = $d4
*RST5 = $d5
*RST6 = $d6
*RST7 = $d7
SOI = $d8 Start Of Image
EOI = $d9 End Of Image
SOS = $da Start Of Scan, for details see below
DQT = $db Define Quantization Table, for details see below
DNL = $dc usually unsupported, ignore
DRI = $dd Define Restart Interval, for details see below
DHP = $de ignore (skip)
EXP = $df ignore (skip)
APP0 = $e0 JFIF APP0 segment marker, for details see below
APP15 = $ef ignore
JPG0 = $f0 ignore (skip)
JPG13 = $fd ignore (skip)
COM = $fe Comment, may be ignored
All other segment types are reserved and should be ignored (skipped).
SOF0: Start Of Frame 0:
~~~~~~~~~~~~~~~~~~~~~~~
- $ff, $c0 (SOF0)
- length (high byte, low byte), 8+components*3
- data precision (1 byte) in bits/sample, usually 8 (12 and 16 not
supported by most software)
- image height (2 bytes, Hi-Lo), must be >0 if DNL not supported
- image width (2 bytes, Hi-Lo), must be >0 if DNL not supported
- number of components (1 byte), usually 1 = grey scaled, 3 = color YCbCr
or YIQ, 4 = color CMYK)
- for each component: 3 bytes
- component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q)
- sampling factors (bit 0-3 vert., 4-7 hor.)
- quantization table number
Remarks:
- JFIF uses either 1 component (Y, greyscaled) or 3 components (YCbCr,
sometimes called YUV, colour).
APP0: JFIF segment marker:
~~~~~~~~~~~~~~~~~~~~~~~~~~
- $ff, $e0 (APP0)
- length (high byte, low byte), must be >= 16
- 'JFIF'#0 ($4a, $46, $49, $46, $00), identifies JFIF
- major revision number, should be 1 (otherwise error)
- minor revision number, should be 0..2 (otherwise try to decode anyway)
- units for x/y densities:
0 = no units, x/y-density specify the aspect ratio instead
1 = x/y-density are dots/inch
2 = x/y-density are dots/cm
- x-density (high byte, low byte), should be <> 0
- y-density (high byte, low byte), should be <> 0
- thumbnail width (1 byte)
- thumbnail height (1 byte)
- n bytes for thumbnail (RGB 24 bit), n = width*height*3
Remarks:
- If there's no 'JFIF'#0, or the length is < 16, then it is probably not
a JFIF segment and should be ignored.
- Normally units=0, x-dens=1, y-dens=1, meaning that the aspect ratio is
1:1 (evenly scaled).
- JFIF files including thumbnails are very rare, the thumbnail can usually
be ignored. If there's no thumbnail, then width=0 and height=0.
- If the length doesn't match the thumbnail size, a warning may be
printed, then continue decoding.
DRI: Define Restart Interval:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- $ff, $dd (DRI)
- length (high byte, low byte), must be = 4
- restart interval (high byte, low byte) in units of MCU blocks,
meaning that every n MCU blocks a RSTn marker can be found.
The first marker will be RST0, then RST1 etc, after RST7
repeating from RST0.
DQT: Define Quantization Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- $ff, $db (DQT)
- length (high byte, low byte)
- QT information (1 byte):
bit 0..3: number of QT (0..3, otherwise error)
bit 4..7: precision of QT, 0 = 8 bit, otherwise 16 bit
- n bytes QT, n = 64*(precision+1)
Remarks:
- A single DQT segment may contain multiple QTs, each with its own
information byte.
- For precision=1 (16 bit), the order is high-low for each of the 64 words.
DAC: Define Arithmetic Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Current software does not support arithmetic coding for legal reasons.
JPEG files using arithmetic coding can not be processed.
DHT: Define Huffman Table:
~~~~~~~~~~~~~~~~~~~~~~~~~~
- $ff, $c4 (DHT)
- length (high byte, low byte)
- HT information (1 byte):
bit 0..3: number of HT (0..3, otherwise error)
bit 4 : type of HT, 0 = DC table, 1 = AC table
bit 5..7: not used, must be 0
- 16 bytes: number of symbols with codes of length 1..16, the sum of these
bytes is the total number of codes, which must be <= 256
- n bytes: table containing the symbols in order of increasing code length
(n = total number of codes)
Remarks:
- A single DHT segment may contain multiple HTs, each with its own
information byte.
SOS: Start Of Scan:
~~~~~~~~~~~~~~~~~~~
- $ff, $da (SOS)
- length (high byte, low byte), must be 6+2*(number of components in scan)
- number of components in scan (1 byte), must be >= 1 and <=4 (otherwise
error), usually 1 or 3
- for each component: 2 bytes
- component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), see SOF0
- Huffman table to use:
- bit 0..3: AC table (0..3)
- bit 4..7: DC table (0..3)
- 3 bytes to be ignored (???)
Remarks:
- The image data (scans) is immediately following the SOS segment.
End of part 1.
=============================================================================
I've written a JPEG Decoding Unit for Borland/Turbo Pascal 7.0. It's very
fast, since it uses Assembly routines for the critical algorithms.
Check out the program QPEG which is a shareware image viewer (JPEG, GIF,
Targa, PCX, BMP) -- it uses that unit. The QPEG package also contains a
more detailed description of the JPEG unit and an order form for it
(including source code). I'm also writing a JPEG decoding DLL which will
be available soon.
If you have access to the Internet, then you can get QPEG via FTP from one
of these sites:
ftp.tu-clausthal.de /pub/msdos/graphics (primary site, Germany)
ftp.rahul.net /pub/bryanw/qpeg
wuarchive.wustl.edu /pub/msdos_uploads/graphics
If you don't have Internet access, just send 5 $US or 5 DM (cash) to me
(to cover my expenses), and you'll get the shareware version of QPEG.
You must have at least a 386 processor and a VGA graphics card.
See my address (normal mail and electronic mail) at the top of this file.
}
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]