Bạn có 500 ảnh chụp màn hình PNG cần chuyển đổi sang WebP cho website. FFmpeg nổi tiếng là công cụ video nhưng xử lý ảnh cũng tốt không kém.
Tại sao dùng FFmpeg cho ảnh?
FFmpeg có thể đã được cài đặt nếu bạn làm việc với video. Với định dạng RAW (CR2, NEF, ARW), dùng darktable hoặc RawTherapee.
Cài đặt FFmpeg
# macOS
brew install ffmpeg
# Ubuntu / Debian
sudo apt install ffmpeg
# Windows (Chocolatey)
choco install ffmpegffmpeg -versionCấu trúc cơ bản
Mỗi lệnh chuyển đổi hàng loạt đều có cùng cấu trúc: vòng lặp shell (Linux/macOS) hoặc vòng lặp for (Windows). Luôn ghi vào thư mục đầu ra riêng.
Chuyển đổi hàng loạt PNG sang JPG
mkdir -p output
for f in *.png; do
ffmpeg -i "$f" -q:v 2 "output/${f%.png}.jpg"
donemkdir output
for %f in (*.png) do ffmpeg -i "%f" -q:v 2 "output/%~nf.jpg"New-Item -ItemType Directory -Force output
Get-ChildItem *.png | ForEach-Object {
ffmpeg -i $_.FullName -q:v 2 "output/$($_.BaseName).jpg"
}| -q:v | Chất lượng | Sử dụng điển hình |
|---|---|---|
| 1-2 | Gần như không mất | In ấn, lưu trữ |
| 3-5 | Chất lượng cao | Nhiếp ảnh web |
| 6-10 | Chất lượng trung bình | Xem trước |
| 11+ | Chất lượng thấp | Tránh dùng |
Chuyển đổi hàng loạt JPG sang WebP
mkdir -p output
for f in *.jpg *.jpeg; do
[ -f "$f" ] || continue
ffmpeg -i "$f" -quality 85 "output/${f%.*}.webp"
donemkdir -p output
for f in *.png; do
ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
doneWebP tạo ra file thường nhỏ hơn 25–35 % so với JPG tương đương. Với ảnh chụp, 80–85 là khoảng tối ưu.
Chuyển đổi sang PNG
mkdir -p output
for f in *.jpg *.jpeg; do
[ -f "$f" ] || continue
ffmpeg -i "$f" "output/${f%.*}.png"
doneChuyển đổi định dạng hỗn hợp
mkdir -p output
for f in *.jpg *.jpeg *.png *.webp *.tiff *.bmp; do
[ -f "$f" ] || continue
ffmpeg -i "$f" -q:v 3 "output/${f%.*}.jpg"
doneThay đổi kích thước và chuyển đổi trong một bước
mkdir -p output
for f in *.png; do
ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 "output/${f%.png}.jpg"
donemkdir -p output
for f in *.jpg; do
ffmpeg -i "$f" -vf "crop='min(iw,ih)':'min(iw,ih)',scale=200:200" \
"output/${f%.jpg}_thumb.jpg"
doneXử lý đệ quy thư mục con
find . -name "*.png" -not -path "./output*" | while read f; do
output="output/${f#./}"
mkdir -p "$(dirname "$output")"
ffmpeg -i "$f" -q:v 3 "${output%.png}.jpg"
doneXử lý song song để tăng tốc
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}Trên máy 8 nhân với SSD, xử lý song song thường giảm thời gian chuyển đổi 3–5 lần.
Chỉ báo tiến trình
total=$(ls *.png | wc -l)
count=0
mkdir -p output
for f in *.png; do
count=$((count + 1))
echo "[$count/$total] $f"
ffmpeg -loglevel quiet -i "$f" -q:v 3 "output/${f%.png}.jpg"
doneXử lý lỗi
mkdir -p output
error_log="errors.txt"
> "$error_log"
for f in *.jpg *.jpeg *.png *.webp; do
[ -f "$f" ] || continue
if ffmpeg -loglevel error -i "$f" -quality 85 "output/${f%.*}.webp" 2>>"$error_log"; then
echo "✓ $f"
else
echo "✗ $f"
fi
doneTham khảo lệnh
| Chuyển đổi | Lệnh (Linux/macOS) | Ghi chú |
|---|---|---|
| Tất cả PNG → JPG | for f in *.png | do ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg |
| Tất cả JPG → WebP | for f in *.jpg | do ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp |
| Tất cả JPG → PNG | for f in *.jpg | do ffmpeg -i "$f" output/${f%.jpg}.png |
| Tất cả → WebP không mất | for f in *.png | do ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp |
| Thay đổi kích thước + chuyển đổi | for f in *.jpg | do ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg |
Khi FFmpeg không phải công cụ phù hợp
Định dạng RAW máy ảnh — hỗ trợ hạn chế. Dùng darktable hoặc RawTherapee.
Encoding AVIF — có thể nhưng rất chậm nếu không có tăng tốc phần cứng.
Chỉ vài file? FastConvert nhanh hơn — không cần cài đặt.
Câu hỏi thường gặp
Tổng kết
Chuyển đổi ảnh hàng loạt với FFmpeg xoay quanh một vòng lặp shell đơn giản. Luôn thử nghiệm với một batch nhỏ trước khi xử lý toàn bộ thư viện.
Cần chuyển đổi ảnh không dùng dòng lệnh? FastConvert — miễn phí, không cần đăng ký.
