Question

I need to crop a number of images in jpeg format by 20 pixels on the right side losslessly on Linux.

I checked jpegtran, but it needs the file size in pixels before cropping, and I don't know how to build a batch file with that.

How can I losslessly crop 20 pixels from the right side of images programmatically?

Was it helpful?

Solution

My shell scripting is a little rusty so please make a backup of your images before trying this script.

#!/bin/bash
FILES=/path/to/*.jpg

for f in $FILES
do
    identify $f | awk '{ split($3, f, "x"); f[1] -= 20; cl = sprintf("jpegtran -crop %dx%d+0+0 %s > new_%s", f[1], f[2], $1, $1); system(cl); }'
done

Points to note:

  • Adjust the path to the correct value
  • Do you need *.jpeg?
  • identify is an ImageMagick command
  • awk will grab the pixel dimensions from identify to use as a parameter (with the width reduced by 20px) for jpegtran to crop the image
  • The new image is saved as new_[old_name].jpg
  • jpegtran might adjust the cropping region so that it can perform losslessly. Check that the resulting images are the correct size and not slightly larger.

OTHER TIPS

Very similar to the accepted answer, the following would also work with file names containing spaces. And it is arguably simpler, using identify's built-in -format option instead of parsing the output with awk.

#!/bin/bash

X=0; Y=0   # offset from top left corner

for f in /path/to/*.jpg; do
    read -r W H < <(identify -format '%w %h' "$f") # get width and height
    (( W -= 20 ))                                  # substract 20 from width
    out="${f%%.jpg}-crop-20.jpg"                   # add "-crop-20" to filename
    jpegtran -crop ${W}x$H+$X+$Y "$f" > "$out"     # crop
done
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top