PowerShellフォルダ内の画像ファイルを等幅のJPEGファイルに変換する

PoweShell コンピュータ
PowerShell

はじめに

多量の画像ファイルの幅を任意のサイズに揃えるスクリプトです。
同様な処理をしてくれる無料ソフトはたくさんありますがスクリプトで処理する理由はファイルの指定などが目的や環境に合わせて柔軟な対応をするためです。
JPEG形式で出力されます。

#
# フォルダ内の画像ファイルを等幅のJPEGファイルに変換する
#
# ファイル名:Change2JpegFixWidth.ps1
#
param(
    [string]
    $InputDir =  (Join-Path $env:USERPROFILE "Pictures\Input"),
    [string]
    $OutputDir =  (Join-Path $env:USERPROFILE "Pictures\Output"),
    [int]
    $FixWidth = 800
)

$ErrorActionPreference = "stop"

[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")

Function CangeToJpegFixWidth
{
    param(
        [string]
        $src, 
        [string]
        $dst, 
        [int]
        $width
    )
    
    $srcimg = [System.Drawing.Image]::FromFile([string]$src)


    $dstimg = New-Object System.Drawing.Bitmap([int]$width, [int](($srcimg.Height * $width) / $srcimg.Width))

    $gr = [System.Drawing.Graphics]::FromImage($dstimg)
    $gr.DrawImage($srcimg, (New-Object System.Drawing.Rectangle(0, 0, $dstimg.Width, $dstimg.Height)))

    $reslt = $dstimg.Save($dst, [System.Drawing.Imaging.ImageFormat]::Jpeg)

    $gr.Dispose()
    $srcimg.Dispose()
    $dstimg.Dispose()
}

$count = 0
Get-ChildItem -LiteralPath $InputDir -Recurse | ? {
    -not ($_.PSIsContainer)
} | % {
    $in = $_.FullName
    $out = Join-Path $OutputDir ($_.BaseName + ".jpg")


    $count = $count + 1
    
    echo "${count} ${in} ${out}"
    CangeToJpegFixWidth $in $out $FixWidth
}

注意事項

画像データの縮小を想定して作成しました。拡大処理が必要な場合はスクリプトの修正が必要かもしれません。

忘れがちなこと

PowerShellで複数の引数がある関数の呼び出しは関数名(引数1, 引数2)ではなく関数名 引数1 引数2であること。
前者の場合でもエラーにならず、たぶん配列として関数に引き渡されると思われる。

コメント