- The 70+ best Black Friday TV deals 2024: Save up to $2,000
- One of the best cheap Android phones I've tested is not a Motorola or Samsung
- The best VPN services for iPhone: Expert tested and reviewed
- Docker Desktop 4.36 | Docker
- This 3-in-1 MagSafe dock will charge your Apple devices while keeping them cool (and for Black Friday it's only $48)
Resizing images on the Linux command line
The convert command from the ImageMagick suite of tools provides ways to make all sorts of changes to image files. Among these is an option to change the resolution of images. The syntax is simple, and the command runs extremely quickly. It can also convert a image from one format to another (e.g., jpg to png) as well as blur, crop, despeckle, dither, flip and join images and more.
Although the commands and scripts in this post mostly focus on jpg files, the convert command also works with a large variety of other image files, including png, bmp, svg, tiff, gif and such.
Basic resizing
To resize an image using the convert, you would use a command like this:
$ convert -resize 1200x1000 smile.jpg smile-2.jpg
The syntax is “convert -resize resolution currentfile newfile”.
The resolution should be expressed as the desired width (in pixels), followed by an “x” and then the desired height. Note that if the numbers aren’t numerically related to the current dimensions of the image, the resultant resolution might not be what you expect. Generating a 1200×1000 image from a 2400×2000 is one thing. Asking for it to be saved as a 2000×1200 will result in one that is only 1440×1200.
Using a script
If you intend to convert a number of images or will be resizing images often, it’s a good idea to use a script. The first script shown below would create a “smile_2.jpg” file from a “smile.jpg” file using the 1200×800 resolution. Note how it extracts the file extension from the filename so that it can build the new filename.
#!/bin/bash if [ $# -eq 0 ]; then echo -n "image file: " read img else img=$1 fi add=2 # get filetype and base name from argument filetype=`echo $img | awk -F . '{print $2}'` basename=`echo $img | sed 's/.jpg//'` # target resolution resolution=1200x800 # new file name will include "_2" newfile="${basename}_${add}.$filetype" # run convert command convert -resize $resolution $img $newfile # display the new file ls -l $newfile
Resizing a group of image files
The next script will create a 1200×800 resolution file from each of the jpg files in the current directory and will display each of the new files after it has been set up.
#!/bin/bash num=2 resolution=1200x800 for image in `ls *.jpg`; do basename=`echo $image | sed "s/.jpg//"` convert -resize $resolution $image ${basename}_${num}.jpg ls -ltr | tail -1 done
If you run the script, you would see something like this:
$ resize_jpg_files -rw-r--r--. 1 shs shs 49321 May 25 09:52 camper_2.jpg -rw-r--r--. 1 shs shs 3872 May 25 09:52 map_2.jpg -rw-r--r--. 1 shs shs 3872 May 25 09:52 pig_2.jpg -rw-r--r--. 1 shs shs 130432 May 25 09:52 tree-cutting_2.jpg -rw-r--r--. 1 shs shs 45082 May 25 09:52 volcano_rings_2.jpg
Resizing by file type
The next script will ask you what type of image files to convert and will then run through the files of the type in the current directory. Like the previous script, it adds a “_2” to the file names to differentiate them from the originals. This can easily be changed, of course, if some other character or string works better for you.
#!/bin/bash echo -n "file type: " read filetype add=2 resolution=800x600 for image in `ls *.$filetype`; do echo $image basename=`echo $image | sed "s/.$filetype//"` convert -resize $resolution $image ${basename}_${add}.$filetype ls -ltr | tail -1 done
Using multiple image resolutions
This last script asks for the name of a single image file and then creates new versions of the image using three different resolutions. It also adds the intended resolution to the file name.
#!/bin/bash # ask for image file name echo -n "image: " read image if [ ! -f $image ]; then echo "No such file: $image" exit 1 fi # NOTE: resolution is height x width for reso in 400x500 600x800 800x1200; do basename=`echo $image | sed 's/.jpg//'` convert -resize $reso $image ${basename}_${reso}.jpg ls -ltr | tail -1 done
The resultant files might look like this:
$ ls -l dog* -rw-r--r--. 1 shs shs 14501 May 25 12:29 dog_400x500.jpg -rw-r--r--. 1 shs shs 28658 May 25 12:29 dog_600x800.jpg -rw-r--r--. 1 shs shs 45082 May 25 12:29 dog_800x1200.jpg -rw-r--r--. 1 shs shs 58628 May 25 12:25 dog.jpg
Wrap-up
The convert command makes resizing image files extremely easy. To learn more about some of the command’s other options, check out this post on converting and manipulating image files on the Linux command line.
Copyright © 2023 IDG Communications, Inc.