【PowerShell】フォルダ内の画像をリサイズして別フォルダに保存する方法

【bat】バッチファイルでネットワーク接続を監視して異常を検知したら再接続する方法 PowerShell

Windows環境で画像のサイズを一括変更したい場合、PowerShellを使ってバッチ処理することで、手間を大幅に削減できます。今回は、指定したフォルダ内の画像をリサイズして、別のフォルダに保存するスクリプトの作り方を紹介します。

PowerShellで画像を扱う準備

PowerShellでは標準で画像処理機能が備わっていないため、.NET FrameworkのSystem.Drawing名前空間を使用します。これにより、画像の読み込み・リサイズ・保存が可能になります。

スクリプト全体の構成

以下のスクリプトは、指定フォルダ内の.jpgや.png画像を横幅800pxにリサイズし、別の出力フォルダに同名で保存します。

# 入力フォルダと出力フォルダを指定
$inputFolder = "C:\Images\Input"
$outputFolder = "C:\Images\Output"

# 出力フォルダが存在しない場合は作成
if (-not (Test-Path $outputFolder)) {
    New-Item -ItemType Directory -Path $outputFolder | Out-Null
}

# System.Drawingのアセンブリを読み込み
Add-Type -AssemblyName System.Drawing

# 対象画像を取得(jpgとpng)
$images = Get-ChildItem -Path $inputFolder -Include *.jpg, *.png -File -Recurse

foreach ($img in $images) {
    try {
        # 画像を読み込み
        $bitmap = [System.Drawing.Image]::FromFile($img.FullName)

        # 新しい横幅と高さを計算(アスペクト比維持)
        $newWidth = 800
        $scale = $newWidth / $bitmap.Width
        $newHeight = [int]($bitmap.Height * $scale)

        # 新しい画像を作成
        $resized = New-Object System.Drawing.Bitmap $newWidth, $newHeight
        $graphics = [System.Drawing.Graphics]::FromImage($resized)
        $graphics.InterpolationMode = "HighQualityBicubic"
        $graphics.DrawImage($bitmap, 0, 0, $newWidth, $newHeight)

        # 出力ファイルのパスを生成
        $outputPath = Join-Path $outputFolder $img.Name

        # 保存
        $resized.Save($outputPath, $bitmap.RawFormat)

        # メモリ解放
        $graphics.Dispose()
        $resized.Dispose()
        $bitmap.Dispose()

        Write-Host "変換完了: $($img.Name)"
    } catch {
        Write-Warning "エラー: $($img.Name) の処理中に問題が発生しました。"
    }
}

実行前の注意点

  • 入力フォルダと出力フォルダのパスは自分の環境に合わせて書き換えてください。
  • 元画像はそのまま保持され、新しいフォルダにリサイズ後の画像が保存されます。
  • 大量の画像を処理する場合は、メモリ使用量や処理時間に注意してください。

まとめ

PowerShellを使えば、GUIツールを使わずに画像の一括処理が可能です。特に、アスペクト比を保ったままサイズ変更ができる点は実用的です。定期的な画像整理やWeb用に軽量化した画像を作る際にも活用できます。