ระบบอัตโนมัติและการพัฒนา

วิธีแปลงภาพจำนวนมากด้วย FFmpeg: คู่มือปฏิบัติ

5 นาทีในการอ่าน
วิธีแปลงภาพจำนวนมากด้วย FFmpeg: คู่มือปฏิบัติ

คุณมีภาพ PNG 500 ภาพที่ต้องแปลงเป็น WebP สำหรับเว็บไซต์ FFmpeg เป็นที่รู้จักในฐานะเครื่องมือวิดีโอ แต่จัดการภาพได้ดีเช่นกัน

ทำไมต้องใช้ FFmpeg สำหรับภาพ?

FFmpeg น่าจะติดตั้งอยู่แล้วถ้าคุณทำงานกับวิดีโอ สำหรับ RAW (CR2, NEF, ARW) ใช้ darktable หรือ RawTherapee

ติดตั้ง FFmpeg

bash
# macOS
brew install ffmpeg

# Ubuntu / Debian
sudo apt install ffmpeg

# Windows (Chocolatey)
choco install ffmpeg

bash
ffmpeg -version

โครงสร้างพื้นฐาน

ทุกคำสั่งแปลงแบบกลุ่มมีโครงสร้างเดียวกัน: shell loop (Linux/macOS) หรือ for loop (Windows) เขียนผลลัพธ์ไปยังโฟลเดอร์แยกเสมอ

แปลง PNG ทั้งหมดเป็น JPG

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -q:v 2 "output/${f%.png}.jpg"
done

bash
mkdir output
for %f in (*.png) do ffmpeg -i "%f" -q:v 2 "output/%~nf.jpg"

bash
New-Item -ItemType Directory -Force output
Get-ChildItem *.png | ForEach-Object {
  ffmpeg -i $_.FullName -q:v 2 "output/$($_.BaseName).jpg"
}

-q:vคุณภาพการใช้งานทั่วไป
1-2เกือบไม่มีการสูญเสียพิมพ์ เก็บถาวร
3-5คุณภาพสูงถ่ายภาพเว็บ
6-10คุณภาพปานกลางตัวอย่างภาพ
11+คุณภาพต่ำหลีกเลี่ยง

แปลง JPG ทั้งหมดเป็น WebP

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" -quality 85 "output/${f%.*}.webp"
done

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
done

WebP ให้ไฟล์เล็กกว่า JPG ที่เทียบเท่า 25–35% โดยทั่วไป สำหรับภาพถ่าย 80–85 เป็นช่วงที่เหมาะสม

แปลงเป็น PNG

bash
mkdir -p output
for f in *.jpg *.jpeg; do
  [ -f "$f" ] || continue
  ffmpeg -i "$f" "output/${f%.*}.png"
done

แปลงรูปแบบผสม

bash
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"
done

เปลี่ยนขนาดและแปลงในขั้นตอนเดียว

bash
mkdir -p output
for f in *.png; do
  ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 "output/${f%.png}.jpg"
done

bash
mkdir -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"
done

ประมวลผลโฟลเดอร์ย่อยแบบวนซ้ำ

bash
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"
done

การประมวลผลแบบขนานเพื่อความเร็ว

bash
mkdir -p output
ls *.png | xargs -P 4 -I {} sh -c 'ffmpeg -i "$1" -q:v 3 "output/${1%.png}.jpg"' _ {}

บนเครื่อง 8 คอร์พร้อม SSD การประมวลผลแบบขนานมักลดเวลาแปลง 3–5 เท่า

ตัวบ่งชี้ความคืบหน้า

bash
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"
done

การจัดการข้อผิดพลาด

bash
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
done

อ้างอิงคำสั่ง

การแปลงคำสั่ง (Linux/macOS)หมายเหตุ
PNG ทั้งหมด → JPGfor f in *.pngdo ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg
JPG ทั้งหมด → WebPfor f in *.jpgdo ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp
JPG ทั้งหมด → PNGfor f in *.jpgdo ffmpeg -i "$f" output/${f%.jpg}.png
ทั้งหมด → WebP ไม่มีการสูญเสียfor f in *.pngdo ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp
เปลี่ยนขนาด + แปลงfor f in *.jpgdo ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg

เมื่อ FFmpeg ไม่ใช่เครื่องมือที่เหมาะสม

รูปแบบ RAW ของกล้อง — รองรับจำกัด ใช้ darktable หรือ RawTherapee

การเข้ารหัส AVIF — ทำได้แต่ช้ามากหากไม่มีการเร่งด้วยฮาร์ดแวร์

แค่ไม่กี่ไฟล์? FastConvert เร็วกว่า — ไม่ต้องติดตั้ง

คำถามที่พบบ่อย

ตามค่าเริ่มต้นไม่ เพิ่ม -map_metadata 0: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

เกิดขึ้นเมื่อ JPG ต้นทางถูกบีบอัดมากแล้ว แปลงจากแหล่งที่มีคุณภาพสูงสุดเสมอ

ใช้ PNG เป็นรูปแบบเอาต์พุต หรือ -lossless 1 สำหรับ WebP

เพิ่ม -y สำหรับเขียนทับอัตโนมัติ หรือ -n เพื่อข้ามไฟล์ที่มีอยู่

สรุป

การแปลงภาพจำนวนมากด้วย FFmpeg ขึ้นอยู่กับ shell loop ง่ายๆ ทดสอบกับ batch เล็กๆ เสมอก่อนประมวลผลไลบรารีทั้งหมด

ต้องการแปลงภาพโดยไม่ใช้บรรทัดคำสั่ง? FastConvert — ฟรี ไม่ต้องลงทะเบียน

แชร์