PNMTOJPEG
Updated: 08 March 2003
Table Of Contents
NAME
pnmtojpeg - convert PNM image to a JFIF ("JPEG") image
SYNOPSIS
pnmtojpeg [-exif=filespec] [-quality=n]
[{-grayscale|-greyscale}]
[-density=nxn[dpi,dpcm]] [-optimize|-optimise] [-rgb] [-pro-
gressive]
[-comment=text] [-dct={int|fast|float}] [-arithmetic]
[-restart=n]
[-smooth=n] [-maxmemory=n] [-verbose] [-baseline] [-qta-
bles=filespec]
[-qslots=n[,...]] [-sample=HxV[,...]] [-scans=filespec]
[-tracelevel=N]
filename
Minimum unique abbreviation of option is acceptable. You may
use double
hypens instead of single hyphen to denote options. You may use
white space
in place of the equals sign to separate an option name from
its value.
DESCRIPTION
This program is part of Netpbm. pnmtojpeg converts the named
PBM, PGM, or
PPM image file, or the standard input if no file is named, to
a JFIF file on
the standard output.
pnmtojpeg uses the Independent JPEG Group's JPEG library to
create the
output file. See http://www.ijg.org for information on the li-
brary.
"JFIF" is the correct name for the image format commonly known
as "JPEG."
Strictly speaking, JPEG is a method of compression. The image
format using
JPEG compression that is by far the most common is JFIF. There
is also a
subformat of TIFF that uses JPEG compression.
EXIF is an image format that is a subformat of JFIF (to wit, a
JFIF file
that contains an EXIF header as an APP1 marker). pnmtojpeg
creates an EXIF
image when you specify the -exif option.
OPTIONS
The basic options are:
-exif=filespec
This option specifies that the output image is to be
EXIF (a
subformat of JFIF), i.e. it will have an EXIF header as
a JFIF APP1
marker. The contents of that marker are the contents of
the specified
file. The special value - means to read the EXIF header
contents from
standard input. It is invalid to specify standard input
for both the
EXIF header and the input image.
The EXIF file starts with a two byte field which is the
length of the
file, including the length field, in pure binary, most
significant
byte first. The special value of zero for the length
field means
there is to be no EXIF header, i.e. the same as no
-exif option. This
is useful for when you convert a file from JFIF to
PNM using
jpegtopnm, then transform it, then convert it back to
JFIF with
pnmtojpeg, and you don't know whether or not it in-
cludes an EXIF
header. jpegtopnm creates an EXIF file containing noth-
ing but two
bytes of zero when the input JFIF file has no EXIF
header. Thus, you
can transfer any EXIF header from the input JFIF to the
output JFIF
without worrying about whether an EXIF header actually
exists.
The contents of the EXIF file after the length field
are the exact
byte for byte contents of the APP1 marker, not counting
the length
field, that constitutes the EXIF header.
-quality=n
Scale quantization tables to adjust image quality. n is
0 (worst) to
100 (best); default is 75. (See below for more info.)
-grayscale
-greyscale
-rgb
These options determine the color space used in the
JFIF output.
-grayscale (or -greyscale) means to create a gray
scale JFIF,
converting from color PPM input if necessary. -rgb
means to create an
RGB JFIF, and the program fails if the input is not
PPM.
If you specify neither, The output file is in YCbCr
format if the
input is PPM, and grayscale format if the input is PBM
or PGM.
YCbCr format (a color is represented by an intensity
value and two
chrominance values) usually compresses much better than
RGB (a color
is represented by one red, one green, and one blue val-
ue). RGB is
rare. But you may be able to convert between JFIF and
PPM faster with
RGB, since it's the same color space PPM uses.
The testimg.ppm file that comes with Netpbm is 2.3
times larger with
the -rgb option that with the YCbCr default, and in one
experiment
pnmtojpeg took 16% more CPU time to convert it. The ex-
tra CPU time
probably indicates that processing of all the extra
compressed data
consumed all the CPU time saved by not having to con-
vert the RGB
inputs to YCbCr.
Grayscale format takes up a lot less space and takes
less time to
create and process than the color formats, even if the
image contains
nothing but black, white, and gray.
The -rgb option was added in Netpbm 10.11 in October
2002.
-density=density
This option determines the density (aka resolution) in-
formation
recorded in the JFIF output image. It does not affect
the raster in
any way; it just tells whoever reads the JFIF how to
interpret the
raster.
The density value takes the form xxy followed by an op-
tional unit
specifier of dpi or dpcm. Examples: 1x1, 3x2,
300x300dpi,
100x200dpcm. The first number is the horizontal densi-
ty; the 2nd
number is the vertical density. Each may be any integer
from 1 to
65535. The unit specifier is dpi for dots per inch or
dpcm for dots
per centimeter. If you don't specify the units, the
density
information goes into the JFIF explicitly stating
"density
unspecified" (also interpreted as "unknown"). This
may seem
pointless, but note that even without specifying the
units, the
density numbers tell the aspect ratio of the pixels.
E.g. 1x1 tells
you the pixels are square. 3x2 tells you the pixels are
horizontal
rectangles.
Note that if you specify different horizontal and ver-
tical densities,
the resulting JFIF image is not a true representation
of the input
PNM image, because pnmtojpeg converts the raster pixel-
for-pixel and
the pixels of a PNM image are defined to be square.
Thus, if you
start with a square PNM image and specify -density=3x2,
the resulting
JFIF image is a vertically squashed version of the
original. However,
it is common to use an input image which is a slight
variation on PNM
rather than true PNM such that the pixels are not
square. In that
case, the appropriate -density option yields a faithful
reproduction
of the input pseudo-PNM image.
The default is 1x1 in unspecified units.
Before Netpbm 10.15 (April 2003), this option did not
exist and the
pnmtojpeg always created a JFIF with a density of 1x1
in unspecified
units.
-optimize
Perform optimization of entropy encoding parameters.
Without this,
pnmtojpeg uses default encoding parameters. -optimize
usually makes
the JFIF file a little smaller, but pnmtojpeg runs
somewhat slower
and needs much more memory. Image quality and speed of
decompression
are unaffected by -optimize.
-progressive
Create a progressive JPEG file (see below).
-comment=text
Include a comment marker in the JFIF output, with com-
ment text text.
Without this option, there are no comment markers in
the output.
The -quality option lets you trade off compressed file size
against quality
of the reconstructed image: the higher the quality setting,
the larger the
JFIF file, and the closer the output image will be to the
original input.
Normally you want to use the lowest quality setting (smallest
file) that
decompresses into something visually indistinguishable from
the original
image. For this purpose the quality setting should be between
50 and 95; the
default of 75 is often about right. If you see defects at
-quality=75, then
go up 5 or 10 counts at a time until you are happy with the
output image.
(The optimal setting will vary from one image to another.)
-quality=100 generates a quantization table of all 1's, mini-
mizing loss in
the quantization step (but there is still information loss in
subsampling,
as well as roundoff error). This setting is mainly of in-
terest for
experimental purposes. Quality values above about 95 are not
recommended for
normal use; the compressed file size goes up dramatically for
hardly any
gain in output image quality.
In the other direction, quality values below 50 will produce
very small
files of low image quality. Settings around 5 to 10 might be
useful in
preparing an index of a large image library, for example. Try
-quality=2 (or
so) for some amusing Cubist effects. (Note: quality values be-
low about 25
generate 2-byte quantization tables, which are considered op-
tional in the
JFIF standard. pnmtojpeg emits a warning message when you
give such a
quality value, because some other JFIF programs may be unable
to decode the
resulting file. Use -baseline if you need to ensure compati-
bility at low
quality values.)
The -progressive option creates a "progressive JPEG" file. In
this type of
JFIF file, the data is stored in multiple scans of increasing
quality. If
the file is being transmitted over a slow communications link,
the decoder
can use the first scan to display a low-quality image very
quickly, and can
then improve the display with each subsequent scan. The final
image is
exactly equivalent to a standard JFIF file of the same quality
setting, and
the total file size is about the same -- often a little small-
er.
Caution: progressive JPEG is not yet widely implemented, so
many decoders
will be unable to view a progressive JPEG file at all.
If you're trying to control the quality/file size tradeoff,
you might
consider the JPEG2000 format instead. See pamtojpeg2k.
Options for advanced users:
-dct=int
Use integer DCT method (default).
-dct=fast
Use fast integer DCT (less accurate).
-dct=float
Use floating-point DCT method. The float method is very
slightly more
accurate than the int method, but is much slower unless
your machine
has very fast floating-point hardware. Also note that
results of the
floating-point method may vary slightly across ma-
chines, while the
integer methods should give the same results every-
where. The fast
integer method is much less accurate than the other
two.
-arithmetic
Use arithmetic coding. Default is Huffman encoding.
Arithmetic coding
tends to get you a smaller result.
You may need patent licenses to use this option. Ac-
cording to the
JPEG FAQ, This method is covered by patents owned by
IBM, AT&T, and
Mitsubishi.
The author of the FAQ recommends against using arith-
metic coding (and
therefore this option) because the space savings is not
great enough
to justify the legal hassles.
-restart=n
Emit a JPEG restart marker every n MCU rows, or every n
MCU blocks if
you append B to the number. -restart 0 (the default)
means no restart
markers.
-smooth=n
Smooth the input image to eliminate dithering noise. n,
ranging from
1 to 100, indicates the strength of smoothing. 0 (the
default) means
no smoothing.
-maxmemory=n
Set a limit for amount of memory to use in processing
large images.
Value is in thousands of bytes, or millions of bytes if
you append M
to the number. For example, -max=4m selects 4,000,000
bytes. If
pnmtojpeg needs more space, it will use temporary
files.
-verbose
Print to the Standard Error file messages about the
conversion
process. This can be helpful in debugging problems.
The -restart option tells pnmtojpeg to insert extra markers
that allow a
JPEG decoder to resynchronize after a transmission error.
Without restart
markers, any damage to a compressed file will usually ruin the
image from
the point of the error to the end of the image; with restart
markers, the
damage is usually confined to the portion of the image up to
the next
restart marker. Of course, the restart markers occupy extra
space. We
recommend -restart=1 for images that will be transmitted
across unreliable
networks such as Usenet.
The -smooth option filters the input to eliminate fine-scale
noise. This is
often useful when converting dithered images to JFIF: a moder-
ate smoothing
factor of 10 to 50 gets rid of dithering patterns in the in-
put file,
resulting in a smaller JFIF file and a better-looking image.
Too large a
smoothing factor will visibly blur the image, however.
Options for wizards:
-baseline
Force baseline-compatible quantization tables to be
generated. This
clamps quantization values to 8 bits even at low quali-
ty settings.
(This switch is poorly named, since it does not ensure
that the
output is actually baseline JPEG. For example, you can
use -baseline
and -progressive together.)
-qtables=filespec
Use the quantization tables given in the specified text
file.
-qslots=n[,...]
Select which quantization table to use for each color
component.
-sample=HxV[,...]
Set JPEG sampling factors for each color component.
-scans=filespec
Use the scan script given in the specified text file.
See below for
information on scan scripts.
-tracelevel=N
This sets the level of debug tracing the program out-
puts as it runs.
0 means none, and is the default. This level primarily
controls
tracing of the JPEG library, and you can get some pret-
ty interesting
information about the compression process.
The "wizard" options are intended for experimentation with
JPEG. If you
don't know what you are doing, don't use them. These switches
are documented
further in the file wizard.doc that comes with the Independent
JPEG Group's
JPEG library.
EXAMPLES
This example compresses the PPM file foo.ppm with a quality
factor of 60 and
saves the output as foo.jpg:
pnmtojpeg -quality=60 foo.ppm > foo.jpg
Here's a more typical example. It converts from BMP to JFIF:
cat foo.bmp | bmptoppm | pnmtojpeg > foo.jpg
HINTS
JFIF is not ideal for cartoons, line drawings, and other im-
ages that have
only a few distinct colors. For those, try instead pnmtopng or
ppmtobmp. If
you need to convert such an image to JFIF, though, you should
experiment
with pnmtojpeg's -quality and -smooth options to get a sat-
isfactory
conversion. -smooth 10 or so is often helpful.
JPEG compression is notable for being a "lossy." This means
that, unlike
with most graphics conversions, you lose information, which
means image
quality, when you convert to JFIF. If you convert from PPM to
JFIF and back
repeatedly, image quality loss will accumulate. After ten or
so cycles the
image may be noticeably worse than it was after one cycle.
Because of this, you should do all the manipulation you have
to do on the
image in some other format and convert to JFIF as the last
step. And if you
can keep a copy in the original format, so much the better.
PNG is a good
choice for a format that is lossless, yet fairly compact. GIF
is another way
to go, but chances are you can't create a GIF image without
owing a lot of
money to Unisys and IBM, holders of patents on the LZW com-
pression used in
the GIF format. The -optimize option to pnmtojpeg is worth us-
ing when you
are making a "final" version for posting or archiving. It's
also a win when
you are using low quality settings to make very small JFIF
files; the
percentage improvement is often a lot more than it is on larg-
er files. (At
present, -optimize mode is automatically in effect when you
generate a
progressive JPEG file).
Another program, cjpeg, is similar. cjpeg is maintained by the
Independent
JPEG Group and packaged with the JPEG library which pnmtojpeg
uses for all
its JPEG work. Because of that, you may expect it to exploit
more current
JPEG features. Also, since you have to have the library to run
pnmtojpeg,
but not vice versa, cjpeg may be more commonly available.
On the other hand, cjpeg does not use the NetPBM libraries to
process its
input, as all the NetPBM tools such as pnmtojpeg do. This
means it is less
likely to be consistent with all the other programs that deal
with the
NetPBM formats. Also, the command syntax of pnmtojpeg is con-
sistent with
that of the other Netpbm tools, unlike cjpeg.
SCAN SCRIPTS
Use the -scan option to specify a scan script. Or use the
-progressive
option to specify a particular built-in scan script.
Just what a scan script is, and the basic format of the scan
script file, is
covered in the wizard.doc file that comes with the Independent
JPEG Group's
JPEG library. Scan scripts are same for pnmtojpeg as the are
for cjpeg.
This section contains additional information that isn't, but
probably should
be, in that document.
First, there are many restrictions on what is a valid scan
script. The JPEG
library, and thus pnmtojpeg, checks thoroughly for any lack of
compliance
with these restrictions, but does little to tell you how the
script fails to
comply. The messages are very general and sometimes untrue.
To start with, the entries for the DC coefficient must come
before any
entries for the AC coefficients. The DC coefficient is Coeffi-
cient 0; all
the other coefficients are AC coefficients. So in an entry
for the DC
coefficient, the two numbers after the colon must be 0 and 0.
In an entry
for AC coefficients, the first number after the colon must not
be 0.
In a DC entry, the color components must be in increasing or-
der. E.g.
"0,2,1" before the colon is wrong. So is "0,0,0".
In an entry for an AC coeffient, you must specify only one
color component.
I.e. there can be only one number before the colon.
In the first entry for a particular coefficient for a particu-
lar color
component, the "Ah" value must be zero, but the Al value can
be any valid
bit number. In subsequent entries, Ah must be the Al value
from the previous
entry (for that coefficient for that color component), and the
Al value must
be one less than the Ah value.
The script must ultimately specify at least some of the DC co-
efficent for
every color component. Otherwise, you get the error message
"Script does not
transmit all the data." You need not specify all of the bits
of the DC
coefficient, or any of the AC coefficients.
There is a standard option in building the JPEG library to
omit scan script
capability. If for some reason your library was built with
this option, you
get the message "Requested feature was omitted at compile
time."
ENVIRONMENT
JPEGMEM
If this environment variable is set, its value is the
default memory
limit. The value is specified as described for the
-maxmemory option.
An explicit -maxmemory option overrides any JPEGMEM.
SEE ALSO
jpegtopnm, pnm, cjpeg man page, djpeg man page, jpegtran man
page, rdjpgcom
man page, wrjpgcom man page
Wallace, Gregory K. "The JPEG Still Picture Compression
Standard",
Communications of the ACM, April 1991 (vol. 34, no. 4), pp.
30-44.
AUTHOR
pnmtojpeg and this manual were derived in large part from
cjpeg, by the
Independent JPEG Group. The program is otherwise by Bryan Hen-
derson on March
07, 2000.
_________________________________________________________________
Table Of Contents
* NAME
* SYNOPSIS
* DESCRIPTION
* OPTIONS
* EXAMPLES
* HINTS
* SCAN SCRIPTS
* ENVIRONMENT
* SEE ALSO
* AUTHOR
UNIX/Linux commands referenced on this page:
- convert
- file
- as
- which
- jpegtopnm
- more
- red
- time
- true
- at
- size
- display
- view
- less
- factor
- script
- cat
- bmptoppm
- pnmtopng
- make
- cjpeg
- man
- djpeg
- jpegtran
- wrjpgcom