Quick Answer
For bulk HEIC conversion: on Mac, use the built-in sips terminal command (converts 100+ files per minute). On Windows, use ImageMagick with a PowerShell loop. For batches under 50 files, the HEIC to JPG Converter Chrome extension is the easiest option with no command line needed.
Whether you're migrating a year's worth of iPhone photos, processing a client's event gallery, or converting a media library from HEIC to JPG for web use — bulk conversion tools save enormous amounts of time compared to converting files one by one.
This guide covers the fastest methods for bulk converting any number of HEIC files, from dozens to thousands.
Which Tool to Use Based on Volume
| File Count | Recommended Tool | Why |
|---|---|---|
| 1–20 files | Chrome Extension | No commands, easiest for occasional use |
| 20–100 files | Chrome Extension or Preview (Mac) | Both handle this comfortably |
| 100–500 files | macOS Preview or sips | Hardware-accelerated, fast enough |
| 500–5,000 files | macOS sips or ImageMagick | Command-line speed essential |
| 5,000+ files | ImageMagick with parallel processing | Multi-core parallelization needed |
Quick Batches Under 50 Files?
Use the Chrome extension — select multiple HEIC files and convert them all with one click.
Add HEIC to JPG ConverterMac: sips Command (Fastest Built-In Tool)
Basic batch convert (current folder):
cd /path/to/your/heic/files
mkdir -p jpgs
for f in *.heic *.HEIC; do
[ -f "$f" ] && sips -s format jpeg "$f" --out "jpgs/${f%.*}.jpg"
done
With quality control:
for f in *.heic *.HEIC; do
[ -f "$f" ] && sips -s format jpeg -s formatOptions 92 "$f" --out "jpgs/${f%.*}.jpg"
done
Recursive (subfolders too):
find /path/to/photos -name "*.heic" -o -name "*.HEIC" | while read f; do
dir=$(dirname "$f")
base=$(basename "${f%.*}")
sips -s format jpeg "$f" --out "$dir/$base.jpg"
done
Windows: ImageMagick (Most Powerful)
Install ImageMagick:
winget install ImageMagick.ImageMagick
Or download from imagemagick.org.
Batch convert current folder (PowerShell):
$input = "C:\Photos\HEIC"
$output = "C:\Photos\JPG"
New-Item -ItemType Directory -Force -Path $output | Out-Null
Get-ChildItem -Path $input -Filter "*.heic" | ForEach-Object {
$out = Join-Path $output ($_.BaseName + ".jpg")
magick $_.FullName -quality 92 $out
Write-Host "Converted: $($_.Name)"
}
Recursive batch convert (all subfolders):
Get-ChildItem -Path "C:\Photos" -Recurse -Filter "*.heic" | ForEach-Object {
$outDir = $_.DirectoryName + "\jpgs"
New-Item -ItemType Directory -Force -Path $outDir | Out-Null
magick $_.FullName -quality 92 ($outDir + "\" + $_.BaseName + ".jpg")
}
Parallel processing (much faster for 500+ files):
Get-ChildItem -Path "C:\Photos" -Filter "*.heic" | ForEach-Object -Parallel {
magick $_.FullName -quality 92 ($_.DirectoryName + "\" + $_.BaseName + ".jpg")
} -ThrottleLimit 8
The -ThrottleLimit 8 uses 8 parallel jobs simultaneously. Adjust based on your CPU core count.
Linux: Command Line
Install dependencies (Ubuntu/Debian):
sudo apt install imagemagick libheif-dev
Batch convert:
for f in /path/to/photos/*.heic; do
magick "$f" -quality 92 "${f%.heic}.jpg"
done
Parallel processing with GNU Parallel:
find /path/to/photos -name "*.heic" | parallel magick {} {.}.jpg
Preserving Folder Structure
For large photo libraries with complex folder structures, you may want to preserve the original folder hierarchy in the output:
# Mac: Preserve folder structure
SRC="/Volumes/Photos/HEIC"
DST="/Volumes/Photos/JPG"
find "$SRC" -name "*.heic" | while read f; do
rel="${f#$SRC/}"
out="$DST/${rel%.heic}.jpg"
mkdir -p "$(dirname "$out")"
sips -s format jpeg -s formatOptions 92 "$f" --out "$out"
done
Performance Benchmarks
| Tool | 100 files | 1,000 files | Setup Required |
|---|---|---|---|
| sips (M2 Mac) | ~45 sec | ~7 min | None (built-in) |
| sips (Intel Mac) | ~90 sec | ~15 min | None (built-in) |
| ImageMagick (Windows, sequential) | ~3 min | ~30 min | Install ImageMagick |
| ImageMagick (Windows, 8 parallel) | ~45 sec | ~8 min | Install ImageMagick |
| Chrome Extension | ~8 min | Not recommended | None (browser extension) |
Frequently Asked Questions
find /path -name "*.heic" | while read f; do sips -s format jpeg "$f" --out "${f%.heic}.jpg"; done. On Windows with PowerShell: Get-ChildItem -Recurse -Filter "*.heic" | ForEach-Object { magick $_.FullName ($_.FullName -replace ".heic",".jpg") }