웹사이트용으로 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 ffmpegbash
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"
donebash
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"
donebash
mkdir -p output
for f in *.png; do
ffmpeg -i "$f" -lossless 1 "output/${f%.png}.webp"
doneWebP는 일반적으로 동등한 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"
donebash
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 → JPG | for f in *.png | do ffmpeg -i "$f" -q:v 3 output/${f%.png}.jpg |
| 모든 JPG → WebP | for f in *.jpg | do ffmpeg -i "$f" -quality 85 output/${f%.jpg}.webp |
| 모든 JPG → PNG | for f in *.jpg | do ffmpeg -i "$f" output/${f%.jpg}.png |
| 모두 → WebP 무손실 | for f in *.png | do ffmpeg -i "$f" -lossless 1 output/${f%.png}.webp |
| 크기 조정 + 변환 | for f in *.jpg | do ffmpeg -i "$f" -vf scale=1080:-1 -q:v 3 output/${f%.jpg}.jpg |
FFmpeg가 적합하지 않은 경우
RAW 카메라 형식(CR2, NEF, ARW) — 지원이 제한적. darktable이나 RawTherapee 사용.
AVIF 인코딩 — 하드웨어 가속 없이는 매우 느림.
파일이 몇 개뿐인가? FastConvert가 더 빠르다 — 설치 불필요.
자주 묻는 질문
정리
FFmpeg 이미지 일괄 변환은 간단한 쉘 루프로 이루어진다. 전체 라이브러리를 처리하기 전에 항상 소량으로 먼저 테스트할 것.
커맨드라인 없이 이미지를 변환하려면? FastConvert — 무료, 가입 불필요.
