PowerShellでJPG画像のリサイズとウォーターマーク画像との合成を同時に行う
指定したフォルダー内(サブフォルダも含む)のJPGファイルを一括で処理します。
# ----- ユーザー指定 ----- ## 変数 # #ターゲットディレクトリ $path = "E:\OneDrive\画像\COOLSCAN3_LS-30" # #MIXする画像は正方形のαありのPNGで透過処理等が済んでいる前提です。 $miximage = "E:\OneDrive\ドキュメント\透かし\WATERMARK.PNG" # #リサイズ値(幅または高さのどちらか一方を指定すると、縦横比率を計算したサイズを決定するようにしてあります。) $width = 360 $height = 0 #リサイズ付加名(リサイズ画像のあるディレクトリ名+$risize_name、画像名+$risize_name+.jpgとなります。) $risize_name = "_RESIZE" # ----- コード部分 ----- ## WSHのShellオブジェクトを生成 $shell=New-Object -Com Shell.Application; ## 指定されたパス配下のJPGファイルを取得(サブフォルダーも含む) $target = Get-ChildItem $path -include *.jpg -exclude *$risize_name.JPG -recurse | Where-Object {-not $_.PSIsContainer} # アセンブリの読み込み(リサイズ) [void][Reflection.Assembly]::LoadWithPartialName("System.Drawing") #[void][reflection.assembly]::LoadWithPartialName("System.Drawing.Imaging") #MIXする画像の読み込み(MIX) $image2 = New-Object System.Drawing.Bitmap($miximage) ## ファイル分だけ繰り返し $target | ForEach-Object { # 画像ファイルの読み込み(リサイズ) $image = New-Object System.Drawing.Bitmap($_.FullName) $resize_Width = 0 $resize_Height = 0 #受け取った引数から、新しいサイズを決定する if ( $width -gt 0 -and $height -eq 0 ) { $resize_Width = $width $resize_Height = $image.Height / ($image.Width / $resize_Width) } elseif ( $height -gt 0 -and $width -eq 0 ) { $resize_Height = $height $resize_Width = $image.Width / ($image.Height / $resize_Height) } elseif ( $width -gt 0 -and $height -gt 0 ) { $resize_Width = $width $resize_Height = $height } else { Write-Host "画像サイズを指定してください" return } # 縮小先のオブジェクトを生成(リサイズ) $canvas = New-Object System.Drawing.Bitmap([int]($resize_Width), [int]($resize_Height)) # 縮小先へ描画(リサイズ) $graphics = [System.Drawing.Graphics]::FromImage($canvas) $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBilinear $graphics.Clear([System.Drawing.Color]::White) $graphics.DrawImage($image, (New-Object System.Drawing.Rectangle(0, 0, $canvas.Width, $canvas.Height))) # MIX処理(リサイズ画像に上からDrawする) $image2_FitSize = @($resize_Width,$resize_Height) | sort #$graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBilinear $graphics.DrawImage($image2, (New-Object System.Drawing.Rectangle([int](($resize_Width - $image2_FitSize[0]) /2) ,[int](($resize_Height - $image2_FitSize[0]) / 2), $image2_FitSize[0], $image2_FitSize[0]))) ## リサイズ画像の保存フォルダーを作成 $savepath = $_.DirectoryName + $risize_name New-Item $savepath -itemType Directory -Force # 保存(リサイズとMIX) $canvas.Save($savepath + "\" + $_.BaseName + $risize_name + ".JPG", [System.Drawing.Imaging.ImageFormat]::Jpeg) # リサイズ合成画像の作成日時にリサイズオリジナル画像の作成日時と更新日時を比較して古い日時を含める $renameFile = $savepath + "\" + $_.BaseName + $risize_name + ".JPG" $timeStamp = @($_.CreationTime,$_.LastWriteTime) | sort Set-ItemProperty $renameFile -Name CreationTime -Value $timeStamp[0] # オブジェクトの破棄(リサイズ) $graphics.Dispose() $canvas.Dispose() $image.Dispose() } # オブジェクトの破棄(MIX) $image2.Dispose() #本スクリプトの参考にしたページ #PowerShell で画像の回転、リサイズを行う #http://qiita.com/miyamiya/items/d1a975fb6618d46eda0c #Powershellでα画像を合成する方法 #http://qiita.com/recomemos/items/528358a1e192aecbc38c #09.画像ファイルをリサイズする #http://hiros-dot.net/PowerShell/myfunction/myfunction09.htm