Batch Resize Foto dengan ImageMagick — Simpan Hasil ke Folder Terpisah

Pendahuluan (singkat & mudah)

Kalau kamu punya banyak foto di satu folder dan ingin mengubah ukurannya sekaligus — misalnya membuat versi web (lebar 800px) — tapi tetap mau menyimpan foto asli di folder asal, ImageMagick sangat cocok untuk tugas ini. Di bawah ada beberapa metode: perintah cepat (single directory), skrip rekursif (memproses subfolder), dan contoh untuk Windows PowerShell.

Catatan penting: Jangan gunakan mogrify tanpa opsi -path jika kamu ingin menyimpan salinan; mogrify defaultnya menimpa file asli. Gunakan -path atau pakai loop dengan magick (alias convert di versi lama).

Prasyarat

Metode 1 — Cepat: Semua file di satu folder (Linux/macOS)

Metode paling singkat: pakai mogrify -path — hasil akan ditulis ke folder tujuan, file asli tetap utuh.

# Buat folder tujuan
mkdir -p ../resized

# Resize semua JPG di folder saat ini menjadi lebar 800px (tinggi menyesuaikan)
magick mogrify -path ../resized -resize 800x -strip -quality 85 *.jpg

Penjelasan singkat:
-path ../resized → simpan hasil di folder ../resized (relatif).
-resize 800x → ubah lebar jadi 800px (tinggi menyesuaikan). Gunakan 800x800> untuk hanya mengubah gambar yang lebih besar dari 800x800. -strip menghapus metadata, -quality 85 mengatur kualitas JPEG.

Metode 2 — Loop per-file (lebih fleksibel)

Kalau mau kontrol lebih (mis. ubah format ke PNG, atau tambahkan watermark per-file), gunakan loop:

mkdir -p ../resized
for f in *.jpg; do
  magick "$f" -resize 800x -strip -quality 85 "../resized/${f%.*}.jpg"
done

Kelebihan: bisa mengubah ekstensi, menambahkan opsi per-file, atau memproses hanya tipe tertentu.

Metode 3 — Rekursif: proses subfolder & simpan struktur (Linux/macOS)

Jika folder berisi subfolder dan kamu ingin mempertahankan struktur (mis. photos/2023/resized/2023/), gunakan kombinasi find + magick:

#!/bin/bash
# rekursif-resize.sh
# Jalankan dari root folder foto (mis: /home/user/photos)

OUTDIR="resized"
mkdir -p "$OUTDIR"

find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) -print0 |
while IFS= read -r -d '' file; do
  rel="${file#./}"                        # hapus leading ./ 
  dst="$OUTDIR/$(dirname "$rel")"        # buat path destinasi sesuai struktur
  mkdir -p "$dst"
  magick "$file" -resize 800x -strip -quality 85 "$dst/$(basename "$rel")"
done

Script di atas membuat folder resized/ dan menyalin setiap file terresize ke lokasi yang sesuai, sehingga struktur internal tetap sama.

Metode 4 — Contoh: hanya mengubah gambar yang lebih besar dari ukuran target

Gunakan operator > di argumen resize agar gambar yang lebih kecil dari target tidak diperbesar:

# contoh singkat
magick mogrify -path ../resized -resize 800x800\> -strip -quality 85 *.jpg

Perhatikan backslash \ untuk menghindari interpretasi shell pada tanda >. Di banyak shell, menuliskan argumen sebagai "800x800>" juga aman.

Contoh Skrip Lengkap (Linux) — simpan & jalankan

Simpan contoh berikut sebagai batch-resize.sh, beri izin eksekusi, lalu jalankan di folder foto:

#!/bin/bash
# batch-resize.sh
# Usage: ./batch-resize.sh /path/to/source /path/to/destination 800

SRC="${1:-.}"
DST="${2:-./resized}"
SIZE="${3:-800}"

mkdir -p "$DST"
cd "$SRC" || exit 1

find . -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' \) -print0 |
while IFS= read -r -d '' file; do
  rel="${file#./}"
  outdir="$DST/$(dirname "$rel")"
  mkdir -p "$outdir"
  magick "$file" -resize "${SIZE}x" -strip -quality 85 "$outdir/$(basename "$rel")"
done

echo "Selesai. Hasil ada di: $DST"

Contoh pemakaian: ./batch-resize.sh . ../resized 800

Contoh untuk Windows (PowerShell)

Jika kamu memakai Windows + ImageMagick (magick di PATH), contoh PowerShell berikut memproses rekursif dan menyimpan hasil ke folder baru:

# PowerShell (jalankan di folder root foto)
$src = "C:\Users\User\Pictures"
$dst = "C:\Users\User\Pictures_resized"
$size = "800x"

Get-ChildItem -Path $src -Recurse -File -Include *.jpg,*.jpeg,*.png | ForEach-Object {
  $rel = $_.FullName.Substring($src.Length).TrimStart('\')
  $outDir = Join-Path $dst (Split-Path $rel -Parent)
  New-Item -ItemType Directory -Path $outDir -Force | Out-Null
  $outPath = Join-Path $outDir $_.Name
  magick $_.FullName -resize $size -strip -quality 85 $outPath
}

Sesuaikan variable $src dan $dst sebelum menjalankan.

Tips & Troubleshooting

Ringkasan singkat

Untuk menyimpan hasil resize ke folder lain dan menjaga file asli tetap berada di folder asal, gunakan:

# singkat (satu folder)
mkdir -p ../resized
magick mogrify -path ../resized -resize 800x -strip -quality 85 *.jpg

Atau pakai skrip rekursif jika ada banyak subfolder — contoh skrip sudah diberikan di atas.

times;