Provided by: netpbm_10.0-15.4_amd64 bug

NAME

       pnmtojpeg - convert PNM image to a JFIF ("JPEG") image

SYNOPSIS

       pnmtojpeg [ options ] [ filename ]

DESCRIPTION

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

       "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 includes an EXIF header.  jpegtopnm
              creates an EXIF file containing nothing 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
              Create  gray scale JFIF file.  With this option, pnmtojpeg converts color input to gray scale.  If
              you don't specify this option, The output file is in  color  format  if  the  input  is  PPM,  and
              grayscale format if the input is PBM or PGM.

              In  the  PPM  input  case,  even  if  all the colors in the image are gray, the output is in color
              format.  Of course, the colors in it are still gray.  The difference is that color format takes up
              a lot more space and takes longer to create and process.

       --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 comment 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, minimizing loss in the  quantization  step  (but
       there  is  still  information loss in subsampling, as well as roundoff error).  This setting is mainly of
       interest 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  below  about  25  generate
       2-byte  quantization  tables,  which  are  considered  optional  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 compatibility 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 smaller.  Caution: progressive JPEG is not yet widely implemented, so many decoders will be unable
       to view a progressive JPEG file at all.

       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  machines,  while  the  integer
              methods  should  give  the same results everywhere.  The fast integer method is much less accurate
              than the other two.

       --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  moderate  smoothing factor of 10 to 50 gets rid of dithering
       patterns in the input 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 quality 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.

       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

              cat foo.bmp | bmptoppm | pnmtojpeg > foo.jpg

HINTS

       JFIF  is  not  ideal  for cartoons, line drawings, and other images 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 satisfactory 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 compression used in the GIF format.

       The  --optimize  option  to pnmtojpeg is worth using 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 larger 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 consistent 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 Coefficient 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 order.  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 particular 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 coefficent 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

       cjpeg(1), djpeg(1), jpegtran(1), rdjpgcom(1), wrjpgcom(1)
       ppm(5), pgm(5), jpegtopnm(1)
       Wallace, Gregory K.  "The JPEG Still Picture Compression Standard", Communications of the ACM, April 1991
       (vol. 34, no. 4), pp. 30-44.

LIMITATIONS

       Arithmetic coding is not supported for legal reasons.

       The program could be much faster.

AUTHOR

       pnmtojpeg  and  this  man page were derived in large part from cjpeg, by the Independent JPEG Group.  The
       program is otherwise by Bryan Henderson on March 07, 2000.

                                                  07 March 2000                                     PNMTOJPEG(1)