Watch imgp resize a directory of images in lightning speed!
imgp is a command line image resizer and rotator for JPEG and PNG images. It can resize (or thumbnail) and rotate thousands of images in a go, at lightning speed, while saving significantly on storage.
Powered by multiprocessing, an intelligent adaptive algorithm, recursive operations, shell completion scripts, EXIF preservation (and more),
imgp is a very flexible utility with well-documented easy to use options.
imgp intends to be a stronger replacement of the Nautilus Image Converter extension, not tied to any file manager and way faster. On desktop environments (like Xfce or LxQt) which do not integrate Nautilus,
imgp will save your day.
Love smart and efficient utilities? Explore my repositories. Buy me a cup of coffee if they help you.
Table of Contents
- Shell completion
- resize by percentage or resolution
- rotate clockwise by specified angle
- adaptive resize considering orientation
- brute force to a resolution
- optimize images to save more space
- limit processing by minimum image size
- convert PNG to JPEG
- erase exif metadata
- specify output JPEG image quality
- force smaller to larger resize
- process directories recursively
- overwrite source image option
- completion scripts for bash, fish, zsh
- minimal dependencies
- If the specified and image orientations are same [(H >= V and h > v) or (H < V and h < v)], the image is resized with the longer specified side as reference.
- In case of cross orientation [(H >= V and h <= v) or (H < V and h >= v)], the image is resized with the shorter specified side as reference. Same as non-adaptive.
For example, if an image has a resolution of 2048x1365 and is being resized to 1366x768:
- In regular mode (default), output image resolution will be 1152x768
- In adaptive mode, output image resolution will be 1366x910
imgp could resize 8823 images (approx. 4.5GB in size) of mixed resolutions (high to regular) stored in a USB 2.0 external hard disk at an adaptive resolution of 1366x1000 in around 8 minutes. The resulting size was 897MB (approx. 20%).
imgp uses Python PIL/Pillow library. Nautilus Image Converter calls the
convert utility from ImageMagick. For a comparative benchmark, head here.
imgp requires Python 3.5 or later.
To install PIL library on Ubuntu, run:
$ sudo apt-get install python3-pil
or, using pip3:
$ sudo pip3 install pillow
From a package manager
- AUR (
yay -S imgp)
- Debian (
apt-get install imgp)
- Fedora (
dnf install imgp)
- macOS/Homebrew tap (
brew install jarun/imgp/imgp)
- openSUSE (
zypper in imgp)
- Raspbian Testing (
apt-get install imgp)
- Slackware (
slackpkg install imgp)
- Source Mage (
- Ubuntu (
apt-get install imgp)
- Ubuntu PPA (
apt-get install imgp)
- Void Linux (
xbps-install -S imgp)
Packages for Arch Linux, CentOS, Debian, Fedora, openSUSE Leap and Ubuntu are available with the latest stable release.
Install to default location (
$ sudo make install
To remove, run:
$ sudo make uninstall
PREFIX is supported, in case you want to install to a different location.
imgp is a standalone utility. From the containing directory, run:
Shell completion scripts for Bash, Fish and Zsh can be found in respective subdirectories of auto-completion/. Please refer to your shell's manual for installation instructions.
usage: imgp [-h] [-x res] [-o deg] [-a] [-c] [-d] [-e] [-f] [-i] [-k] [-m] [-n] [--nn] [-p] [--pr] [-q N] [-r] [-s byte] [-w] [-z] [PATH [PATH ...]] Resize, rotate JPEG and PNG images. positional arguments: PATH source file or dir [default: current dir] optional arguments: -h, --help show this help message and exit -x res, --res res output resolution in HxV or percentage -o deg, --rotate deg rotate clockwise by angle (in degrees) -a, --adapt adapt to resolution by orientation [default: off] -c, --convert convert PNG to JPG format [default: off] -d, --dot include hidden files (on Linux) [default: off] -e, --eraseexif erase exif metadata [default: off] -f, --force force to exact specified resolution [default: off] -i, --includeimgp re-process _IMGP files. * RISKY: refer to docs -k, --keep skip (but convert or make progressive, if opted) images with matching specified hres or vres or --res=100 [default: off] -m, --mute operate silently [default: informative] -n, --enlarge enlarge smaller images [default: off] --nn use nearest neighbour interpolation for PNG images [default: antialias] -p, --optimize optimize the output images [default: off] --pr, --progressive save JPEG images as progressive [default: off] -q N, --quality N quality factor (N=1-95, JPEG only) [default: 75] -r, --recurse process directories recursively [default: off] symbolic links are ignored -s byte, --size byte minimum size to process an image [default: 1024] -w, --overwrite overwrite source images [default: off] -z, --debug enable debug logs [default: off]
- Multiple files and directories can be specified as source. If
PATHis omitted, the current directory is processed.
- Output image names are appended with _IMGP if
--overwriteoption is not used. By default _IMGP files are not processed. Doing so may lead to potential race conditions when
--overwriteoption is used.
- PNG files with lower target hres/vres are not converted (even if
--convertis used). Run
imgp --convert (*.png)separately to convert those.
- Resize and rotate are lossy operations. For additional reductions in size try
--optimizeis slower, the encoder makes an extra pass over the image in order to select optimal encoder settings.
- Progressive JPEG images are saved as progressive.
Convert some images and directories:
$ imgp -x 1366x768 ~/ ~/Pictures/image3.png ~/Downloads/ /home/testuser/image1.png 3840x2160 -> 1365x768 11104999 bytes -> 1486426 bytes /home/testuser/image2.jpg 2048x1365 -> 1152x768 224642 bytes -> 31421 bytes /home/testuser/Pictures/image3.png 1920x1080 -> 1365x768 2811155 bytes -> 1657474 bytes /home/testuser/Downloads/image4 2048x1365 -> 1152x768 224642 bytes -> 31421 bytes
Scale an image by 75% and overwrite the source image:
$ imgp -x 75 -w ~/image.jpg /home/testuser/image.jpg 1366x767 -> 1025x575 120968 bytes -> 45040 bytes
Rotate an image clockwise by 90 degrees:
$ imgp -o 90 ~/image.jpg 120968 bytes -> 72038 bytes
Adapt the images in the current directory to 1366x1000 resolution. Visit all directories recursively, overwrite source images, ignore images with matching hres or vres but convert PNG images to JPEG.
$ imgp -x 1366x1000 -wrack
Set hres=800 and adapt vres maintaining the ratio.
$ imgp -x 800x0 Source omitted. Processing current directory... ./image1.jpg 1366x911 -> 800x534 69022 bytes -> 35123 bytes ./image2.jpg 1050x1400 -> 800x1067 458092 bytes -> 78089 bytes
Process images greater than 50KB (50*1024 bytes) only:
$ imgp -wrackx 1366x1000 -s 51200