392 lines
19 KiB
Plaintext
392 lines
19 KiB
Plaintext
The Independent JPEG Group's JPEG software
|
|
==========================================
|
|
|
|
README for release of 7-Oct-91
|
|
===============================
|
|
|
|
This distribution contains the first public release of the Independent JPEG
|
|
Group's free JPEG software. You are welcome to redistribute this software and
|
|
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
|
|
|
|
This software is still undergoing revision. Updated versions may be obtained
|
|
by anonymous FTP to uunet.uu.net; look under directory /graphics/jpeg. This
|
|
particular version will be archived as jpegsrc.v1.tar.Z. If you don't have
|
|
access to Internet FTP, UUNET's archives are also available via UUCP; contact
|
|
postmaster@uunet.uu.net for information on retrieving files that way.
|
|
|
|
Please report any problems with this software to jpeg-info@uunet.uu.net.
|
|
|
|
If you intend to become a serious user of this software, please contact
|
|
jpeg-info@uunet to be added to our electronic mailing list. Then you'll be
|
|
notified of updates and have a chance to participate in discussions, etc.
|
|
|
|
This software is the work of Tom Lane, Philip Gladstone, Luis Ortiz, and other
|
|
members of the independent JPEG group.
|
|
|
|
|
|
DISCLAIMER
|
|
==========
|
|
|
|
THIS SOFTWARE IS NOT COMPLETE NOR FULLY DEBUGGED. It is not guaranteed to be
|
|
useful for anything, nor to be compatible with subsequent releases, nor to be
|
|
an accurate implementation of the JPEG standard. (See LEGAL ISSUES for even
|
|
more disclaimers.)
|
|
|
|
|
|
WHAT'S HERE
|
|
===========
|
|
|
|
This distribution contains software to implement JPEG image compression and
|
|
decompression. JPEG is a standardized compression method for full-color and
|
|
gray-scale images. JPEG is intended for "real-world" scenes; cartoons and
|
|
other non-realistic images are not its strong suit. JPEG is lossy, meaning
|
|
that the output image is not necessarily identical to the input image. Hence
|
|
you should not use JPEG if you have to have identical output bits. However,
|
|
on typical images of real-world scenes, very good compression levels can be
|
|
obtained with hardly any visible change, and amazingly high compression levels
|
|
can be obtained if you can tolerate a low-quality image. For more details,
|
|
see the references, or just experiment with various compression settings.
|
|
|
|
The software implements JPEG baseline and extended-sequential compression
|
|
processes. Provision is made for supporting all variants of these processes,
|
|
although some uncommon parameter settings aren't implemented yet. For legal
|
|
reasons, we are not distributing code for the arithmetic-coding process; see
|
|
LEGAL ISSUES. At present we have made no provision for supporting the
|
|
progressive or lossless processes defined in the standard.
|
|
|
|
The present software is still largely in the prototype stage. It does not
|
|
support all possible variants of the JPEG standard, and some functions have
|
|
rather slow and/or crude implementations. However, it is useful already.
|
|
|
|
The emphasis in designing this software has been on achieving portability and
|
|
flexibility, while also making it fast enough to be useful. We have not yet
|
|
undertaken serious performance measurement or tuning; we intend to do so in
|
|
the future.
|
|
|
|
|
|
This software can be used on several levels:
|
|
|
|
* As canned software for JPEG compression and decompression. Just edit the
|
|
Makefile and configuration files as needed (see SETUP), compile and go.
|
|
Members of the independent JPEG group will improve the out-of-the-box
|
|
functionality as time goes on.
|
|
|
|
* As the basis for other JPEG programs. For example, you could incorporate
|
|
the decompressor into a general image viewing package by replacing the
|
|
output module with write-to-screen functions. For an implementation on
|
|
specific hardware, you might want to replace some of the inner loops with
|
|
assembly code. For a non-command-line-driven system, you might want a
|
|
different user interface. (Members of the group will be producing Macintosh
|
|
and Amiga versions with appropriate user interfaces, for example.)
|
|
|
|
* As a toolkit for experimentation with JPEG and JPEG-like algorithms. Most
|
|
of the individual decisions you might want to mess with are packaged up into
|
|
separate modules. For example, the details of color-space conversion and
|
|
subsampling techniques are each localized in one compressor and one
|
|
decompressor module. You'd probably also want to extend the user interface
|
|
to give you more detailed control over the JPEG compression parameters.
|
|
|
|
In particular, we welcome the use of this software as the basis for commercial
|
|
products; no royalty is required.
|
|
|
|
|
|
SETUP
|
|
=====
|
|
|
|
The installation process is not very automatic; you will need at least some
|
|
familiarity with C programming and program build procedures for your system.
|
|
(Volunteers to work on improving this situation are welcome. Also, we will
|
|
probably start distributing pre-built binaries for popular systems at some
|
|
point.)
|
|
|
|
First, select a makefile and copy it to "Makefile". "makefile.unix"
|
|
is appropriate for most Unix and Unix-like systems. Special makefiles are
|
|
included for various PC compilers. If you don't see a makefile for your
|
|
system, we recommend starting from makefile.unix.
|
|
|
|
Look over the Makefile and adjust options as needed. In particular, you'll
|
|
need to change the CC= and CFLAGS= definitions if you don't have gcc
|
|
(makefile.unix only). If you have a function-prototype-less compiler, be sure
|
|
to uncomment the .c.o rule and say "make ansi2knr". This will cause the
|
|
source files to be preprocessed to change our ANSI-style function definitions
|
|
to old-style definitions. (Thanks to Peter Deutsch of Aladdin Enterprises for
|
|
ansi2knr.)
|
|
|
|
Also look over jconfig.h and adjust #defines as necessary. If you have an
|
|
ANSI-compliant C compiler (gcc for instance), no changes should be necessary
|
|
except perhaps for RIGHT_SHIFT_IS_UNSIGNED and TWO_FILE_COMMANDLINE. For
|
|
older compilers other mods may be needed, depending on what ANSI features are
|
|
supported. If you prefer, you can usually leave jconfig.h unmodified and add
|
|
-D switches to the Makefile's CFLAGS= definition.
|
|
|
|
Then say "make".
|
|
|
|
If you have trouble with missing system include files or inclusion of the
|
|
wrong ones, you can fix it in jinclude.h. In particular, if you are using
|
|
gcc on a machine with non-ANSI system include files, you are likely to find
|
|
that jinclude.h tries to include the wrong files (because gcc defines
|
|
__STDC__). There's no good automatic solution to this, so you'll just have
|
|
to hand-edit jinclude.h.
|
|
|
|
As a quick test of functionality we've included three sample files:
|
|
testorig.jpg same as blkint.jpg from JPEG validation floppy.
|
|
testimg.ppm output of djpeg testorig.jpg
|
|
testimg.jpg output of cjpeg testimg.ppm
|
|
The two .jpg files aren't identical due to different parameter choices (and
|
|
wouldn't be anyway, since JPEG is lossy). However, if you can generate
|
|
duplicates of testimg.ppm and testimg.jpg then you probably have a working
|
|
port. "make test" will perform the necessary comparisons (by generating
|
|
testout.ppm and testout.jpg and comparing these to testimg.*). NOTE: this
|
|
is far from an exhaustive test of the JPEG software; some modules, such as
|
|
color quantization and GIF I/O, are not exercised at all. It's just a quick
|
|
test to give you some confidence that you haven't missed something major.
|
|
|
|
If you need to make a smaller version of the JPEG software, some optional
|
|
functions can be removed at compile time. See the xxx_SUPPORTED #defines
|
|
in jconfig.h. (Not a lot is actually removed right now, but as more optional
|
|
stuff gets added, this mechanism will start to make a difference.)
|
|
|
|
If you want to incorporate the JPEG code as subroutines in a larger program,
|
|
we recommend that you make libjpeg.a. Then use the .h files and libjpeg.a as
|
|
your interface to the JPEG functions. Your surrounding program will have to
|
|
provide functionality similar to what's in jcmain.c or jdmain.c, and you may
|
|
want to replace jerror.c and possibly other modules depending on your needs.
|
|
See the "architecture" file for more info. If it seems to you that the system
|
|
structure doesn't accommodate what you want to do, please contact the authors.
|
|
|
|
Special notes for Macintosh Think C users: If you have version 5.0 you should
|
|
be able to just turn on __STDC__ through the compiler switch that enables
|
|
that. With version 4.0 you must manually edit jconfig.h to define PROTO,
|
|
HAVE_UNSIGNED_CHAR, HAVE_UNSIGNED_SHORT, and const. (It seems to be safe to
|
|
just define __STDC__ to take care of the first three.) When setting up
|
|
project files, use the COBJECTS and DOBJECTS lists in makefile.unix as a guide
|
|
to which files need to be included, and add the ANSI and Unix C libraries in a
|
|
separate segment. You may need to divide the JPEG files into more than one
|
|
segment; you can do this pretty much as you please.
|
|
|
|
|
|
USAGE
|
|
=====
|
|
|
|
The user interface is pretty minimal at this point. We haven't bothered to
|
|
generate manual-page files since the switches badly need redesign. At the
|
|
moment, things work like this:
|
|
|
|
There are two programs, cjpeg to compress an image file into JPEG format,
|
|
and djpeg to decompress.
|
|
|
|
On Unix systems, you say:
|
|
cjpeg [switches] [imagefile] >jpegfile
|
|
djpeg [switches] [jpegfile] >imagefile
|
|
The programs read the specified input file, or standard input if none is
|
|
named. They always write to standard output (with trace/error messages to
|
|
standard error). These conventions are handy for piping images between
|
|
programs.
|
|
|
|
On PC, Macintosh, and Amiga systems, you say:
|
|
cjpeg [switches] imagefile jpegfile
|
|
djpeg [switches] jpegfile imagefile
|
|
i.e., both input and output files are named on the command line. This style
|
|
is a little more foolproof, and it loses no functionality if you don't have
|
|
pipes. You can get this style on Unix too, if you prefer, by defining
|
|
TWO_FILE_COMMANDLINE in jconfig.h or in the Makefile. You MUST use this style
|
|
on any system that doesn't cope well with binary data fed through
|
|
stdin/stdout.
|
|
|
|
Currently supported image file formats include raw-format PPM, raw-format PGM
|
|
(for monochrome images), and GIF. cjpeg recognizes the input image format
|
|
automatically, but you have to tell djpeg which format to generate.
|
|
|
|
The only JPEG file format currently supported is a raw JPEG data stream.
|
|
Unless modified, the programs use the JFIF conventions for variables left
|
|
unspecified by the JPEG standard. (In particular, cjpeg generates a JFIF APP0
|
|
marker.) Support for the JPEG-in-TIFF format will probably be added at some
|
|
future date.
|
|
|
|
The command line switches for cjpeg are:
|
|
|
|
-I Generate noninterleaved JPEG file (not yet supported).
|
|
|
|
-Q quality Scale quantization tables to adjust quality.
|
|
Quality is 0 (worst) to 100 (best); default is 75.
|
|
(See below for more info.)
|
|
|
|
-a Use arithmetic coding rather than Huffman coding.
|
|
(Not currently supported, see LEGAL ISSUES.)
|
|
|
|
-o Perform optimization of entropy encoding parameters.
|
|
Without this, default Huffman or arithmetic
|
|
parameters are used. -o makes the JPEG file a tad
|
|
smaller, but compression uses much more memory.
|
|
Image quality is unaffected by -o.
|
|
|
|
-d Enable debug printout. More -d's give more printout.
|
|
|
|
Typically you'd use -Q settings of 50 or 75 or so. -Q 100 will generate a
|
|
quantization table of all 1's, meaning no quantization loss; then any
|
|
differences between input and output images are due to subsampling or to
|
|
roundoff error in the DCT or colorspace-conversion steps. -Q values below 50
|
|
may be useful for making real small, low-quality images. Try -Q 2 (or so) for
|
|
some amusing Cubist effects. (Note that -Q values below about 25 generate
|
|
2-byte quantization tables, which are not decodable by pure baseline JPEG
|
|
decoders. cjpeg emits a warning message when you give such a -Q value.)
|
|
|
|
The command line switches for djpeg are:
|
|
|
|
-G Select GIF output format (implies -q, with default
|
|
of 256 colors).
|
|
|
|
-b Perform cross-block smoothing. This is quite
|
|
memory-intensive and only seems to improve the image
|
|
at very low quality settings (-Q 10 to 20 or so).
|
|
|
|
-g Force gray-scale output even if input is color.
|
|
|
|
-q N Quantize to N colors.
|
|
|
|
-D Use Floyd-Steinberg dithering in color quantization.
|
|
|
|
-2 Use two-pass color quantization (not yet supported).
|
|
|
|
-d Enable debug printout. More -d's give more printout.
|
|
|
|
Color quantization currently uses a rather shoddy algorithm (although it's not
|
|
so horrible when dithered). Because of this, the GIF output mode is not
|
|
recommended in the current release, except for gray-scale output. You can get
|
|
better results by applying ppmquant to the unquantized (PPM) output of djpeg,
|
|
then converting to GIF with ppmtogif. We expect to provide a considerably
|
|
better quantization algorithm in a future release.
|
|
|
|
Note that djpeg *can* read noninterleaved JPEG files even though cjpeg can't
|
|
yet generate them. For most applications this is a nonissue, since hardly
|
|
anybody seems to be using noninterleaved format.
|
|
|
|
On a non-virtual-memory machine, you may run out of memory if you use -I or -o
|
|
in cjpeg, or -q ... -2 in djpeg, or try to read an interlaced GIF file. This
|
|
will be addressed eventually by replacing jvirtmem.c with something that uses
|
|
temporary files for large images (see TO DO).
|
|
|
|
|
|
REFERENCES
|
|
==========
|
|
|
|
The best and most readily available introduction to the JPEG compression
|
|
algorithm is Wallace's article in the April '91 CACM:
|
|
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
|
|
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
|
applications of JPEG, and related topics.) We highly recommend reading that
|
|
article before looking at any of the JPEG software.
|
|
|
|
For more detail about the JPEG standard you pretty much have to go to the
|
|
draft standard, which is not nearly as intelligible as Wallace's article.
|
|
The current version is ISO/IEC Committee Draft CD 10918-1 dated 1991-03-15.
|
|
The standard is not presently available electronically; you must order a paper
|
|
copy through ISO.
|
|
|
|
The JPEG standard does not specify all details of an interchangeable file
|
|
format. For the omitted details we follow the "JFIF" conventions, revision
|
|
1.01. A copy of the JFIF spec is available from:
|
|
Literature Department
|
|
C-Cube Microsystems, Inc.
|
|
399A West Trimble Road
|
|
San Jose, CA 95131
|
|
(408) 944-6300
|
|
Requests can also be e-mailed to info@c3.pla.ca.us (this address good after
|
|
10/10/91). The same source can supply copies of the draft JPEG-in-TIFF specs.
|
|
|
|
If you want to understand this implementation, start by reading the
|
|
"architecture" documentation file. Please read "codingrules" if you want to
|
|
contribute any code.
|
|
|
|
|
|
SUPPORTING SOFTWARE
|
|
===================
|
|
|
|
You will probably want Jef Poskanzer's PBMPLUS image software; this provides
|
|
many useful operations on PPM-format image files. In particular, it can
|
|
convert PPM images to and from a wide range of other formats. You can FTP
|
|
this free software from export.lcs.mit.edu (contrib/pbmplus*.tar.Z) or
|
|
ftp.ee.lbl.gov (pbmplus*.tar.Z).
|
|
|
|
If you are using X Windows you might want to use the xv or xloadimage viewers
|
|
to save yourself the trouble of converting PPM to some other format.
|
|
Both of these can be found in the contrib directory at export.lcs.mit.edu.
|
|
|
|
|
|
LEGAL ISSUES
|
|
============
|
|
|
|
The authors make NO WARRANTY or representation, either express or implied,
|
|
with respect to this software, its quality, accuracy, merchantability, or
|
|
fitness for a particular purpose. This software is provided "AS IS", and you,
|
|
its user, assume the entire risk as to its quality and accuracy.
|
|
|
|
This software is copyright (C) 1991, Thomas G. Lane.
|
|
All Rights Reserved except as specified below.
|
|
|
|
Permission is hereby granted to use, copy, modify, and distribute this
|
|
software (or portions thereof) for any purpose, without fee, subject to these
|
|
conditions:
|
|
(1) If any part of the source code for this software is distributed, then this
|
|
README file must be included, with this copyright and no-warranty notice
|
|
unaltered; and any additions, deletions, or changes to the original files
|
|
must be clearly indicated in accompanying documentation.
|
|
(2) If only executable code is distributed, then the accompanying
|
|
documentation must state that "this software is based in part on the work of
|
|
the Independent JPEG Group".
|
|
(3) Permission for use of this software is granted only if the user accepts
|
|
full responsibility for any undesirable consequences; the authors accept
|
|
NO LIABILITY for damages of any kind.
|
|
|
|
Permission is NOT granted for the use of any author's name or author's company
|
|
name in advertising or publicity relating to this software or products derived
|
|
from it. This software may be referred to only as "the Independent JPEG
|
|
Group's software".
|
|
|
|
We specifically permit and encourage the use of this software as the basis of
|
|
commercial products, provided that all warranty or liability claims are
|
|
assumed by the product vendor.
|
|
|
|
|
|
ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
|
|
sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
|
|
ansi2knr.c is NOT covered by the above copyright and conditions, but instead
|
|
by the usual distribution terms of the Free Software Foundation; principally,
|
|
that you must include source code if you redistribute it. (See the file
|
|
ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
|
|
of any product generated from the JPEG code, this does not limit you more than
|
|
the foregoing paragraphs do.
|
|
|
|
|
|
It appears that the arithmetic coding option of the JPEG spec is covered by
|
|
patents held by IBM, and possibly also patents of AT&T and Mitsubishi. Hence
|
|
arithmetic coding cannot legally be used without obtaining one or more
|
|
licenses. For this reason, support for arithmetic coding has been removed
|
|
from the free JPEG software. (Since arithmetic coding provides only a
|
|
marginal gain over the unpatented Huffman mode, it is unlikely that very many
|
|
people will choose to use it. If you do obtain such a license, contact
|
|
jpeg-info@uunet.uu.net for a copy of our arithmetic coding modules.) So far
|
|
as we are aware, there are no patent restrictions on the remaining code.
|
|
|
|
|
|
TO DO
|
|
=====
|
|
|
|
Many of the modules need fleshing out to provide more complete
|
|
implementations, or to provide faster paths for common cases. The greatest
|
|
needs are for (a) decent color quantization, and (b) a memory manager
|
|
implementation that can work in limited memory by swapping "big" images to
|
|
temporary files. I (Tom Lane) am going to work on color quantization next.
|
|
Volunteers to write a PC memory manager, or to work on any other modules, are
|
|
welcome.
|
|
|
|
We'd appreciate it if people would compile and check out the code on as wide a
|
|
variety of systems as possible, and report any portability problems
|
|
encountered (with solutions, if possible). Checks of file compatibility with
|
|
other JPEG implementations would also be of interest. Finally, we would
|
|
appreciate code profiles showing where the most time is spent, especially on
|
|
unusual systems.
|
|
|
|
Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net.
|