How to crop images and videos with FFmpeg

FFmpeg is a robust command-line utility that makes cropping images and videos both simple and efficient. In this guide, we demonstrate practical techniques to crop media files directly from the terminal—streamlining your development workflow.
Introduction to FFmpeg for image and video cropping
FFmpeg is a versatile tool used to process audio, video, and image files. In addition to converting formats and encoding streams, FFmpeg can crop media precisely. This capability is especially useful when you need to focus on a particular region of an image or video, whether for web applications, content editing, or automation tasks.
Installing FFmpeg on your system
Before diving into cropping, ensure FFmpeg is installed on your system.
Installing on macOS
Install FFmpeg using Homebrew:
brew install ffmpeg
Installing on Linux
For Debian-based systems:
sudo apt update
sudo apt install ffmpeg
For Red Hat-based systems:
sudo dnf install ffmpeg
Installing on Windows
Download the latest build from the official FFmpeg website.
Extract the binaries and add the FFmpeg bin
directory to your system’s PATH environment variable.
Basic concepts of cropping in FFmpeg
Cropping is achieved using FFmpeg’s crop
filter, which requires four parameters:
width
(out_w
): The width of the output media.height
(out_h
): The height of the output media.x
: The x-coordinate of the top-left corner where cropping begins.y
: The y-coordinate of the top-left corner where cropping begins.
The general syntax is:
ffmpeg -i input -vf "crop=out_w:out_h:x:y" output
Cropping images with FFmpeg
Although FFmpeg is widely known for video processing, it handles images with equal proficiency. Here is an example to crop an image.
Example: cropping an image
To crop a 200x200 pixel region starting from coordinates (50,50) in input.jpg
:
ffmpeg -i input.jpg -vf "crop=200:200:50:50" output.jpg
Explanation
-i input.jpg
specifies the input file.-vf "crop=200:200:50:50"
applies the crop filter with the defined dimensions and offsets.output.jpg
is the resulting cropped image.
Cropping videos with FFmpeg
Cropping videos operates similarly to images, applying the crop filter to every frame in the video.
Example: cropping a video
To crop a 1280x720 region starting from the top-left corner of input.mp4
:
ffmpeg -i input.mp4 -vf "crop=1280:720:0:0" output.mp4
Explanation
-i input.mp4
specifies the input video.-vf "crop=1280:720:0:0"
crops the video to 1280x720 pixels from the top-left corner.output.mp4
is the output file.
Dynamic cropping based on input dimensions
For more flexibility, you can use expressions to automatically crop relative to the input video dimensions. For instance, to crop the central square of a video:
ffmpeg -i input.mp4 -vf "crop='min(in_w\,in_h)':'min(in_w\,in_h)':(in_w-min(in_w\,in_h))/2:(in_h-min(in_w\,in_h))/2" output.mp4
in_w
andin_h
represent the input width and height.- The function
min(in_w\,in_h)
selects the smaller dimension, ensuring a square crop. - The expressions center the crop horizontally and vertically.
Command line options for cropping in FFmpeg
The essential cropping command is:
ffmpeg -i input -vf "crop=out_w:out_h:x:y" output
You can also specify named parameters for clarity:
ffmpeg -i input.mp4 -vf "crop=w=1280:h=720:x=0:y=0" output.mp4
Both approaches yield the same result.
Automating cropping tasks with scripts
Automating repetitive cropping tasks can save valuable time. You can write shell scripts or batch files to apply consistent crop settings to multiple files.
Batch cropping images with a bash script
The following script processes all .jpg
files in a directory:
#!/bin/bash
for img in *.jpg; do
ffmpeg -i "$img" -vf "crop=200:200:50:50" "cropped_$img"
done
Batch cropping images with a batch script (Windows)
for %%i in (*.jpg) do ffmpeg -i "%%i" -vf "crop=200:200:50:50" "cropped_%%i"
Using Python to automate cropping
You can also call FFmpeg from Python:
import subprocess
import glob
for img in glob.glob("*.jpg"):
subprocess.call([
"ffmpeg",
"-i", img,
"-vf", "crop=200:200:50:50",
f"cropped_{img}"
])
Why use FFmpeg for cropping?
FFmpeg is a reliable choice for media cropping due to several reasons:
- Automation: Easily scriptable for batch processing.
- Versatility: Supports a wide range of input and output formats.
- Efficiency: Processes media quickly and integrates smoothly into automated workflows.
- Headless Operation: Ideal for server environments without a graphical interface.
Conclusion and further resources
Cropping images and videos with FFmpeg is straightforward once you understand the parameters and syntax. Whether you are tackling a one-time project or automating recurring tasks, FFmpeg provides robust tools to enhance your media processing pipeline.
For more detailed information, visit the FFmpeg documentation.
If you are looking for a scalable solution to automate media processing tasks, including image and video cropping, consider exploring the Transloadit API.