자동화 및 개발

FFmpeg로 이미지 일괄 변환하기: 실용 가이드

5 분 읽기
FFmpeg로 이미지 일괄 변환하기: 실용 가이드

웹사이트용으로 WebP로 변환해야 할 PNG 스크린샷 500장이 있다. 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

기본 패턴

모든 일괄 변환 명령은 동일한 구조를 따른다: 쉘 루프(Linux/macOS) 또는 for 루프(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"' _ {}

SSD 스토리지를 갖춘 8코어 머신에서 병렬 처리는 일반적으로 변환 시간을 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 카메라 형식(CR2, NEF, ARW) — 지원이 제한적. darktable이나 RawTherapee 사용.

AVIF 인코딩 — 하드웨어 가속 없이는 매우 느림.

파일이 몇 개뿐인가? FastConvert가 더 빠르다 — 설치 불필요.

자주 묻는 질문

기본적으로 아니다. -map_metadata 0 추가: ffmpeg -i input.jpg -map_metadata 0 -q:v 3 output.jpg

소스 JPG가 이미 많이 압축된 경우 발생한다. 항상 가장 품질이 높은 소스에서 변환할 것.

PNG를 출력 형식으로 사용하거나 WebP에는 -lossless 1 사용.

자동 덮어쓰기에는 -y, 기존 파일 건너뛰기에는 -n 추가.

정리

FFmpeg 이미지 일괄 변환은 간단한 쉘 루프로 이루어진다. 전체 라이브러리를 처리하기 전에 항상 소량으로 먼저 테스트할 것.

커맨드라인 없이 이미지를 변환하려면? FastConvert — 무료, 가입 불필요.

공유