Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
JPEGTRAN(1)		     General Commands Manual		     JPEGTRAN(1)

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 progressive 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), with-
     out ever fully decoding 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 trans-
     formed, 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 produces 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 N
	    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 file
	    Use the scan script given in the specified text file.

     See cjpeg(1) 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  dimen-
     sions.   The other transformations operate rather oddly if the image dimen-
     sions are not a multiple of the iMCU size (usually 8 or 16 pixels), because
     they can only transform complete blocks of DCT coefficient data in the  de-
     sired way.

     jpegtran's default behavior when transforming an odd-size image is designed
     to  preserve exact reversibility and mathematical consistency of the trans-
     formation set.  As stated, transpose is able to flip the entire image area.
     Horizontal mirroring leaves any partial iMCU column at the right  edge  un-
     touched,  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 se-
     quences of transpose and flip operations; for consistency, their actions on
     edge pixels are defined to be the same as the end result of the correspond-
     ing transpose-and-flip sequence.

     For practical use, you may prefer to discard any untransformable edge  pix-
     els  rather than having a strange-looking strip along the right and/or bot-
     tom edges of a transformed image.	To do this, add the -trim switch:

     -trim  Drop non-transformable edge blocks.

	    Obviously,	a  transformation  with  -trim	is  not  reversible,  so
	    strictly  speaking jpegtran 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 -per-
	    fect 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  in-
     side.   Like the rotate and flip transforms, 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  un-
     changed.)	Thus, the output image covers at least the requested region, but
     it  may cover more.  The adjustment of the region dimensions may be option-
     ally 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 out-
	    side  of  a  given image region but losslessly preserves what is in-
	    side.  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 out-
     put image is expanded 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 expanded 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 region outside the wipe region,  when  ad-
     justed to the nearest iMCU boundary, form two horizontally adjacent rectan-
     gles,  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,  re-
     placing 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.)  Oth-
     erwise, 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 ver-
     tical subsampling.  If the input image is grayscale and the drop  image  is
     full-color,  then the chrominance channels from the drop image will be dis-
     carded.

     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  standard  color JPEG), resulting in a grayscale JPEG
	    file.  The luminance channel is preserved exactly, so this is a bet-
	    ter method of reducing to grayscale than decompression,  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  "ex-
     tra" 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 discards 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 mark-
	    ers 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 file
	    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 N
	    Set limit for amount of memory to use in  processing  large  images.
	    Value  is  in thousands of bytes, or millions of bytes if "M" is at-
	    tached to the number.  For example, -max 4m selects  4000000  bytes.
	    If more space is needed, an error will occur.

     -maxscans N
	    Abort  if  the input image contains more than N scans.  This feature
	    demonstrates a method by which applications can  guard  against  de-
	    nial-of-service  attacks  instigated  by specially-crafted malformed
	    JPEG images containing numerous scans with missing image data or im-
	    age data consisting only of "EOB runs"  (a	feature  of  progressive
	    JPEG images that allows potentially hundreds of thousands of adjoin-
	    ing  zero-value  pixels  to  be represented using only a few bytes.)
	    Attempting to transform such malformed JPEG images can cause  exces-
	    sive  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 name
	    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 applications can guard against attacks instigated by
	    specially-crafted  malformed JPEG images.  Enabling this option will
	    cause the decompressor to abort if the input image	contains  incom-
	    plete or corrupt image data.

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

     -debug
	    Same as -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 unrotat-
     able 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 pro-
	    gram  was compiled, and itself is overridden by an explicit -maxmem-
	    ory.

SEE ALSO
     cjpeg(1), djpeg(1), rdjpgcom(1), wrjpgcom(1)
     Wallace, Gregory K.  "The JPEG Still Picture Compression Standard",  Commu-
     nications 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 infor-
     mation 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 complex transform options.

				  13 July 2021			     JPEGTRAN(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=jpegtran&sektion=1&manpath=FreeBSD+Ports+15.1.quarterly>

home | help