はじめに
同様な処理をしてくれる無料ソフトはたくさんありますがスクリプトで処理する理由はファイルの指定などが目的や環境に合わせて柔軟な対応をするためです。
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であること。
前者の場合でもエラーにならず、たぶん配列として関数に引き渡されると思われる。


コメント