# jpegtran(1) - man - phpMan

[JPEGTRAN(1)](https://www.chedong.com/phpMan.php/man/JPEGTRAN/1/markdown)                            General Commands Manual                           [JPEGTRAN(1)](https://www.chedong.com/phpMan.php/man/JPEGTRAN/1/markdown)



## NAME
       jpegtran - lossless transformation of JPEG files

## SYNOPSIS
       **jpegtran** [ _options_ ] [ _filename_ ]

## DESCRIPTION
       **jpegtran**  performs  various useful transformations of JPEG files.  It can translate the coded
       representation from one variant of JPEG to another, for example from baseline  JPEG  to  pro‐
       gressive  JPEG or vice versa.  It can also perform some rearrangements of the image data, for
       example turning an image from landscape to portrait format by rotation.

       For EXIF files and JPEG files containing Exif data, you may prefer to use **exiftran** instead.

       **jpegtran** works by rearranging the compressed data (DCT coefficients), without ever fully  de‐
       coding the image.  Therefore, its transformations are lossless: there is no image degradation
       at all, which would not be true if you used **djpeg** followed by **cjpeg** to  accomplish  the  same
       conversion.  But by the same token, **jpegtran** cannot perform lossy operations such as changing
       the image quality.  However, while the image data is losslessly transformed, metadata can  be
       removed.  See the **-copy** option for specifics.

       **jpegtran**  reads the named JPEG/JFIF file, or the standard input if no file is named, and pro‐
       duces a JPEG/JFIF file on the standard output.

## OPTIONS
       All switch names may be abbreviated; for example, **-optimize** may be written **-opt** or **-o**.  Upper
       and lower case are equivalent.  British spellings are also accepted (e.g., **-optimise**), though
       for brevity these are not mentioned below.

       To specify the coded JPEG representation used in the output file, **jpegtran** accepts  a  subset
       of the switches recognized by **cjpeg**:

### -optimize
              Perform optimization of entropy encoding parameters.

### -progressive
              Create progressive JPEG file.

### -restart
              Emit  a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is attached
              to the number.

### -arithmetic
              Use arithmetic coding.

### -scans
              Use the scan script given in the specified text file.

       See [**cjpeg**(1)](https://www.chedong.com/phpMan.php/man/cjpeg/1/markdown) for more details about these switches.  If you specify none of  these  switches,
       you  get  a plain baseline-JPEG output file.  The quality setting and so forth are determined
       by the input file.

       The image can be losslessly transformed by giving one of these switches:

### -flip horizontal
              Mirror image horizontally (left-right).

### -flip vertical
              Mirror image vertically (top-bottom).

### -rotate 90
              Rotate image 90 degrees clockwise.

### -rotate 180
              Rotate image 180 degrees.

### -rotate 270
              Rotate image 270 degrees clockwise (or 90 ccw).

### -transpose
              Transpose image (across UL-to-LR axis).

### -transverse
              Transverse transpose (across UR-to-LL axis).

       The transpose transformation has no  restrictions  regarding  image  dimensions.   The  other
       transformations  operate  rather oddly if the image dimensions are not a multiple of the iMCU
       size (usually 8 or 16 pixels), because they can only transform complete blocks of DCT coeffi‐
       cient data in the desired way.

       **jpegtran**'s default behavior when transforming an odd-size image is designed to preserve exact
       reversibility and mathematical consistency of the transformation set.  As  stated,  transpose
       is  able  to flip the entire image area.  Horizontal mirroring leaves any partial iMCU column
       at the right edge untouched, but is able to flip all rows of the image.  Similarly,  vertical
       mirroring  leaves  any partial iMCU row at the bottom edge untouched, but is able to flip all
       columns.  The other transforms can be built up as sequences of transpose and flip operations;
       for consistency, their actions on edge pixels are defined to be the same as the end result of
       the corresponding transpose-and-flip sequence.

       For practical use, you may prefer to discard any untransformable edge pixels rather than hav‐
       ing  a  strange-looking strip along the right and/or bottom edges of a transformed image.  To
       do this, add the **-trim** switch:

### -trim

              Obviously, a transformation with **-trim** is not reversible, so strictly  speaking  **jpeg**‐‐
              **tran**  with  this switch is not lossless.  Also, the expected mathematical equivalences
              between the transformations no longer hold.  For example, **-rot** **270**  **-trim**  trims  only
              the bottom edge, but **-rot** **90** **-trim** followed by **-rot** **180** **-trim** trims both edges.

### -perfect
              If  you are only interested in perfect transformations, add the **-perfect** switch.  This
              causes **jpegtran** to fail with an error if the transformation is not perfect.

              For example, you may want to do

              **(jpegtran** **-rot** **90** **-perfect** _foo.jpg_ **||** **djpeg** _foo.jpg_ **|** **pnmflip** **-r90** **|** **cjpeg)**

              to do a perfect rotation, if available, or an approximated one if not.

       This version of **jpegtran** also offers a lossless crop option, which discards data outside of a
       given  image region but losslessly preserves what is inside.  Like the rotate and flip trans‐
       forms, lossless crop is restricted by the current JPEG format; the upper left corner  of  the
       selected  region  must fall on an iMCU boundary.  If it doesn't, then it is silently moved up
       and/or left to the nearest iMCU boundary (the lower right corner is  unchanged.)   Thus,  the
       output  image covers at least the requested region, but it may cover more.  The adjustment of
       the region dimensions may be optionally disabled by attaching an

       The image can be losslessly cropped by giving the switch:

### -crop WxH+X+Y
              Crop the image to a rectangular region of width W and height H, starting at point X,Y.
              The lossless crop feature discards data outside of a given image region but losslessly
              preserves what is inside.  Like the rotate and flip transforms, lossless crop  is  re‐
              stricted by the current JPEG format; the upper left corner of the selected region must
              fall on an iMCU boundary.  If it doesn't, then it is silently moved up and/or left  to
              the nearest iMCU boundary (the lower right corner is unchanged.)

       If  W  or  H is larger than the width/height of the input image, then the output image is ex‐
       panded in size, and the expanded region is filled in with zeros (neutral gray).  Attaching an
       'f' character ("flatten") to the width number will cause each block in the expanded region to
       be filled in with the DC coefficient of the nearest block in  the  input  image  rather  than
       grayed  out.   Attaching  an 'r' character ("reflect") to the width number will cause the ex‐
       panded region to be filled in with repeated reflections of the input image rather than grayed
       out.

       A  complementary  lossless  wipe option is provided to discard (gray out) data inside a given
       image region while losslessly preserving what is outside:

### -wipe WxH+X+Y
              Wipe (gray out) a rectangular region of width W and height H  from  the  input  image,
              starting at point X,Y.

       Attaching an 'f' character ("flatten") to the width number will cause the region to be filled
       with the average of adjacent blocks rather than grayed out.  If the wipe region and  the  re‐
       gion  outside  the wipe region, when adjusted to the nearest iMCU boundary, form two horizon‐
       tally adjacent rectangles, then attaching an 'r' character ("reflect") to  the  width  number
       will  cause  the  wipe  region  to  be filled with repeated reflections of the outside region
       rather than grayed out.

       A lossless drop option is also provided, which allows  another  JPEG  image  to  be  inserted
       ("dropped")  into the input image data at a given position, replacing the existing image data
       at that position:

### -drop +X+Y filename
              Drop (insert) another image at point X,Y

       Both the input image and the drop image must have the same subsampling level.  It is best  if
       they  also  have  the same quantization (quality.)  Otherwise, the quantization of the output
       image will be adapted to accommodate the higher of the input image quality and the drop image
       quality.   The  trim  option can be used with the drop option to requantize the drop image to
       match the input image.  Note that a grayscale image can be dropped into a full-color image or
       vice  versa, as long as the full-color image has no vertical subsampling.  If the input image
       is grayscale and the drop image is full-color, then the chrominance channels  from  the  drop
       image will be discarded.

       Other not-strictly-lossless transformation switches are:

### -grayscale
              Force grayscale output.

              This option discards the chrominance channels if the input image is YCbCr (ie, a stan‐
              dard color JPEG), resulting in a grayscale JPEG file.  The luminance channel  is  pre‐
              served  exactly,  so  this is a better method of reducing to grayscale than decompres‐
              sion, conversion, and recompression.  This switch is particularly handy for  fixing  a
              monochrome  picture that was mistakenly encoded as a color JPEG.  (In such a case, the
              space savings from getting rid of the near-empty chroma channels won't be  large;  but
              the  decoding  time  for  a grayscale JPEG is substantially less than that for a color
              JPEG.)

       **jpegtran** also recognizes these switches that control what to do with "extra" markers, such as
       comment blocks:

### -copy none
              Copy  no  extra  markers  from  source file.  This setting suppresses all comments and
              other metadata in the source file.

### -copy comments
              Copy only comment markers.  This setting copies comments from the source file but dis‐
              cards any other metadata.

### -copy icc
              Copy  only  ICC  profile markers.  This setting copies the ICC profile from the source
              file but discards any other metadata.

### -copy all
              Copy all extra markers.  This setting preserves miscellaneous  markers  found  in  the
              source  file,  such  as  JFIF  thumbnails, Exif data, and Photoshop settings.  In some
              files, these extra markers can be sizable.  Note that this option will copy thumbnails
              as-is; they will not be transformed.

       The  default  behavior is **-copy** **comments**.  (Note: in IJG releases v6 and v6a, **jpegtran** always
       did the equivalent of **-copy** **none**.)

       Additional switches recognized by jpegtran are:

### -icc
              Embed ICC color management profile contained in the specified file.   Note  that  this
              will cause **jpegtran** to ignore any APP2 markers in the input file, even if **-copy** **all** or
              **-copy** **icc** is specified.

### -maxmemory
              Set limit for amount of memory to use in processing large images.  Value is  in  thou‐
              sands  of  bytes, or millions of bytes if "M" is attached to the number.  For example,
              **-max** **4m** selects 4000000 bytes.  If more space is needed, an error will occur.

### -maxscans
              Abort if the input image contains more than _N_  scans.   This  feature  demonstrates  a
              method by which applications can guard against denial-of-service attacks instigated by
              specially-crafted malformed JPEG images containing numerous scans with  missing  image
              data or image data consisting only of "EOB runs" (a feature of progressive JPEG images
              that allows potentially hundreds of thousands of adjoining  zero-value  pixels  to  be
              represented  using only a few bytes.)  Attempting to transform such malformed JPEG im‐
              ages can cause excessive CPU activity, since the decompressor must fully process  each
              scan (even if the scan is corrupt) before it can proceed to the next scan.

### -outfile
              Send output image to the named file, not to standard output.

### -report
              Report transformation progress.

### -strict
              Treat  all warnings as fatal.  This feature also demonstrates a method by which appli‐
              cations can guard against attacks instigated by specially-crafted malformed  JPEG  im‐
              ages.   Enabling  this  option will cause the decompressor to abort if the input image
              contains incomplete or corrupt image data.

### -verbose
              Enable debug printout.  More **-v**'s give more  output.   Also,  version  information  is
              printed at startup.

### -debug -verbose

### -version
              Print version information and exit.

## EXAMPLES
       This example converts a baseline JPEG file to progressive form:

              **jpegtran** **-progressive** _foo.jpg_ **>** _fooprog.jpg_

       This example rotates an image 90 degrees clockwise, discarding any unrotatable edge pixels:

              **jpegtran** **-rot** **90** **-trim** _foo.jpg_ **>** _foo90.jpg_

## ENVIRONMENT
       **JPEGMEM**
              If this environment variable is set, its value is the default memory limit.  The value
              is specified as described for the **-maxmemory** switch.  **JPEGMEM**  overrides  the  default
              value specified when the program was compiled, and itself is overridden by an explicit
              **-maxmemory**.

## SEE ALSO
       [**cjpeg**(1)](https://www.chedong.com/phpMan.php/man/cjpeg/1/markdown), [**djpeg**(1)](https://www.chedong.com/phpMan.php/man/djpeg/1/markdown), [**rdjpgcom**(1)](https://www.chedong.com/phpMan.php/man/rdjpgcom/1/markdown), [**wrjpgcom**(1)](https://www.chedong.com/phpMan.php/man/wrjpgcom/1/markdown)
       Wallace, Gregory K.  "The JPEG Still Picture Compression  Standard",  Communications  of  the
       ACM, April 1991 (vol. 34, no. 4), pp. 30-44.

## AUTHOR
       Independent JPEG Group

       This  file  was modified by The libjpeg-turbo Project to include only information relevant to
       libjpeg-turbo and to wordsmith certain sections.

## BUGS
       The transform options can't transform odd-size images perfectly.  Use **-trim**  or  **-perfect**  if
       you don't like the results.

       The  entire  image  is  read into memory and then written out again, even in cases where this
       isn't really necessary.  Expect swapping on large images, especially when using the more com‐
       plex transform options.



                                            13 July 2021                                 [JPEGTRAN(1)](https://www.chedong.com/phpMan.php/man/JPEGTRAN/1/markdown)
